NodeJS当我没有设置任何标题时,无法设置标题错误

时间:2014-09-17 23:06:33

标签: 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) {
        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之前有这一系列的中间件

1 个答案:

答案 0 :(得分:0)

这是由于node.js的异步性质。在函数的最后一行,您有return next()将请求传递给下一个中间件。这意味着标题已被发送。

当您包含该函数时,将调用数据库,但服务器会继续运行,以便您的服务器在等待数据库返回您的用户时可以处理其他请求。当您的数据库确实返回数据时,它会在您的回调函数内部执行return next()。但是在你的情况下next已被调用,这就是你得到错误的原因。

要解决此问题,请删除最后一行的return next()