Node.js v14运行util.promisify示例提示await仅可在async函数中使用
问题原因与解决方案
你遇到的报错与util.promisify本身无关,核心原因是 Node.js v14默认不支持在CommonJS模块的顶层作用域直接使用await。await语法默认只能在标记了async的函数内部使用,Quokka.js这类开发工具会默认将用户代码隐式包裹在自动执行的async函数中,或者开启了实验性特性兼容,所以运行不会报错,而原生Node执行时没有这类特殊处理就会抛出错误。
方案1:兼容所有Node版本的通用写法(推荐)
将需要使用await的逻辑包裹在自动执行的async函数中,示例代码如下:
const fs = require('fs'); const util = require('util'); const readFile = util.promisify(fs.readFile); // 自动执行的async函数 (async () => { const buf = await readFile('../../package.json'); const obj = JSON.parse(buf.toString('utf8')); console.log(obj.name); })() // 捕获异步异常 .catch(err => console.error('运行错误:', err));
方案2:使用顶层await
如果需要直接在顶层使用await,需要满足以下条件:
- 你的Node.js v14小版本高于等于14.8.0(低于该版本需要额外添加运行参数
--experimental-top-level-await) - 将代码改为ES模块规范,二选一即可:
- 将文件后缀改为
.mjs - 在项目
package.json中添加配置项:"type": "module"
- 将文件后缀改为
- 同步修改导入语法为ES模块的
import写法,示例代码如下:
import fs from 'fs' import util from 'util' const readFile = util.promisify(fs.readFile); const buf = await readFile('../../package.json'); const obj = JSON.parse(buf.toString('utf8')); console.log(obj.name);
内容的提问来源于stack exchange,提问作者Developer-Person
相关产品推荐
相关产品推荐

