如何解决 Node.js 中 SyntaxError:await is only valid in async functions and the top level bodie
当在未标记为异步的函数内部使用 await 关键字时,会出现错误“await is only valid in async functions and the top level bodies of modules”。 要解决该错误,需要将直接封闭的函数标记为异步。
下面是发生错误的一段代码示例。
// Cause: Function not marked as async
functiongetNum() {
// Error: SyntaxError: await is only valid
// in async functions and the top level bodies of modules
const num = awaitPromise.resolve(100);
return num;
}
// Cause: Using top level await without setting
// `type` to `module` in `package.json`
const result = awaitPromise.resolve(42);
运行上面代码会产生我们本次要介绍的错误。
错误的第一个原因是 - 在未声明为异步的函数中使用 await 关键字。
为了解决这个问题,我们必须将直接封闭的函数标记为异步。
// 现在标记为异步
asyncfunctiongetNum() {
const num = awaitPromise.resolve(100);
return num;
}
如果当前在使用顶级 await 时遇到错误,需要查看本文下面的 package.json 部分。
该错误的一个非常常见的原因是忘记将内部函数设置为异步,例如 我们传递给 forEach()、map() 等方法的那些。
注意
,使用 await 关键字的直接封闭函数必须标记为异步。
asyncfunctionloopNums() {
const nums = [3, 5, 7];
nums.forEach(num => {
// SyntaxError: await is only valid
// in async functions and the top level bodies of modules
awaitPromise.resolve(num);
});
}
我们将 loopNums 函数标记为异步,但我们在传递给 forEach() 方法的函数内部使用了 await 关键字。
相反,我们应该将传递给 forEach 的函数标记为异步。
functionloopNums() {
const nums = [3, 5, 7];
nums.forEach(async num => {
awaitPromise.resolve(num);
});
}
现在,我们传递给 forEach 方法的函数是异步的,所以我们可以在其中使用 await 关键字。
必须将直接封闭的函数标记为 async 以便我们能够使用 await 关键字。
如果我们尝试在 Node.js 应用程序的顶层使用 await 关键字,请确保在 package.json 文件中将 type 属性设置为 module。
如果没有 package.json 文件,可以使用 npm init -y
命令创建一个。
打开项目根目录下的 package.json 文件,并将 type 属性设置为 module。
{
"type":"module",
// ... your other settings
}
现在我们可以在 Node.js 代码中使用顶级 await。
const result = awaitPromise.resolve(42);
console.log(result); // 42
本文转载自:迹忆客(https://www.jiyik.com)
以上是 如何解决 Node.js 中 SyntaxError:await is only valid in async functions and the top level bodie 的全部内容, 来源链接: utcz.com/z/290299.html