还有一个“我刚刚开始学习 node.js/express,现在我卡住了”的人在这里。我试过到处寻找答案,但我走到了死胡同。这是我的第一个 Stackoverflow 问题,所以如果我做错了什么或非常规,请告诉我。
我正在尝试创建一个 POST 请求,将用户对象保存到快速会话(在 MongoDB 上),并将您重定向到处理会话信息的 URL。
问题是,用户在设置标头之前被重定向,我得到以下信息:
Error: Can't set headers after they are sent.
这是我的代码。我知道这很多..对不起。
路由器.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 检索到的用户对象。在下一行中,我将用户重定向回“/”的 GET 请求处理程序,该处理程序根据会话信息处理用户。
出于某种原因,这些并没有按顺序发生。GET 请求处理程序找不到 req.session.user。
我知道 node.js 都是关于异步的,但是从我在网上找到的其他示例来看,这应该可以工作。我在这里想念什么?