【问题标题】:Mongoose find vs exec. How to return values?猫鼬查找与执行。如何返回值?
【发布时间】:2018-11-28 16:18:48
【问题描述】:

我是 Node 中的新编程人员,我被卡住了,因为我不明白 .find 和 .exec 之间的确切区别。这是我要运行的代码:

exports.getPopulatedUsers = async function(query){
    var res = await users.find(query, function (err, docs) {
       if(err) return err;
       return docs;
   });
    return res; //  **Work fine, res return docs**
}

但是当使用 .exec 执行时,res 是未定义的。

exports.getPopulatedUsers = async function(query){
    var res = await users.find(query).exec(function (err, docs) {
       if(err) return err;
       return docs;
   });
    return res; //  **ERROR, res is undefined **
}

我做错了什么?

【问题讨论】:

标签: node.js mongodb express mongoose


【解决方案1】:

你不能在 mongoose 中混用 promise 和回调:

exports.getPopulatedUsers = async function(query){
    var docs = await users.find(query).exec();
    return docs;
}

至于exec和find有什么区别,看评论区的链接就很清楚了。

【讨论】:

  • 你会处理.then() .catch() 的错误吗?
  • 正如 OP 明确询问有什么区别并且您没有提供此答案(本质上是说“去看看文档”),我认为这不是一个好的答案。请编辑两者之间的差异。
【解决方案2】:

find() 和 exec() 有两个不同的用途。
find() 方法是一个数据库读取操作启用函数。它是 存在于节点的本机 mongodb 驱动程序以及内部使用 mongodb 驱动程序的 Mongoose 库中,对于实施固定模式特别有用。
现在,在 mongodb 驱动程序中,如果您使用 find(query),查询会自动执行,而在 mongoose 中则不会。我们需要辅助函数/回调来执行操作。 exec 就是这样一种辅助函数。 它类似于:myPlaylist.findOne({'singer':'Adam Levine'}).exec() Mongoose 查询不是承诺。为方便起见,它们有一个 .then() 函数。
如果您需要一个成熟的承诺,请使用 .exec() 函数。

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

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

【讨论】:

  • 所以为了得到成熟的承诺,我会做myPlaylist.findOne({'singer':'Adam Levine'}).exec().then(...) ? 或者我必须使用 bluebird 库? @sushmita-mallick
  • 是的,如果你这样做,它将返回一个完全成熟的承诺@O'DaneBrissett
  • 是否需要使用 aync/await?
猜你喜欢
  • 2019-09-29
  • 2018-03-07
  • 2018-10-14
  • 2015-09-25
  • 2020-02-28
  • 2021-02-12
  • 2020-12-16
  • 2012-09-30
  • 2019-02-17
相关资源
最近更新 更多