我有一个中间件功能来检查以确保用户登录每个页面加载
app.use(function(req, res, next) {
if (req.cookies.hasOwnProperty('rememberToken')) {
app.get('db').Users.find({'rememberToken': req.cookies.rememberToken}, function(errFind, resultsFind) {
if (errFind) {
return next();
} else if (resultsFind.length === 0) {
return next();
}
app.locals.isLoggedIn = true;
app.locals.username = resultsFind[0].user_username;
return next();
});
} else if (req.session.hasOwnProperty('isLoggedIn')) {
app.locals.isLoggedIn = true;
app.locals.username = req.session.username;
console.log(app.locals);
return next();
}
return next();
});
唯一的问题是当它正在进行cookie身份验证时我得到了这个错误:
GET / 500 3ms
Error: Can't set headers after they are sent.
我已将其缩小到错误来自
的函数中app.get('db').Users.find({'rememberToken': req.cookies.rememberToken}, function(errFind, resultsFind) {
});
如果我删除此功能,则错误消失,我不确定为什么使用此功能会导致此错误,任何人都可以帮助我。我在routes
app.js
之前有这一系列的中间件
答案 0 :(得分:0)
这是由于node.js的异步性质。在函数的最后一行,您有return next()
将请求传递给下一个中间件。这意味着标题已被发送。
当您包含该函数时,将调用数据库,但服务器会继续运行,以便您的服务器在等待数据库返回您的用户时可以处理其他请求。当您的数据库确实返回数据时,它会在您的回调函数内部执行return next()
。但是在你的情况下next
已被调用,这就是你得到错误的原因。
要解决此问题,请删除最后一行的return next()
。