问题描述
我正在尝试创建一个动态函数,该函数获取字段数组、过滤器对象和架构模型,并填充数组中的字段。
例如: 而不是像这样填充-
getCardByName=(Model,filter)=>{
return new Promise((resolve,reject) => {
Model.findOne(filter).populate({ path: "user" })
.populate({ path: "socialMedia" })
.populate({ path: 'galleryList' })
.populate({ path: 'reviewsList' })
.populate({ path: 'lead' })
.populate({ path: 'statistic',})
.exec(async(err,card) => {
if (err) {
reject(err);
}
resolve(card)
})
});
}
//assume arr is a function argument
arr=["user","socialMedia","galleryList","reviewsList","lead","statistic"]
let populateStr=""
arr.forEach(path => {
populateStr+=`.populate({path: ${path}})`
});
console.log(populateStr)
return new Promise(async(resolve,reject)=>{
try{
await Model.findOne(filter).populateStr
.exec(async(err,card)=>{
if(err)
{
reject(err)
resolve(card)
}
})
}
catch(err){
console.log(err)
}
})
当我运行这段代码时,我得到了人口字符串,但人口本身并没有真正发生。
你有没有做这件事或修复我写的代码的想法?
谢谢!
解决方法
你可以这样做
var query = Model.findOne(filter);
arr.forEach(path => {
query.populate(path);
});
query.exec(async (err,card) => {
if (err)
reject(err)
else
resolve(card)
});
当您在 exec 回调函数中使用 resolve/reject 时,没有理由为 Model.findOne
使用 await。也不需要尝试/捕获。