Node.js express会话和Passport.js之间的竞争条件
我试图在使用express会话和express mysql会话时实现passport.js的本地策略。一切正常,但有时在尝试从浏览器登录后,页面会一直挂起,直到我手动点击刷新。点击“刷新”后,应用程序将重定向到用户路径,并且用户已正确登录,因此它可以正常工作,但我必须手动刷新页面 在寻找解决方案后,我发现了问题所在:express会话模块和Passport之间存在竞争条件。显然,它是在会话存储在数据库中时发生的。Passport不会等待,有时重定向会在它应该等待之前执行,因此浏览器只是挂起 我在这里找到了一个解决方案/解决方法,但仍然会遇到同样的错误。即使我使用req.session.save(cb)并在回调中调用重定向,竞争条件也会发生。最令人沮丧的是,比赛情况可能发生了二十次中的一次,所以我必须登录很多次,看看问题是否仍然存在 这是我的代码: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不会等待,有时重定向会在它应该等待之前执行,因此浏览器只是挂起 我在
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)
});
我做错了什么