バグなのか仕様なのか分からないですが、express-session
のデータ保存先(sessionStore
)として、データベースやファイルなどI/Oに時間のかかるストアを選んだときに、リダイレクト後のリクエストで未保存のセッションデータを参照してしまうことがあったため解決策の備忘録です。
function beforeRedirect(req, res, next) {
// sessionデータを更新してからにリダイレクトするときにストア保存時の遅延により、
// リダイレクト後の画面で保存前のセッションデータを参照してしまう場合があるため、
// 確実にセッションを保存してからリダイレクトする
const redirect = res.redirect;
res.redirect = function () {
if (req.session) {
req.session.save(() => {
redirect.apply(this, arguments);
});
} else {
redirect.apply(this, arguments);
}
};
next();
}
app.use(beforeRedirect);
経緯
このissue
や他のstackoverflow
では解決方法として、リダイレクト前にsession.save
しましょうねって結論になっていたのですが、全てのrouter
で対応するのはめんどくさいしsave
を忘れそうなので、まとめて設定できるようにしたかったです。