1

我正在使用 Sapper 进行一个项目,现在一直在努力解决一些问题 - 不太清楚。我将 Polka 用于我的服务器(它包含在sveltejs/sapper-template#rollup模板中,所以我使用它)和cookie-session我的会话中间件。

这是我的 Polka 配置,我也在其中播种会话数据

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>

这一切在开发中都可以正常工作,但是当我npm run build为生产而构建时,它就不那么好了。似乎session.user在重定向后没有填充login.js.

我进入的session对象在登录后preload没有session.user设置,反之亦然,在注销时session.user简单地设置为 null 并且客户端被重定向到根,session.user仍然填充。

如果我刷新浏览器,session.user是在正确的状态。无需刷新 - 如果我刚刚注销,我可以像登录一样单击周围,如果我刚刚登录,则不会发生任何session.user事情undefined

只是不确定为什么它可以在开发版本上工作,但不能在生产中工作。鉴于session.user浏览器刷新时状态是正确的,我猜这不是 cookie 中间件配置的问题。好像我还缺少其他东西。任何帮助将不胜感激!

4

1 回答 1

1

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

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

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

这会根据需要设置缓存控制。

于 2020-02-14T08:15:43.980 回答