如何承诺 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

Mongoose/Mongo:更新不保存

Node.js/Mongoose 上的“版本错误:未找到匹配的文档”错误

Mongo/Mongoose 快速更新导致数据丢失

Mongo/Mongoose 中的复杂约束

在 Express 中哪里可以找到 Mongo Collection?