错误:从forEach循环发送后无法设置标头

问题描述:

我对node.js仍然很陌​​生,这里的数组包含一个id列表。当我把从foreach循环的反应,我越来越Error: Can't set headers after they are sent.我GOOGLE了它,但不能正确理解错误:从forEach循环发送后无法设置标头

array.forEach(function(data) { 
      db.collection.find({ 
       _id: mongoskin.helper.toObjectID(data) 
      }).toArray(function(err, data1) { 
       if (err) return next(err); 
       console.log(data1); 
       res.send(data1); 
      }) 
     }) 
+0

检查出这个http://*.com/questions/7042340/node-js-error-cant-set-headers-after-they-are-sent – vineet

由于环路的,你的代码是调用res.send多次;你不能这样做

res.send是一个重载的函数,可以用多种方式调用,但任何你使用它的方式,它将设置标题和发送响应。把它想成一个全功能于一身的,试图成为智能的功能。

// not actual source code! 
// just imagine res.send kinda like this 
function send(body, headers, status) { 
    res.setHeaders(headers); 
    res.statusCode = status; 
    res.write(body); 
    res.end(); 
} 

然而,如果你想要写一个响应分段,使用res.write方法来代替。完成后,您必须致电res.end

res.setHeader(myHeaders); 
myArray.forEach(
    //... 
    res.write(something); 
); 
res.end(); 

这种情况发生时res.end()叫做更多然后一次。 res.send()方法是一种简单的响应方式,无需指定要发送的数据类型但是它只能被调用一次。 看到express docs

这是res.send()方法是如何结束 - express source

// respond 
    this.end(head ? null : body); 
    return this; 

使用此代码,

var index = 0; 
var object = [] // empty array 
function find(){ 
    if(array.length -1 >=index){ 
     var data = array[index] ; 
      db.collection.find({ 
       _id: mongoskin.helper.toObjectID(data) 
      }).toArray(function(err, data1) { 
       if (err) return next(err); 
       console.log(data1); 
      object.push(data1); 
       //res.send(data1); 
      index++; 
      find(); 
      }) 

    }else{ 
     res.send(object); 
    } 
} 

在你的情况,你发送的响应数据,但你的阵列仍在处理。所以一旦你的回复发送,你不能再次发送。

+0

在第一个条件你没有发送任何回应..因此它会一直等待它 – learner

+0

是的,因为一旦你将获得所有的数据,你可以发回响应,否则它会通过相同的错误。 –