Node.js中require引入JSON数组push后文件未更新的原因咨询
为什么修改require加载的JSON数组后原文件没变化?
嘿,这个问题我之前踩过同款坑!其实核心是你误解了Node.js里require加载JSON文件的工作逻辑,咱们一步步拆解清楚:
问题根源
- 当你用
const userList = require('../rolecall.json')时,Node.js会读取磁盘上的JSON文件,把它解析成JavaScript对象缓存到内存里。你后续修改的users数组,只是内存中这个对象的引用,和磁盘上的原文件没有自动同步的关联。 - Node.js从来不会主动把内存里修改后的对象写回磁盘文件,所以你打开原JSON查看时,自然看不到新增的元素。
正确的解决方法
要让修改同步到原文件,你得手动用Node.js的fs模块把修改后的对象重新写入磁盘。这里给你两种常用的实现方式:
同步写法(适合简单脚本场景)
const fs = require('fs'); const path = require('path'); // 1. 确定JSON文件的绝对路径(避免相对路径的潜在问题) const jsonFilePath = path.join(__dirname, '../rolecall.json'); // 2. 读取文件内容并解析为JS对象 const userList = JSON.parse(fs.readFileSync(jsonFilePath, 'utf8')); // 3. 执行你想要的修改操作 userList.users.push('82313123'); // 4. 将修改后的对象序列化为格式化的JSON字符串,写回原文件 fs.writeFileSync(jsonFilePath, JSON.stringify(userList, null, 2));
异步写法(适合服务端非阻塞场景,更推荐)
const fs = require('fs').promises; const path = require('path'); async function addNewUser() { const jsonFilePath = path.join(__dirname, '../rolecall.json'); // 异步读取文件内容 const fileContent = await fs.readFile(jsonFilePath, 'utf8'); const userList = JSON.parse(fileContent); // 修改数组 userList.users.push('82313123'); // 异步写回文件 await fs.writeFile(jsonFilePath, JSON.stringify(userList, null, 2)); } // 调用函数并处理可能的错误 addNewUser().catch(err => console.error('修改JSON失败:', err));
额外提醒
JSON.stringify的第三个参数2是用来格式化输出的,让生成的JSON文件保持缩进、可读性更强;如果不需要格式化,可以去掉这个参数。- 确保你的Node.js进程拥有该JSON文件的写入权限,否则会抛出权限错误。
- 如果有多个进程同时修改这个JSON文件,可能会出现数据覆盖的问题——这种场景下更建议改用数据库(比如SQLite、MongoDB)来存储数据,而非直接操作JSON文件。
内容的提问来源于stack exchange,提问作者Lyon Jenkins
相关产品推荐
相关产品推荐

