我有两个系列:食谱和配料。我希望能够在配方条目中保存配料ID。
当用户创建食谱时,他们会提供一系列成分:
"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
并将每个ingredient:
字段替换为相应的_id
。
我可以使用_id
找到findOne()
:
Ingredient.findOne({"name":new RegExp(ingredientsArr[i].ingredient,"i")},function(err, ingredient){
var id = ingredient._id
})
但是,我遇到了范围问题,我无法在id
回调函数之外访问findOne()
,而我无法从内部访问ingredientsArr
。我确定我在这里遗漏了一些明显的东西,但当我试图谷歌解决我的问题时,我找不到任何帮助。
答案 0 :(得分: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 ?
}
})
})