Node.js express会话和Passport.js之间的竞争条件

Node.js express会话和Passport.js之间的竞争条件,node.js,express,passport.js,race-condition,express-session,Node.js,Express,Passport.js,Race Condition,Express Session,我试图在使用express会话和express mysql会话时实现passport.js的本地策略。一切正常,但有时在尝试从浏览器登录后,页面会一直挂起,直到我手动点击刷新。点击“刷新”后,应用程序将重定向到用户路径,并且用户已正确登录,因此它可以正常工作,但我必须手动刷新页面 在寻找解决方案后,我发现了问题所在:express会话模块和Passport之间存在竞争条件。显然,它是在会话存储在数据库中时发生的。Passport不会等待,有时重定向会在它应该等待之前执行,因此浏览器只是挂起 我在

我试图在使用express会话和express mysql会话时实现passport.js的本地策略。一切正常,但有时在尝试从浏览器登录后,页面会一直挂起,直到我手动点击刷新。点击“刷新”后,应用程序将重定向到用户路径,并且用户已正确登录,因此它可以正常工作,但我必须手动刷新页面

在寻找解决方案后,我发现了问题所在:express会话模块和Passport之间存在竞争条件。显然,它是在会话存储在数据库中时发生的。Passport不会等待,有时重定向会在它应该等待之前执行,因此浏览器只是挂起

我在这里找到了一个解决方案/解决方法,但仍然会遇到同样的错误。即使我使用req.session.save(cb)并在回调中调用重定向,竞争条件也会发生。最令人沮丧的是,比赛情况可能发生了二十次中的一次,所以我必须登录很多次,看看问题是否仍然存在

这是我的代码:

app.use(
    session({
        secret: process.env.SECRET_KEY,
        store: sessionStore,
        resave: false,
        saveUninitialized: false,
        cookie: {
          maxAge: 24 * 60 * 60 * 1000, // 24 hours
        },
    })
);

passport.use(new LocalStrategy( {
    usernameField: 'username_login',
    passwordField: 'user_password_login'
  },
  function(username, password, cb) {
      
      connection.query("SELECT * FROM users WHERE username = ? AND user_password = ?", [username, password], function(err, results) {
        if(err) {
          return cb(err);
        }
        // User doesn’t exist
        if(!results.length) {
          return cb(null, false);
        }

        // Wrong password
        if(results[0].user_password != password) {
          return cb(null, false);
        }

        // Correct username
        return cb(null, results[0]);
      })
}));

passport.serializeUser(function(user, cb) {
  cb(null, user.user_id);
});

passport.deserializeUser(function(id, cb) {
  connection.query("SELECT * FROM users WHERE user_id = ?", [id], function(err, results) {
    if(err) {
      return cb(err);
    }

    cb(null, results[0]);
  })
});

app.use(passport.initialize());
app.use(passport.session());

app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
      if (err || !user) { 
        console.log('Algun error');
        return res.redirect('/login');
      }
      // This is where the problem happens
      req.login(user, function() {
        // Manually save session before redirect. See bug https://github.com/expressjs/session/pull/69
        req.session.save(function(){
          res.redirect('/user');
        });
      });
  })(req, res, next)
});

我做错了什么