0
0

More than 1 year has passed since last update.

【Express.js】リダイレクト時に未保存のセッションデータを確実に保存する

Posted at

バグなのか仕様なのか分からないですが、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を忘れそうなので、まとめて設定できるようにしたかったです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0