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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:42:00