【问题标题】:Sapper session not setting properly in production build without page reload在没有页面重新加载的情况下,Sapper 会话在生产构建中没有正确设置
【发布时间】:2023-03-09 16:57:01
【问题描述】:

我正在使用 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>

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

我在preload 中获得的session 对象在登录后没有设置session.user,反之亦然,在注销时session.user 被简单地设置为null,并且客户端被重定向到root,@ 987654340@ 仍处于填充状态。

如果我刷新浏览器,session.user 处于正确状态。无需刷新 - 如果我刚刚注销,我可以像登录一样点击周围,如果我刚刚登录,则不会发生任何事情,因为 session.userundefined

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

【问题讨论】:

    标签: javascript node.js svelte sapper


    【解决方案1】:

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

    但是有一个简单的解决办法,就是改变 sapper.middleware 函数:

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      相关资源
      最近更新 更多