没有页面重新加载的情况下,生产者构建中的Sapper会话设置不正确

时间:2019-09-19 00:55:31

标签: javascript node.js svelte sapper

我正在使用Sapper进行一个项目,并且现在正在为某些事情而苦苦挣扎–无法完全弄清楚。我正在为服务器使用Polka(sveltejs/sapper-template#rollup模板中包含了波尔卡,因此我使用了它),而会话中间件则使用cookie-session

这是我的Polka配置,在此我也seed session data

polka()
  .use(
    compression({ threshold: 0 }),
    sirv('static', { dev }),
    cookieSession({ 
      name: 'session', 
      keys: [
        '6e818055-d346-4fcb-bf56-4c7d54cb04ab', 
        '60f3e980-6e9c-460d-8ea7-af1fffbdb92f'
      ]
    }),
    sapper.middleware({
      session: (req, res) => ({
        user: req.session.user
      })
    })
  )
  .listen(PORT, err => {
    if (err) console.log('error', err);
  });

用户登录时,实际上是在routes/login.js中进行处理的,并且在session.user上设置了一些配置文件信息和令牌,并且该请求被重定向回了根路径。我正在使用@polka/send-type进行回复。见下文:

req.session.user = { 
  accessToken: access_token,
  name: first_name,
  pic: picture.data.url
};
send(res, 302, '', {
  Location: appUrl
});

那里,我有一个routes/index.svelte的预加载模块,用于检查session.user是否存在,如果存在,则重定向到仪表板:

<script context="module">
  export async function preload(page, session) {
    const { user } = session;

    if (user) {
      return this.redirect(302, "dashboard");
    }
   }
</script>

这一切在dev中都可以正常工作,但是当我npm run build进行构建以进行生产时,效果并不是很好。 session.user中的重定向之后似乎没有填充login.js

我在session中获得的preload对象在登录后未设置session.user,而在注销时,session.user仅设置为null,客户端被重定向到根,session.user仍被填充。

如果刷新浏览器,则session.user处于正确的状态。无需刷新-如果我刚刚注销,则可以像登录时一样单击四周,并且如果我刚刚登录,则session.userundefined时没有任何反应。

只是不确定为什么要在开发版本上工作,而不能在生产环境下工作。鉴于浏览器刷新时session.user状态是正确的,我想这与Cookie中间件配置无关。好像我还有其他东西。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

对于开发人员和生产环境,Sapper确实确实以不同的方式处理缓存头。这就是为什么您会以这种方式体验它。

但是通过更改sapper.middleware函数有一个简单的解决方案:

    sapper.middleware({
      session: (req, res) => {
        res.setHeader('cache-control', 'no-cache, no-store')
        return { user: req.session.user }
      }
    })

这将根据需要设置缓存控件。