Node.js读取json文件无法获取最新更新内容的问题排查
问题原因
- Node.js 模块缓存机制(核心原因):Node.js 的
require机制会对已导入的模块进行缓存,第一次导入pFunctions.js时,会执行文件内所有顶层代码(读取文件、解析JSON、生成pFunctions对象),后续再导入该模块时,会直接返回缓存的导出对象,不会重新执行文件读取逻辑,因此拿到的永远是第一次读取的结果。 - 文件写入异步时序问题:如果更新log.txt、config.json时用的是
fs.writeFile等异步写入API,未等待写入完成就触发下一次计算的读取操作,会出现读取到旧内容的情况(你提到手动查看文件已经更新,这个概率较低)。 - 读写路径不一致:写入文件的路径和
pFunctions.js中用__dirname拼接的读取路径不是同一个位置,导致读取的始终是未更新的旧文件。 - 操作系统文件缓存:部分场景下操作系统会对频繁读取的文件做缓存,不过这个概率极低,且手动打开文件会触发缓存刷新,你手动查看文件是最新的就可以排除这个问题。
修复方案
方案1(推荐):封装配置读取逻辑为函数,每次调用主动刷新
不要在模块顶层执行文件读取操作,把读取、解析、生成参数的逻辑封装为可调用函数,每次需要最新参数时主动调用获取:
修改后pFunctions.js代码:
const fs = require('fs'); // Read logs function readLog() { try { return fs.readFileSync(__dirname + '/' + 'log.txt', {'encoding':'utf8','flag':'rs+'}); } catch (err) { return ''; } } // Read configurations function readConfig() { try { return fs.readFileSync(__dirname + '/' + 'config.json', {'encoding':'utf8','flag':'rs+'}); } catch (err) { return ''; } } // Function to read dataset function readDataset(cfg, lcg) { // 原有逻辑调整为接收cfg和lcg参数,不依赖顶层变量 .... .... } // 封装为调用函数,每次执行重新读取最新文件生成参数 function getPFunctions() { let config = readConfig(); let log = readLog(); let cfg = JSON.parse(config); let lcg = JSON.parse(log); let dataset = readDataset(cfg, lcg); return { parameter1: dataset } } module.exports = { getPFunctions };
修改后computation.js代码:
const { getPFunctions } = require('./app/config/pFunctions'); // 每次需要最新参数时调用函数获取 let newParams = getPFunctions();
方案2:确保文件写入完成后再执行读取
如果使用异步写入API更新配置文件,要等待写入回调触发后,再执行下一次计算逻辑,或者直接使用fs.writeFileSync同步写入,避免时序错位。
方案3(不推荐):手动清除模块缓存
每次需要更新参数前手动删除对应模块的缓存,强制重新导入pFunctions.js,该方案性能差且容易出现缓存清理不彻底的问题,仅作为临时验证方案使用:
// computation.js中每次导入前清除缓存 delete require.cache[require.resolve('./app/config/pFunctions')]; const {pFunctions} = require('./app/config/pFunctions'); let newParams = pFunctions;
内容的提问来源于stack exchange,提问作者Vakindu
相关产品推荐
相关产品推荐

