快速会话:为什么在设置会话信息之前执行redirect?

还有一个“我刚刚开始学习node.js / express,现在我在这里卡住了”人。 我试过寻找答案,但我已经到了死胡同。 这是我的第一个Stackoverflow问题,所以请告诉我,如果我做了错误或非常规的事情。

我正在尝试创build一个POST请求,将一个用户对象保存到一个快速会话(在MongoDB上),并将您redirect到处理会话信息的URL。

问题是,在设置标题之前用户被redirect,并给出以下内容: Error: Can't set headers after they are sent.

这是我的代码。 我知道这是很多..对不起。

router.post()

 // Handler for POST requests from root page (/) router.post('/', function(req, res) { console.log("Router: A POST request for: \"/\" has been called!"); var username = req.body.username; var password = req.body.password; // Connect to database mongoose.connect(dbAddress); var db = mongoose.connection; // Report if error in connection db.on('error', console.error.bind(console, 'Database: Connection error..')); // Callback function on 'open' db.once('open', function() { console.log("Database: Connection successful!"); console.log("Database: User supplied username: " + username); console.log("Database: User supplied password: " + password); // Find User object with a userId of req's username User.findOne({ 'userId' : username.toUpperCase() }, function(err, userObj) { if (err) return console.err(err); // Disconnect when done retrieving user object mongoose.disconnect(); if ( userObj ) { console.log("Database: Returned password from MongoDB:"); console.log(userObj.password); var db_password = userObj.password; if (password === db_password) { console.log("Database: User Authenticated"); // Set 'req.session.user' as cookie req.session.user = userObj; // Redirect to homepage, with new cookie set res.redirect('/'); } else { // If passwords don't match res.render('index', { showError: true }); } } else { // If userObj is null res.render('index', { showError: true }); } }); }); }); 

请注意“req.session.user = userObj”部分。 在这里,我试图在会话中设置“用户”到从MongoDB检索的用户对象。 在下一行中,我将用户redirect到“/”的GET请求处理程序,该处理程序根据会话信息处理用户。

出于某种原因,这些不是按顺序发生的。 GET请求处理程序找不到req.session.user。

我明白node.js是关于asynchronous的,但是从我在网上find的其他例子来看,这应该是可行的。 我在这里错过了什么?

会话保存后,您可以将您的redirect放入callback中,例如:

 ... // Set 'req.session.user' as cookie req.session.user = userObj; req.session.save(function(err) { // session saved res.redirect('/') }) ... 

希望这将确保用户只在会话保存后redirect。

注意:确保你使用Bcrypt或者pbkdf2来破解你的密码