2017-01-24 2 views
0

私はレシピと食材の2つのコレクションを持っています。レシピエントに成分IDを保存できるようにしたい。モンゴースの2つのコレクションからのエントリの作成とリンク

ユーザーがレシピを作成するとき、彼らは、成分の配列を提供します:

その後、
"ingredients": [ 
    { 
     "ingredient": "full cream milk", 
     "quantity": "4 cups (1L)" 
    }, 
    { 
     "ingredient": "elbow macaroni", 
     "quantity": "2 cups" 

    }, 
    { 
     "ingredient": "cheddar cheese", 
     "qualifier": "grated", 
     "quantity": "2 cups" 

    } 
] 

、レシピを保存する前に、我々はこの配列内の各オブジェクトを通過し、で与えられた名前を持つ成分を作成します配合成分が存在しない場合:

if(req.body.ingredients != undefined){ 
    var ingredientsArr = req.body.ingredients; 
    for(i=0;i<ingredientsArr.length;i++){ 
     Ingredient.update({"name":new RegExp(ingredientsArr[i].ingredient,"i")},{$setOnInsert:{"name":ingredientsArr[i].ingredient}},{upsert:true},function(err,ingredients){ 
      if(err){ return next(err) } 
     }) 
    } 
} 

は、今私は何をする必要があるかingredientsArr通過し、対応する_idですべてのingredient:フィールドを置き換えています。

私はfindOne()を使用して_idを見つけることができます。

Ingredient.findOne({"name":new RegExp(ingredientsArr[i].ingredient,"i")},function(err, ingredient){ 
      var id = ingredient._id 
}) 

しかし、私はfindOne()コールバック関数のid外部にアクセスすることができない、と私は内側からingredientsArrにアクセスすることはできませんスコープ問題を抱えています。私はここに何かが分からないと確信していますが、私は私の問題をGoogleにしようとしたときに何の助けも見つけられませんでした。

答えて

1

if (req.body.ingredients != undefined) { 
 
    var ingredientsArr = req.body.ingredients; 
 
    ingredientsArr.forEach((item,i) => { 
 
    Ingredient.findOne({ 
 
     "name": item.ingredient 
 
    }, function(err, ingredient) { 
 
     if (err) { 
 
     return next(err) 
 
     }else{ 
 
     //do you mean this? 
 
     item.ingredient = ingredient._id 
 
     // or ingredientsArr[i].ingredient = ingredient._id ? 
 
     } 
 
    }) 
 
    })

+0

D'OH!右forEach()のようにforループが非同期ではないので、そうですか?魅力のように動作します。 – seport

+1

このデータを使用する場合は、すべてのコールバックが完了するのを待たなければなりません。各コールバックにフラグを立ててチェックインできますが、約束を使用することをお勧めします。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all –

関連する問題