为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只甜甜圈 2023-05-25 18:04:58
我正在尝试使用在 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:117var 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 版本。
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

您可以将其包装在异步函数中:

var SpotifyApiService = (async()=> await createApiService())();

在你可以使用than, catch之后


查看完整回答
反对 回复 2023-05-25
?
互换的青春

TA贡献1797条经验 获得超6个赞

如文档所示,babel 仅启用此功能的“语法”,

仅语法

此插件仅启用此功能的解析。Babel 不支持转换顶级 await,但你可以使用 Rollup 的 experimentalTopLevelAwait 或 webpack@5 的 experiments.topLevelAwait 选项。

这只是意味着 babel 在编译你的代码时不会报错,但它实际上并没有实现主动将一行代码转换为有效 ES5 的步骤var SpotifyApiService = await createApiService();

因此,任何执行您的代码(浏览器、节点)的东西都会抱怨,因为它们不知道如何处理此功能。


查看完整回答
反对 回复 2023-05-25
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

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



查看完整回答
反对 回复 2023-05-25
  • 3 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信