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

Node.js中fs.promises.writeFile未完成文件写入就提前resolve问题求助

问题根因

你对fs.promises.writeFile的理解是完全正确的,它返回的Promise确实会在文件写入完成后才会resolve,你遇到的现象完全是代码写法错误导致的误解,核心问题有3个:

  1. .then()回调写法错误
    你写的.then(console.log(File Saved))会在代码执行到这一行时立刻调用console.log打印内容,再把console.log的返回值(undefined)传给.then(),而非等到writeFile的Promise resolve后再执行打印,所以日志时机早于写入完成时机。
  2. readFileSync未指定编码
    fs.readFileSync如果不传第二个参数指定编码格式,默认返回的就是Buffer对象,你看到的<Buffer ...>输出和文件是否写入完成完全无关,只是没有做编码转换而已。
  3. 无效的await使用
    JSON.stringify、console.log都是同步方法,返回值不是Promise,加await没有任何实际作用,属于无效写法。同时混用await和.then()也容易引发逻辑顺序的理解偏差,建议统一使用async/await语法。

修正后的代码

async function saveSettings(server, settings) {
  // 同步方法不需要加await
  const newSettings = JSON.stringify(settings, null, `\t`);

  // 统一用await等待写入完成,不需要混用then
  await fsPromises.writeFile(path.join(__dirname, `${server}.json`), newSettings)
  // 写入完成后再打印日志
  console.log(`File Saved`);

  // 读文件时指定utf8编码,拿到字符串内容
  console.log(fs.readFileSync(path.join(__dirname, `${server}.json`), 'utf8'));

  console.log(`Settings Saved`);
  return;
}

修正后运行即可得到你预期的输出结果,写入逻辑完全符合你的预期,没有提前resolve的问题。


内容的提问来源于stack exchange,提问作者Kay-95

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:06:04