Node.js使用fs.appendFile写入JSON文件如何将新对象插入数组内部?
Node.js 向JSON文件数组插入新元素的正确实现
错误原因
fs.appendFile 是直接在文件末尾追加二进制内容,不会识别JSON的结构化语法,因此会把新内容写到数组闭合方括号]的外侧,破坏原有JSON结构。标准JSON数组不能通过直接追加内容实现插入,必须先读取全量内容修改后再回写。
正确实现步骤
- 读取目标JSON文件的全量内容
- 将字符串内容反序列化为JavaScript数组
- 将新构造的数据对象推入数组末尾
- 将修改后的数组重新序列化后写入原文件
代码示例
回调版本(兼容旧版Node.js)
const fs = require('fs') const filePath = './myJSONFile.json' // 构造新数据对象 const newData = { id: id, name: name, city: city } // 读取现有文件 fs.readFile(filePath, 'utf8', (readErr, data) => { if (readErr) throw readErr // 反序列化为数组 const jsonArr = JSON.parse(data) // 插入新元素 jsonArr.push(newData) // 序列化后回写,第三个参数控制缩进格式,和原有文件保持一致 const updatedJson = JSON.stringify(jsonArr, null, 2) fs.writeFile(filePath, updatedJson, 'utf8', (writeErr) => { if (writeErr) throw writeErr console.log('Changed!') }) })
Promise版本(Node.js 14+ 推荐)
const fs = require('fs/promises') const filePath = './myJSONFile.json' async function appendJsonArray(newData) { // 读取并反序列化 const fileContent = await fs.readFile(filePath, 'utf8') const jsonArr = JSON.parse(fileContent) // 插入新元素 jsonArr.push(newData) // 回写文件 await fs.writeFile(filePath, JSON.stringify(jsonArr, null, 2), 'utf8') console.log('Changed!') } // 调用方法 appendJsonArray({ id: id, name: name, city: city }).catch(err => { throw err })
注意事项
- 如果需要处理文件不存在的场景,可以在读取报错时初始化一个空数组再写入
- 高并发写入场景下需要加文件锁,避免多个写入操作同时修改文件导致内容损坏
- 如果数据量非常大,建议改用JSON Lines格式(每行存储一个JSON对象),此时可以直接使用
fs.appendFile追加新行,无需全量读写
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

