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にしようとしたときに何の助けも見つけられませんでした。
D'OH!右forEach()のようにforループが非同期ではないので、そうですか?魅力のように動作します。 – seport
このデータを使用する場合は、すべてのコールバックが完了するのを待たなければなりません。各コールバックにフラグを立ててチェックインできますが、約束を使用することをお勧めします。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all –