如何解决 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);

运行上面代码会产生我们本次要介绍的错误。

nodejs await 错误

错误的第一个原因是 - 在未声明为异步的函数中使用 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

回到顶部