【问题标题】:Why is mongoose find method not async?为什么猫鼬查找方法不是异步的?
【发布时间】:2020-08-30 03:13:54
【问题描述】:

带有承诺的旧代码

我有一些使用猫鼬的旧代码。它从数据库中获取一些信息。 AccountViewPermission 是一个模式。都好。我正在使用.then 访问它,这使它的行为类似于 Promise。

AccountViewPermission.find({ requested_by: request.body.credentials.character.id})
.then( permissions => {
  response.status(200).json(permissions)
})

文档提到等待功能

根据the documentation,我应该也可以使用asyn/await:

Mongoose 查询不是承诺。为了方便起见,它们有一个用于 co 和 async/await 的 .then() 函数。但是,与 promise 不同的是,调用查询的 .then() 可以多次执行查询。

但是使用 await 会引发错误

所以我开始用 await 而不是(想要的)承诺来编写这段代码。

const permissions = await AccountViewPermission.find({ requested_by: request.body.credentials.character.id})
response.status(200).json(permissions)

但是现在 node.js 给我一个错误:SyntaxError: await is only valid in async function。这是真的,但文档说猫鼬应该仍然能够使用await

在这种情况下如何使用 await 语法?

【问题讨论】:

  • 那么您在错误消息中得到了答案。您必须将逻辑包装在异步函数中。检查我的答案。

标签: javascript node.js mongoose async-await


【解决方案1】:

如官方文档中所述"The await operator is used to wait for a Promise. It can only be used inside an async function." 文档:await-operator

Mongoose 无法改变 javascript 处理 async / await 关键字的方式。如果您需要后续信息,请查看文档。

要使您的代码正常工作,您必须将其包装在异步函数中。没有办法解决这个问题。

async function doSomething() {
  const permissions = await AccountViewPermission.find({
    requested_by: request.body.credentials.character.id
  })
  response.status(200).json(permissions)
}

【讨论】:

  • 我的错误理解是被调用的find方法应该是async。但是 await 必须在 async 标记的函数中。也许这种见解对其他人来说也是一个陷阱,因此发表了这条评论。
猜你喜欢
  • 2018-02-27
  • 2020-08-01
  • 2020-02-28
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多