2016-05-16 3 views
0

まだnode.jsが新しく、ここの配列はIDのリストで構成されています。私は、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は、複数の方法で呼び出すことができるオーバーロードされた関数ですが、それを使用する方法は、ヘッダーを設定し、応答を送信します。それをオールインワンのように考え、スマート1の機能を試してみてください。

// 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これは1回だけ呼び出すことができます。 これはres.send()メソッドが終了する方法ですexpress docs

を参照してください - 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

はい、すべてのデータを取得すると、応答を返すことができます。それ以外の場合は、同じエラーが発生します。 –

関連する問題