猿问

在 Node v14.14.0 中使用顶级等待功能时

我正在尝试使用在 Node v14.8 中添加的新顶级等待。

  • 我知道 IIFE 是过去的首选解决方法之一,但这个问题是关于新的顶级等待功能以及为什么尽管已与 Node 14.8 一起发布但它仍会抛出错误

我正在将我的 Axios 实例从我的控制器中提取到一个独立的服务中。在该服务文件中,我试图实例化然后导出一个 Axios 实例,该实例是使用来自 Spotify 的 API 的存储授权标头创建的。因为它随后被导入到我的控制器中(传递到构造函数然后它导出new SpotifyApiController(SpotifyApiService))并且导入是同步的,所以我试图使用新的顶级等待功能在启动/导入时完全实例化它,但出现以下错误:

[nodemon] starting `babel-node bin/www.js --harmony-top-level-await --experimental-repl-await`

E:\projects\harmonic-mixing-companion\server\services\SpotifyApiService.mjs:117

var SpotifyApiService = await createApiService();

                        ^^^^^


SyntaxError: await is only valid in async function

    at wrapSafe (internal/modules/cjs/loader.js:979:16)

    at Module._compile (internal/modules/cjs/loader.js:1027:27)

    at Module._compile (E:\projects\harmonic-mixing-companion\server\node_modules\pirates\lib\index.js:99:24)

    at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)

    at Object.newLoader [as .mjs] (E:\projects\harmonic-mixing-companion\server\node_modules\pirates\lib\index.js:104:7)

    at Module.load (internal/modules/cjs/loader.js:928:32)

    at Function.Module._load (internal/modules/cjs/loader.js:769:14)

    at Module.require (internal/modules/cjs/loader.js:952:19)

    at require (internal/modules/cjs/helpers.js:88:18)

    at Object.<anonymous> (E:\projects\harmonic-mixing-companion\server\controllers\/SpotifyApiController.js:1:1)

从错误来看,babel-node 似乎自从const SpotifyApiService = ...成为var SpotifyApiService = .... 我也添加"@babel/plugin-syntax-top-level-await"到我的babel.config.json.


该服务的文件扩展名为.mjs. 我也尝试过"type": "module"在服务器的 package.json 中进行设置,但这也没有结果。如果我错了请纠正我,但是将我的整个后端服务器设置为模块对我来说也不合适,因为它对我来说听起来不像一个模块化单元(相对于可重用的)SpotifyApiService。


console.log(process.version);在我的主入口文件的顶部仔细检查了我的节点版本,它打印了预期的 14.14.0 版本。


一只甜甜圈
浏览 163回答 3
3回答

慕田峪9158850

您可以将其包装在异步函数中:var&nbsp;SpotifyApiService&nbsp;=&nbsp;(async()=>&nbsp;await&nbsp;createApiService())();在你可以使用than, catch之后

互换的青春

如文档所示,babel 仅启用此功能的“语法”,仅语法此插件仅启用此功能的解析。Babel 不支持转换顶级 await,但你可以使用 Rollup 的 experimentalTopLevelAwait 或 webpack@5 的 experiments.topLevelAwait 选项。这只是意味着 babel 在编译你的代码时不会报错,但它实际上并没有实现主动将一行代码转换为有效 ES5 的步骤var SpotifyApiService = await createApiService();。因此,任何执行您的代码(浏览器、节点)的东西都会抱怨,因为它们不知道如何处理此功能。

叮当猫咪

问题是顶层 await 仅在 ES 模块中受支持。换句话说,您要么必须添加"type": "module"到 package.json 中,要么将.js文件重命名为.mjs.
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答