首页 > 解决方案 > 猫鼬查找与执行。如何返回值?

问题描述

我是 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.jsmongodbexpressmongoose

解决方案


find() 和 exec() 有两个不同的目的。
find() 方法是一个数据库读取操作启用函数。它存在于 node 的本机 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。


推荐阅读