会话variables不存储在node.js中

我search并发现很多类似的问题,会话variables被设置为undefined,但没有一个我发现的答案似乎适用。

我在我的路由器文件中有这个function:

exports.loginHandler = function(req, res){ username = req.body.username; password = req.body.password; readAccount(username, function(acct){ if (acct.password = password){ req.session.username = username; console.log(username+' logged in'+' pass: '+acct.password); }; }); res.redirect('/'); }; 

console.log执行得很好,username和acct.password都有相应的值。 但是,req.session.username最终会被设置为undefined。

这是readAccount函数:

 readAccount = function(user, callback){ AM.login(user, function(acct){ callback(acct); }); }; 

这里是AM.login:

 exports.login = function(user, callback){ accounts.findOne({username: user}, function(err, result){ if (err) throw err; callback(result); }) } 

我猜会议variables不能在条件下设置,因为这种types的错误似乎并不less见。

问题在于,在您设置session.username属性之前,您正在redirect,这会结束响应并保存会话。 这是因为通过accounts.findOnereadAccount是asynchronous的,在res.redirect()被调用之前不会完成。

您可以通过将res.redirect()移入readAccountcallback来确保执行顺序:

 exports.loginHandler = function(req, res){ username = req.body.username; password = req.body.password; readAccount(username, function(acct){ if (acct.password = password){ req.session.username = username; console.log(username+' logged in'+' pass: '+acct.password); }; res.redirect('/'); }); }; 

另外,要小心asynchronous操作中throw的错误。 callback将有一个不同于起始函数(例如readAccount )的调用堆栈,这使得catch错误变得困难。 这就是为什么Node的许多API将错误作为parameter passing的原因。

其简单易行的方法是在发送回应前写下行。

res.locals.session = req.session;

你的会话将保存该variables的值。