“错误:无法在带有节点的Express应用程序中设置标题后”

时间:2016-10-18 02:25:05

标签: node.js express advanced-rest-client

我是Express和Node的新手,在使用Advanced REST Client在我的应用中测试受保护的REST端点时,数据会按预期从端点返回到客户端,但控制台会记录

"Error: Can't set headers after they are sent"

停止服务器。在SO上搜索,这似乎在发送多个响应时发生,但我在我的代码中没有看到:

router.get('/books', userAuthenticated, function (req, res, next) {
   Book.find({}, function(err, docs){
       if(err) {
           res.send(err)
       } else {
            res.send(docs);
           // next();
           // return;
       }
   })  
});

在向客户端发送请求/响应时是否会出现此错误,或者在处理服务器上的错误时是否遗漏了某些内容?

2 个答案:

答案 0 :(得分:0)

Express是一个node.js服务器,它具有一个名为“中间件”的概念,其中多层代码有机会对请求进行操作。

在这种情况下,您不仅需要检查您的功能是否未发送两次响应,而且还必须检查其他中间件是否也没有发回响应。

在您的情况下,代码表示在此函数之前调用名为“userAuthenticated”的中间件。您应该检查该中间件是否已经发送了响应。

答案 1 :(得分:0)

I don't think the problem was in the middleware. It looks like I was calling done() twice in passport deserialize. I commented out the first instance and the problem disappeared in all my routes. Although, I am not sure if I should comment out the first or second instance but I'll work on that next.
passport.deserializeUser(function(obj, done) {
    console.log(obj);
    Account.findById(obj, function(err, user) {
      console.log(user);
      //done(err, user);
    });
return done(null, obj);
});