【发布时间】: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.user 是 undefined。
只是不知道为什么它可以在开发版本中运行,但不能在生产中运行。鉴于 session.user 状态在浏览器刷新时是正确的,我猜这不是 cookie 中间件配置的问题。好像我还缺少其他东西。任何帮助将不胜感激!
【问题讨论】:
标签: javascript node.js svelte sapper