2016-05-16 9 views
0

Я все еще очень новичок в node.js, массив здесь содержит список идентификаторов. Когда я посылаю ответ от цикла Foreach, я получаю Error: Can't set headers after they are sent. я гугл его, но не смог правильно понятьОшибка: не удается установить заголовки после их отправки из цикла 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 - это перегруженная функция, которую можно вызвать несколькими способами, но любым способом ее использования она будет устанавливать заголовки и отправлять ответ. Подумайте об этом как о многофункциональной функции try-to-be-the-smart-one.

// 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() - это простой способ ответить, без необходимости указывать тип данных, которые вы отправляете. BUT его можно вызвать только один раз. см 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

в 1-ом состоянии вы не отправляете никакого ответа .. следовательно, он будет продолжать его ждать – learner

+0

Да, потому что как только вы получите все данные, вы можете отправить ответ обратно, иначе он пройдет через ту же ошибку. –

 Смежные вопросы

  • Нет связанных вопросов^_^