Javascript 当I';我没有设置任何
我有一个中间件功能来检查,以确保用户在每个页面加载时都像这样登录Javascript 当I';我没有设置任何,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我有一个中间件功能来检查,以确保用户在每个页面加载时都像这样登录 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) {
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) {
});
如果我删除这个函数,错误就会消失,我不知道为什么使用这个函数会导致这个错误,有人能帮我吗。在
app.js
中我的路由
之前有这一行中间件,这是由于node.js的异步性质。在函数的最后一行,有一个return next()
,它将请求传递给下一个中间件。这意味着标头已发送
当您包含该函数时,将调用数据库,但服务器会继续,以便您的服务器可以在等待数据库返回用户时处理其他请求。当数据库返回数据时,它会进入回调函数,尝试执行returnnext()
。但是在您的情况下,已经调用了next
,这就是为什么会出现错误
要解决这个问题,请删除最后一行的
return next()
。你真是个天才!谢谢你,我不敢相信我看多了这个,我在结尾加了一个else,现在又能用了。谢谢