Node.js中循环内规范读取JSON文件值的最优方法
在Node.js中循环读取JSON数据文件避免缓存泄露的规范做法
嗨,这个问题我之前也踩过一模一样的坑!核心问题就是你说的——Node.js里的require是用来加载代码模块的,它会对加载过的文件做缓存,所以第一次循环后拿到的都是同一个对象,自然会导致循环间的数据串味泄露。
下面是几种符合Node.js惯例的解决办法,按推荐程度排序:
1. 用文件系统API直接读取并解析(最推荐)
既然这是个动态数据文件,不是代码模块,就别用require了,直接用fs模块读取文件内容,再手动解析成JSON。这样每次都是从磁盘读取最新内容,完全不会有缓存问题。
同步版本(适合小文件、非阻塞场景)
const fs = require('fs'); financials.forEach(function (value) { // 读取文件原始文本内容 const rawJson = fs.readFileSync('./data.json', 'utf8'); // 解析成JSON对象 const jsondata = JSON.parse(rawJson); jsondata.table.push(newTransaction); doSomethingElse(jsondata); });
异步版本(适合大文件或怕阻塞事件循环的场景)
如果你的操作是异步友好的,建议用fs.promises的异步方法,注意别在forEach里直接用异步函数(会导致并发乱序问题),改成for...of循环更稳妥:
const fs = require('fs').promises; // 用自执行异步函数包裹逻辑 (async function processFinancials() { for (const value of financials) { const rawJson = await fs.readFile('./data.json', 'utf8'); const jsondata = JSON.parse(rawJson); jsondata.table.push(newTransaction); doSomethingElse(jsondata); } })();
2. 手动清除require缓存(不推荐,仅作备选)
如果你非要用require,可以每次加载前删除该文件的缓存。但这属于“hack”性质的做法,因为require的缓存是Node.js模块系统的核心优化机制,频繁清除会影响性能,还可能和其他依赖这个文件的代码产生意外冲突。
代码示例:
financials.forEach(function (value) { // 先找到文件的缓存键并删除 const jsonPath = require.resolve('./data.json'); delete require.cache[jsonPath]; // 重新加载,此时会读取最新文件内容 const jsondata = require('./data.json'); jsondata.table.push(newTransaction); doSomethingElse(jsondata); });
总结
最符合Node.js惯例的做法是第一种——用文件系统API读取数据文件。require是为加载代码模块设计的,不是用来读取动态数据的工具,别把它用在不合适的场景里~
内容的提问来源于stack exchange,提问作者sim
相关产品推荐
相关产品推荐

