填充动态字段 Mongoose

问题描述

我正在尝试创建一个动态函数,该函数获取字段数组、过滤器对象和架构模型,并填充数组中的字段。

例如: 而不是像这样填充-

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)
    }
    })

当我运行这段代码时,我得到了人口字符串,但人口本身并没有真正发生。

(类型错误:无法读取未定义的属性“exec”)

你有没有做这件事或修复我写的代码的想法?

谢谢!

解决方法

你可以这样做

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。也不需要尝试/捕获。