node.js - 猫鼬查找与执行。如何返回值?
问题描述
我是 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 **
}
我究竟做错了什么?
解决方案
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。
推荐阅读
- flutter - 如何在 FutureBuilder() 中正确“刷新”小部件
- abap - 使用 where 修改 itab 字段
- javascript - 在 javascript 中使用 jest 在 Azure Function 上下文中模拟不同的日志级别
- jogetworkflow - JOGET - 通过 Datalist 更新表单字段
- amazon-web-services - Amazon Kinesis 在使用 Maven 编译的 Flink 作业中找不到主类
- grafana - 如何在grafana中获取Legend面板的数据,例如变量的min,max,avg?
- c# - 将具有动态数据的多个对象推送到 DTO 中并返回
- cordova-plugins - 如何从手机上传文件并将其作为 FormData Ionic 4 发送
- python - Python,累积“itertools.accumulate”对象不支持项目分配错误
- python - 是否有一个函数来计算返回一维数组结果的 numpy ndarray 元素的总和?