wait 仅在异步函数中有效 - 使用 mongoosejs exec() 时

2024-03-06

我正在将 Hapi 项目移植到 v17,并在迁移到 async/await 时遇到 Mongoose 的一些问题。

对于我的任何在模型(猫鼬)上使用“等待”的代码,对象例如:

const result = await User.findOne({email: email}).exec();

运行“node server.js”时出现以下异常

            await User.findOne({}).exec();
        ^^^^^

SyntaxError: await is only valid in async function
at new Script (vm.js:74:7)
at createScript (vm.js:246:10)
at Object.runInThisContext (vm.js:298:10)
at Module._compile (internal/modules/cjs/loader.js:670:28)
at Object.Module._extensions..js 
(internal/modules/cjs/loader.js:713:10)
at Module.load (internal/modules/cjs/loader.js:612:32)
at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
at Function.Module._load (internal/modules/cjs/loader.js:543:3)
at Module.require (internal/modules/cjs/loader.js:650:17)
at require (internal/modules/cjs/helpers.js:20:18)

我正在运行节点 v10.2.0 和 mongoose 5.1.2,无法理解为什么会收到错误。

mongoosejs 文档明确指出,当使用 async/await 时,应该使用 exec() 返回承诺here http://mongoosejs.com/docs/promises.html

有什么建议么?


await只能在用 声明的函数内部使用async关键词。

async function doSomething() {
    let result = await someMongoooseFunctionThatReturnsAPromise();
    // use result here
}

await不能在外部使用async功能。这就是你的错误告诉你的,它与猫鼬完全无关。它与调用 mongoose 函数的代码结构有关。

NOTE:任何 Node.js 事件驱动代码都已在函数内,因此可以使用await在该函数中,您所要做的就是添加async包含函数定义的关键字。如果该函数的调用者不期望任何返回结果,则不需要进一步的更改。如果该函数的调用者期望返回结果,那么您必须调整调用代码以期望从async声明的函数。


还值得理解的是async函数总是返回一个承诺。虽然您可以像常规顺序代码一样编写它:

async function doSomething() {
    let result = await someMongoooseFunctionThatReturnsAPromise();
    // use result here
    result++;
    return result;
}

该函数实际上返回一个 Promise,该 Promise 的解析值将是该函数的返回值。所以,当您使用async像这样的函数,你必须使用返回的承诺:

 doSomething().then(finalResult => {
     console.log(finalResult);
 });

因此,在您的特定代码中,如果您要使用await,它需要位于async功能:

async function someFunc() {
    const result = await User.findOne({email: email}).exec();
    // now this will work and you can use result here
}

或者,您可以使用.then()反而:

User.findOne({email: email}).exec().then(result => {
    // process result here
    // continue with other code that uses result here
});

注意:使用时要处理错误async/await,你有两个选择:

  1. 您可以使用传统的try/catch任何里面async声明的函数和try/catch将捕获任何被拒绝的承诺await.

  2. 如果你不使用 try/catch 和await在你的函数中拒绝,那么函数本身返回的承诺将被拒绝,并且函数的调用者将得到被拒绝的承诺。

所以,这取决于具体情况。如果你想在本地处理拒绝,那么你必须使用 try/catchawait(很像你会用.catch()。如果您希望拒绝冒泡给调用者,以便他们看到被拒绝的承诺,那么您不需要try/catch因为 Javascript 解释器会自动冒泡拒绝await通过拒绝承诺async函数返回。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wait 仅在异步函数中有效 - 使用 mongoosejs exec() 时 的相关文章

  • 如何使用 gcloud 凭据对 Dialogflow API 进行身份验证

    我有一个 Node JS 应用程序 可以向 Dialogflow 代理发出请求 我实际上使用基于临时令牌的请求 但是我如何更改它以通过谷歌服务凭证来做到这一点 https cloud google com docs authenticati
  • 使用 MongoDB Atlas 时 mongo-go-driver 因服务器选择超时而失败

    去版本 1 12 5 我有这个使用 node js mongo 驱动程序的代码 const MongoClient require mongodb MongoClient const uri process env MONGO HOST d
  • 从 MongoDB+Node.js 获取数据到客户端 JavaScript

    如何使用 Node js 连接 MongoDB 然后将结果传递给客户端 JavaScript 并以 HTML 形式显示 var http require http var URL require url var Db require mon
  • Express.js在控制器中获取http方法

    我正在构建一个注册表单 本地护照作为身份验证 表单作为表单助手 因为注册只知道 GET 和 POST 我想在一个函数中完成整个处理 换句话说 我正在寻找类似的东西 exports register function req res if r
  • 基于 NodeJS 的Radio(不带 ShoutCast)

    我喜欢创建一个基于 NodeJS 的广播电台not使用ShoutCast 基于 NodeJS 的播放列表 目前我已成功将音频文件发送到浏览器 但我不知道如何创建服务器端播放列表它会持续 播放 当前歌曲 并在播放结束后重新开始播放 这就是我目
  • 如何从 docker 容器运行 webpack 构建?

    我正在制作的应用程序是用 ES6 编写的 其他好东西是由 Docker 容器内的 webpack 转译的 目前 一切工作从创建内部目录 安装依赖项到创建编译的捆绑文件 当运行容器时 它说 dist bundle js 不存在 除非我在主机目
  • 如何在前端和后端之间共享javascript代码(ES6)

    这是 ES6 特定的副本这个所以线程 https stackoverflow com questions 3225251 how can i share code between node js and the browser 其中详细介绍
  • 如何在 Node.js 中将 HTML 转换为图像

    我需要在 Node 服务器上将 HTML 模板转换为图像 服务器将以字符串形式接收 HTML 我尝试过 PhantomJS 使用一个名为 Webshot 的库 但它不能很好地与 Flex 框和现代 CSS 配合使用 我尝试使用 Chrome
  • 有没有办法让 npm install (命令)在代理后面工作?

    阅读有关代理变量的信息 npmrc文件 但它不起作用 尽量避免手动下载所有需要的包并安装 我这样解决了这个问题 我运行这个命令 npm config set strict ssl false 然后将 npm 设置为使用 http 而不是 h
  • 如何使用 Node.js 在 Firebase 中注册用户?

    PROBLEM 0 用户是在 Firebase 的身份验证系统中创建的 我在 身份验证 选项卡中看到它 1 但没有对数据库进行任何更改 2 页面似乎无限加载 3 控制台仅记录 Started 1 CODE router post regis
  • 从字符串中删除货币符号并使用 Javascript 中的单行转换为数字

    我下面有一个字符串 它是以英镑为单位的价格 我想删除货币符号 然后将其转换为我可以用来与另一个值进行比较的数字 价格 例如 X gt Y 14 50 我之前已将字符串转换为用于货币的数字 var priceNum parseFloat pr
  • 嵌套对象的 AJV 模式验证

    函数返回的对象看起来像这样 answer vehicle type 1 message Car model VW color red 答案 对象始终存在 其他字段基于 vehicle type E g 如果vehicle type 1 则有
  • Node.js 和 Express:异步操作后如何返回响应

    我是 Node js 新手 所以我仍然对异步函数和回调很感兴趣 我现在的难题是如何在异步操作中从文件读取数据后返回响应 我的理解是发送回复的工作方式如下 这对我有用 app get search function req res res s
  • 为什么 Node.js 命名为 Node.js? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我只是好奇为什么 Node js 这么命名 我搜索了他们的网站和常见问题解答 但没有任何内容可以帮助我理解为什么它被命名为 Node js 官方名称其
  • node.js - 将两个可读流写入同一个可写流

    我想知道如果您同时将两个不同的读取流传输到同一目的地 node js 会如何操作 例如 var a fs createReadStream a var b fs createReadStream b var c fs createWrite
  • 使用 pg-promise 进行多行插入

    我想用一个插入多行INSERT查询 例如 INSERT INTO tmp col a col b VALUES a1 b1 a2 b2 有没有一种方法可以轻松地做到这一点 最好是对于像这样的对象数组 col a a1 col b b1 co
  • Javascript 中的面向对象方法

    是否可以使用面向对象的方法在 Java 脚本中 我在中使用 JavaScript服务器端和客户端使用node js 当前我正在使用查询来进行CRUD操作而不是查询是否可以使用DTO S将数据保存在数据库中 是的 您可以使用原型继承来模拟它
  • 使用 WebSocket 是否会产生服务器成本?

    我已经离开了 PHP MySQL 的舒适区 因为语法 封装 过程的东西可能会让人沮丧 上周 我开始尝试并按照一些教程使用 Node js Socket IO 创建实时聊天应用程序 到目前为止 我从未使用过 WebSockets 做过任何事情
  • 如何在没有 DOM 的情况下将 javascript 作为 node.js 脚本运行?

    https github com jasondavies d3 cloud https github com jasondavies d3 cloud是一个使用 D3 库的 javascript 文字云 这是一个交互式演示 http www
  • NPM 全局标志在 Windows 上似乎不一致

    从控制台运行 gt npm root g 或者以编程方式 var npm require npm npm load null function err npm npm config set global true npm root 我在 W

随机推荐