猫鼬发现与高管。如何返回值

时间:2018-06-19 16:17:14

标签: node.js mongodb express mongoose

我是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 **
}

我在做什么错?谢谢你。

2 个答案:

答案 0 :(得分:0)

您不能将承诺与猫鼬中的回调混在一起:

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

关于exec和find之间的区别是什么,请阅读注释部分中的链接,它们非常清楚。

答案 1 :(得分:0)

find()和exec()有两个不同的用途。
find()方法是启用数据库READ操作的功能。它是 既存在于用于节点的本地mongodb驱动程序中,又存在于内部使用mongodb驱动程序的Mongoose库中,并且对于强加固定模式特别有用。
现在,在mongodb驱动程序中,如果您使用find(query),则会自动执行查询,就像在mongoose中一样。我们需要帮助函数/回调来使操作执行。 exec是此类帮助程序功能之一。 它类似于:myPlaylist.findOne({'singer':'Adam Levine'}).exec() 猫鼬查询不是承诺。为了方便起见,它们具有.then()函数。
如果您需要完整的承诺,请使用.exec()函数。

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

注意:exec()具有可选的回调函数。只有在不使用回调的情况下,您才能获得Promise。