Node.js使用fs模块向现有JSON文件追加内容报错如何解决
错误原因
你的代码核心是JSON读写逻辑完全走偏了,几个明确的错误点:
fs.readFile拿到的data本身就是utf-8编码的JSON字符串,你额外套一层JSON.stringify()等于把字符串再次转义,得到的是带大量反斜杠转义符的无效内容,根本不是原数据的结构化结果。- 两个JSON字符串直接拼接出来的内容完全不符合JSON语法,比如
{"person1":[]}{"person4":[]}这种格式,JSON.parse根本无法解析,必然抛语法错误。 - 标准JSON文件是一个完整的单一结构化对象,不是可以逐行追加的文本日志,用
fs.appendFile往文件尾部硬塞内容只会直接破坏JSON结构,不可能得到合法可用的文件。 - 之前用
.push()报undefined,本质是你没有先把读取到的文件内容解析成JS对象,直接对字符串或者读取失败返回的null值调用数组方法,自然会抛出类型错误。
正确实现方案
操作JSON文件的标准流程永远是读取文件内容 -> 解析为JS对象 -> 在内存中修改对象 -> 序列化为合法JSON字符串 -> 整体覆盖写回原文件,不要尝试走捷径拼接字符串或者追加写入。
可直接运行的代码如下:
const fs = require('fs'); const path = require('path'); // 待新增的静态数据 const news = { "person4": [ { "first": "Karan", "last": "Mahajan" } ], "person5" : [ { "first": "Sahil", "last": "Mahajan" } ] }; const filePath = path.join(__dirname, "repository.json"); fs.readFile(filePath, "utf-8", (readErr, data) => { // 处理读取错误,文件不存在时初始化为空对象 if (readErr) { if (readErr.code === 'ENOENT') { data = '{}'; } else { console.error("文件读取失败:", readErr); return; } } let existingData; try { // 将JSON字符串解析为可操作的JS对象 existingData = JSON.parse(data); } catch (parseErr) { console.error("原文件JSON格式非法,解析失败:", parseErr); return; } // 合并新老数据 const mergedData = { ...existingData, ...news }; // 序列化为带缩进的格式化JSON字符串,保证文件可读性 const fileContent = JSON.stringify(mergedData, null, 2); // 整体覆盖写回文件 fs.writeFile(filePath, fileContent, "utf-8", (writeErr) => { if (writeErr) { console.error("文件写入失败:", writeErr); return; } console.log("数据写入成功"); }); });
补充说明
- 所有
JSON.parse调用必须加try/catch捕获,避免原文件格式损坏时程序直接崩溃。 - 上述方案适合MB级别的常规JSON文件,如果你的JSON文件达到百MB甚至更大,整体读写会占用过高内存,这种场景建议换用JSON Lines格式(每行存一个独立JSON对象)存储,就可以直接用追加方式写入,不需要每次全量读写。
- 写入时
JSON.stringify第三个参数传2代表用2个空格做缩进,如果你不需要格式化输出,去掉后两个参数即可,文件体积会更小。
内容的提问来源于stack exchange,提问作者KNIGHT MAHAJAN
相关产品推荐
相关产品推荐

