我正在使用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.user
为undefined
时没有任何反应。
只是不确定为什么要在开发版本上工作,而不能在生产环境下工作。鉴于浏览器刷新时session.user
状态是正确的,我想这与Cookie中间件配置无关。好像我还有其他东西。任何帮助将不胜感激!
答案 0 :(得分:1)
对于开发人员和生产环境,Sapper确实确实以不同的方式处理缓存头。这就是为什么您会以这种方式体验它。
但是通过更改sapper.middleware函数有一个简单的解决方案:
sapper.middleware({
session: (req, res) => {
res.setHeader('cache-control', 'no-cache, no-store')
return { user: req.session.user }
}
})
这将根据需要设置缓存控件。