会话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.findOne
, readAccount
是asynchronous的,在res.redirect()
被调用之前不会完成。
您可以通过将res.redirect()
移入readAccount
callback来确保执行顺序:
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的值。