【问题标题】:Why does mongoose.exec() not contain data from the query为什么 mongoose.exec() 不包含来自查询的数据
【发布时间】:2022-02-10 11:54:11
【问题描述】:

我真的很困惑这里发生了什么:

当我使用以下代码时,我得到了预期的产品

  const newProd = await models.Product.findOne({_id: new Buffer(util.HexUUIDToBase64(newProductData._id), 'base64').toString('hex')})
    .populate({
      path: 'SellerID',
      populate: { path: 'UserID' }})
      console.log(newProd)

但是,当我使用此代码时,我的产品一无所获:

 const newProd = await models.Product.findOne({_id: new Buffer(util.HexUUIDToBase64(newProductData._id), 'base64').toString('hex')})
    .populate({
      path: 'SellerID',
      populate: { path: 'UserID' }}).exec(function (err, product) {
        console.log(err)
        console.log(product)
      })
      console.log(newProd)

我希望我的产品能够传递给回调,但事实并非如此。这里到底发生了什么,我该如何解决?

【问题讨论】:

    标签: javascript node.js database mongodb mongoose


    【解决方案1】:

    find() 和 exec() 有两个不同的用途。

    find() 方法是一个数据库读取操作启用函数。它存在于 node 的本机 mongodb 驱动程序以及内部使用 mongodb 驱动程序的 Mongoose 库中,对于强制实施固定模式特别有用。

    现在,在 mongodb 驱动程序中,如果您使用 find(query),查询会自动执行,而在 mongoose 中则不会。我们需要辅助函数/回调来执行操作。 exec 就是这样一种辅助函数。它类似于: myPlaylist.findOne({'singer':'Adam Levine'}).exec()

    Mongoose 查询不是承诺。为了方便,它们有一个 .then() 函数。

    如果您需要一个成熟的 Promise,请使用 .exec() 函数。

    因此,您可以执行 myPlaylist.findOne({'singer':'Adam Levine'}).then() 但这将返回 Mongoose/BlueBird(又一个库)承诺和典型的 JavaScript 承诺。

    注意:exec() 采用可选的回调函数。只有当你不使用回调时,你才会返回一个 Promise。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      相关资源
      最近更新 更多