如何解决 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
function getNum() {
// Error: SyntaxError: await is only valid
// in async functions and the top level bodies of modules
const num = await Promise.resolve(100);
return num;
}
// Cause: Using top level await without setting
// `type` to `module` in `package.json`
const result = await Promise.resolve(42);
运行上面代码会产生我们本次要介绍的错误。
错误的第一个原因是 - 在未声明为异步的函数中使用 await 关键字。
为了解决这个问题,我们必须将直接封闭的函数标记为异步。
// 现在标记为异步
async function getNum() {
const num = await Promise.resolve(100);
return num;
}
如果当前在使用顶级 await 时遇到错误,需要查看本文下面的 package.json 部分。
该错误的一个非常常见的原因是忘记将内部函数设置为异步,例如 我们传递给 forEach()、map() 等方法的那些。
注意
,使用 await 关键字的直接封闭函数必须标记为异步。
async function loopNums() {
const nums = [3, 5, 7];
nums.forEach(num => {
// SyntaxError: await is only valid
// in async functions and the top level bodies of modules
await Promise.resolve(num);
});
}
我们将 loopNums 函数标记为异步,但我们在传递给 forEach() 方法的函数内部使用了 await 关键字。
相反,我们应该将传递给 forEach 的函数标记为异步。
function loopNums() {
const nums = [3, 5, 7];
nums.forEach(async num => {
await Promise.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 = await Promise.resolve(42);
console.log(result); // 42
相关文章
Node.js 中的 HTTP 发送 POST 请求
发布时间:2023/03/27 浏览次数:200 分类:Node.js
-
在本文中,我们将学习如何使用 Node.js 使用第三方包发出发送 post 请求。
Node.js 与 React JS 的比较
发布时间:2023/03/27 浏览次数:137 分类:Node.js
-
本文比较和对比了两种编程语言,Node.js 和 React。React 和 Node.js 都是开源 JavaScript 库的示例。 这些库用于构建用户界面和服务器端应用程序。