2017-02-28 14 views
0

forEachは配列asyncで使用しますか?キャンディーはキャンディーオブジェクトの配列です。コンソールでNode.jsのArray.forEachは非同期ですか?

app.get('/api/:id',function(req, res){ 

    console.log("Get candy"); 
    var id = req.params.id; 

    candies.forEach(function(candy, index){ 
    if(candy.id == id){ 
     console.log("Candy found. Before return"); 
     return res.json(candy); 
     console.log("Candy found. After return"); 
    } 
    }); 

    console.log("Print error message"); 
    return res.json({error: "Candy not found"}); 
}); 

私は

[nodemon] starting `node app.js` 
listning on port 3000 
Get candy 
Candy found. Before return 
Print error message 
Error: Can't set headers after they are sent. 
    at ServerResponse.setHeader (_http_outgoing.js:367:11) 
    .... 

を取得し、これは最近の変更ですか?

+3

なぜあなたは 'return'の後にコードを持っていますか? – Thilo

+0

もしそれが非同期だったら、 'Print error message'が最初に記録されます。なぜそれは非同期でしょうか?また、Thiloは正しく述べています - 'return'ステートメントの後のコードのポイントは何ですか?それは決して実行されません。 – Mjh

+1

また、内部関数の 'return'は、内部関数を終了するだけで、内部関数は終了しません。 – Thilo

答えて

1

Can't set headers after they are sent.の例外が返されるのは、candies.forEachの中で2回、ルートの最後の行に2回(おそらく)応答を返そうとしているためです。また、returnの後のコードは実行されません。ここで

は、あなたがエラーを回避するためにそれを書き換える方法です -

app.get('/api/:id',function(req, res){ 

    console.log("Get candy"); 
    var id = req.params.id; 
    var foundCandy = false; 
    candies.forEach(function(candy, index){ 
     if(candy.id == id){ 
      foundCandy = true; 
      console.log("Candy found. Before return"); 
     } 
    }); 

    if (foundCandy) { 
     return res.json(candy); 
    } else { 
     return res.json({error: "Candy not found"}); 
    } 
}); 
+0

@Jens @Vladuのように 'Array.filter'を使うIonutのレスポンス[here](http://stackoverflow.com/a/42504948/398713)は、よりクリーンで簡潔なコードにもなります。 – GPX

+0

ありがとう!私はそれを解決する方法を知っています。なぜ私はこの動作を得ているのか不思議です。 res.json(キャンディー)とres.json({エラー:「キャンディーが見つかりません」});ゲット!それは私にとっては論理的ではないと思われます。 – Jens

+0

それを入手しました。@Thiloの返信を参照してください。 – Jens

1

あなたはお菓子を見つけるためにArray.filterを使用することができます。

app.get('/api/:id', function(req, res) { 

    console.log("Get candy"); 
    var id = req.params.id; 

    var result = candies.filter(candy => candy.id == id); 

    if (result.length) { 
    return res.json(result[0]); 
    } else { 
    console.log("Print error message"); 
    return res.json({ 
     error: "Candy not found" 
    }); 
    } 
}); 
+0

"return res.json(candy);" forEach引数で定義された内部関数からのみ戻されますが、関数全体からは戻りません。 両方の応答が呼び出されます。 – Jens

関連する問題