如何承诺 Mongo/Mongoose 找到
Posted
技术标签:
【中文标题】如何承诺 Mongo/Mongoose 找到【英文标题】:How to promisify Mongo/Mongoose find 【发布时间】:2020-09-16 05:03:22 【问题描述】:作为另一个问题的一部分,我试图承诺一个 mongo/mongoose 查找查询。我通过搜索栏找到的帮助很少。查询如下,我将此查询作为快速控制器的一部分运行。设置是 route -> userController.monitor 需要包含查询
在获得其他问题的帮助时,我被要求 promisify find so that you can use await for it (like const incidents = Incident.find(fooID).exec();
尽管 SO 搜索和我自己承诺它的尝试都失败了。
查询:
Incident.find(fooID)
.exec((err, incidents) =>
// do something
)
注意在这种情况下 findOne 将不起作用,因为几乎所有时间都会返回多个文档
编辑
Incident.find( monitorID, createdAt: $gte: SevenAgo )
【问题讨论】:
如果没有通过回调,猫鼬不是已经返回承诺,所以const incidents = Incident.find(fooID).exec();
真的可以工作吗?
否则你没找到How do I convert an existing callback API to promises?
哦,对不起,我又忘了在我想要的地方拼写await
。当然应该是const incidents = await Incident.find(fooID).exec();
。
@Bergi 这个问题是为了响应您在我的另一个问题中的请求而发布的。你建议怎么做是我之前已经掌握的。
【参考方案1】:
您可以使用 node.js 的 util
模块中的 promisify
函数创建 find 函数的承诺版本
const promisify = require('util')
const promisifiedIncidentFindExec = payload =>
const query = Incident.find(payload)
return promisify(query.exec).call(query)
const incidents = await promisifiedIncidentFindExec(
monitorID: 'monitorID',
createdAt: $gte: 'sevenAgo' ,
)
// do something
【讨论】:
我看到你在几个地方使用fooID
,我看到了第一个并把它作为输入?第二个是搜索参数,第三个是传入搜索参数?在尝试你的答案UnhandledPromiseRejectionWarning: CastError: Cast to string failed for value " fooID: '5eaa08fb4ed2aaa044efa043' " at path "fooID" for model "Incident"
时也会得到这个但是当我console.log(typeof fooID)
我回来string
所以它显示为对象/不是字符串应该没有问题
嗯,也许试试const query = Incident.find(fooID)
?所以只需在其中传递字符串
我的实际查询不仅仅是fooID
,所以我将完整的查询参数添加到 OP 以显示,仅添加一件事并没有太大区别
你应该使用return promisify(query.exec).call(query)
来使用promisify
的缓存
与.bind(query)()
相同,但无需创建另一个函数 :-)以上是关于如何承诺 Mongo/Mongoose 找到的主要内容,如果未能解决你的问题,请参考以下文章
如何从服务器端 express/mongo/mongoose 中的 URL,客户端的 axios/react/redux 中获取参数 ID