猫鼬找到vs exec。如何返回值

问题描述 投票:0回答:2

我是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
2个回答
0
投票

你不能将承诺与mongoose中的回调混合:

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

至于exec和find之间有什么区别,请阅读评论部分中的链接,他们非常清楚。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.