2016-05-16 58 views
0

我對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://stackoverflow.com/questions/7042340/node-js-error-cant-set-headers-after-they-are-sent – vineet

回答

2

由於環路的,你的代碼是調用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(); 
0

這種情況發生時res.end()叫做更多然後一次。 res.send()方法是一種簡單的響應方式,無需指定要發送的數據類型但是它只能被調用一次。 看到express docs

這是res.send()方法是如何結束 - express source

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

使用此代碼,

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

是的,因爲一旦你將獲得所有的數據,你可以發回響應,否則它會通過相同的錯誤。 –

相關問題