Node.js中require读取JSON文件更新后无法获取新内容的问题
为什么require读取JSON更新后不生效?怎么解决?
嘿,这个问题我之前也碰到过!其实核心原因是Node.js的require自带缓存机制:当你第一次用require()加载JSON文件时,Node会把解析后的对象存在内存缓存里,后续再调用require()同一个文件,它直接从内存拿缓存的旧数据,根本不会去磁盘上读取更新后的文件内容。
那怎么解决呢?给你两个实用的办法:
办法一:手动清除require缓存后重新加载
每次读取前先把对应文件的缓存删掉,这样require()就会重新去磁盘读取最新内容。代码示例:
var file = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'] + "\\AppData\\Roaming\\BetterDiscord\\plugins\\Test.json"; // 关键:清除该文件的require缓存 delete require.cache[require.resolve(file)]; // 重新加载文件 var json = require(file); console.log(JSON.stringify(json.img)); json.img.push({name:"Test"}); // 保存文件后,如果需要再次读取,记得重复清除缓存+require的步骤
办法二:用fs模块直接读写文件(更推荐动态场景)
绕开require的缓存,直接用Node的fs模块读取文件内容,再手动解析成JSON对象。这样每次都会从磁盘获取最新数据,适合需要频繁修改和读取JSON的场景。
同步版本(简单直接,适合小文件)
const fs = require('fs'); var file = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'] + "\\AppData\\Roaming\\BetterDiscord\\plugins\\Test.json"; // 读取文件并解析JSON const jsonContent = fs.readFileSync(file, 'utf8'); var json = JSON.parse(jsonContent); console.log(JSON.stringify(json.img)); json.img.push({name:"Test"}); // 保存更新后的JSON到文件(null和2是为了格式化输出,让文件更易读) fs.writeFileSync(file, JSON.stringify(json, null, 2));
异步版本(非阻塞,适合大文件或高并发场景)
const fs = require('fs'); var file = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'] + "\\AppData\\Roaming\\BetterDiscord\\plugins\\Test.json"; fs.readFile(file, 'utf8', (err, data) => { if (err) throw err; var json = JSON.parse(data); json.img.push({name:"Test"}); fs.writeFile(file, JSON.stringify(json, null, 2), (err) => { if (err) throw err; console.log("文件已更新"); }); });
如果你的场景是需要频繁修改和读取这个JSON文件,更推荐用fs模块的方式——毕竟require的缓存设计是为了提升模块加载性能,不是用来处理动态更新的配置文件哒~
内容的提问来源于stack exchange,提问作者Letsplaybar
相关产品推荐
相关产品推荐

