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

Node.js中fs.readFileSync返回空Buffer致JSON解析失败原因

Node.js同步读取文件偶现空Buffer的问题分析

问题描述

目标文件内容

myFile.json的内容如下:

{ a: 0,
  b: 0,
  c: 0,
  d: 0 
}

执行代码

用户编写的Node.js代码用于读取解析该文件并写入新数据:

const myFile = fs.readFileSync('../path/to/file');
console.log(myFile);
const data = JSON.parse(myFile);
console.log(data);
// provide some new data saved in newData....
fs.writeFile(statisticalFile, JSON.stringify(newData), err => {
   if (err) {
     throw err;
   }
});

执行现象

  • 成功时打印内容:
<Buffer 7b ... >
{ a: 1,
  b: 2,
  c: 3,
  d: 4 }
  • 失败时打印空Buffer并抛出JSON解析错误:
<Buffer >
SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    ....

用户疑问

为何使用同步版本的文件读取方法fs.readFileSync仍会出现此问题?

原因分析与解决方案

核心原因

问题根源是异步写入与同步读取的竞态条件:

  • 代码中使用异步的fs.writeFile写入数据,该方法不会阻塞后续代码执行。如果同一脚本重复运行,或者有其他逻辑在写入未完成时调用fs.readFileSync读取文件,就可能读到处于写入过程中的不完整文件。
  • 当fs.writeFile在执行时,文件可能处于被截断(内容清空)或只写入了部分数据的状态,此时同步读取就会得到空Buffer或不完整的JSON内容,最终触发解析错误。

解决方案

可以通过以下两种方式解决:

  1. 改用同步写入:使用fs.writeFileSync替代fs.writeFile,确保写入操作完全完成后再执行后续逻辑:
// 替换原异步写入代码
fs.writeFileSync(statisticalFile, JSON.stringify(newData));
  1. 保证读取在写入完成后执行:如果必须保留异步写入,需将读取逻辑放在写入完成的回调中,或使用Promise版本配合await:
// 使用Promise+await方式
await fs.promises.writeFile(statisticalFile, JSON.stringify(newData));
// 写入完成后再读取
const myFile = fs.readFileSync('../path/to/file');

另外补充:你的myFile.json内容不符合标准JSON格式(键名未加双引号),虽然Node.js的JSON解析可能宽松兼容,但建议修正为标准格式,避免潜在问题:

{ 
  "a": 0,
  "b": 0,
  "c": 0,
  "d": 0 
}

内容的提问来源于stack exchange,提问作者Mahsa Shadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:45:30