【问题标题】:how to return an object form the mongodb resultant while in asyn calls在异步调用中如何从 mongodb 结果返回对象
【发布时间】:2018-01-14 17:04:42
【问题描述】:

虽然我在项目中使用了 Promise,但我没有得到完美的结果,有时 getSubCats 函数返回空对象,有时该函数返回 subCategories 的结果

我尝试了什么

exports.getCatsVthSubcats = function (req, res) {
  var catsArray = [];

  Category.find({active:true}).exec(function (err, cats) {
    if (err) {
      console.log("Error  : " + JSON.stringify(err))
    } else {
      for (var i = 0; i < cats.length; i++) {
        var catId = cats[i].catId;
        catsArray.push(getSubCats(catId));
      }
      Promise.all(catsArray).then(results => {
        console.log("REULT : " + JSON.stringify(results))
      })

    }
  })
}

function getSubCats(catId) {

  return SubCats.find({
    catId: catId,
    active: true
  }).exec(function (err, subCategories) {
      var obj = {
        catId: catId,
        subcats: subCategories
      }
      return obj;   
  })
}

我得到了什么结果

console.log(catsArray )
    [ 
      [
       {
         category : "vegitarian",
         rank : 23
       },
       {
         category : "Non-vegitarian",
         rank : 2
       }
      ],
      [],  // some times getSubCats function returning empty array
      [
       {
         category : "appetizers",
         rank : 3
       },
       {
         category : "nonveg-appitizers",
         rank : 52
       }
      ]

    ]

我想要什么

 console.log(catsArray )
        [ 
          { catId : Vegitarian,
           subcat :[
                    {
                      category : "vegitarian",
                      rank : 23
                    },
                    {
                     category : "Non-vegitarian",
                     rank : 2
                    }
                  ]
            },
            { catId : "Non-vegetarian",
              subcats :[
                        {
                         category : "appetizers",
                         rank : 3
                        },
                        {
                         category : "nonveg-appitizers",
                         rank : 52
                        }
                      ]
               }

        ]

提前致谢

【问题讨论】:

    标签: node.js mongodb callback promise


    【解决方案1】:

    您会得到这个结果,因为您使用 Model.find(返回一个对象数组),而您需要使用 Model.findOne(返回单个元素或 null)。

    除此之外,您的代码还可以简化。你不应该混合回调风格和承诺:

    exports.getCatsVthSubcats = (req, res) => {
      Category
        .find({ active: true })
        .then(cats => {
            let catIds = cats.map(cat => cat.catId);
            return Promise.all(catIds);
        })
        .then(results => console.log("REULT : " + JSON.stringify(results)))
        .catch(err => console.log("Error  : " + JSON.stringify(err)));
    }
    
    function getSubCats(catId) {
      return SubCats
          .find({
            catId: catId,
            active: true
          })
          .then(subcats => {
              var obj = {
                catId: catId,
                subcats
              }
              return obj;   
          });
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2020-03-15
      • 2020-08-14
      • 2022-12-22
      • 2018-01-17
      • 1970-01-01
      • 2017-07-02
      • 2018-09-01
      • 2019-09-30
      相关资源
      最近更新 更多