私は 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 ミドルウェアの構成に問題はないと思います。私は何か他のものを見逃しているようです。どんな助けでも大歓迎です!