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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:33:15