You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,需要满足以下条件:

  1. 你的Node.js v14小版本高于等于14.8.0(低于该版本需要额外添加运行参数--experimental-top-level-await)
  2. 将代码改为ES模块规范,二选一即可:
    • 将文件后缀改为.mjs
    • 在项目package.json中添加配置项:"type": "module"
  3. 同步修改导入语法为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:36:02