运维把 config.json 里的超时改成 8000,pm2 restart 之后日志里打印的还是旧值 3000。cat 文件确认内容已经是 8000。日志里能对上时间点,这种反而好排。

require 对同一个绝对路径只执行一次,结果挂在 require.cache 上,后面取到的都是同一个对象。文件改了不会让缓存失效,只有进程重启或者显式删除缓存才会重新读。这一点先确认清楚,后面就不用反复试。

const p = require.resolve('./config.json');
delete require.cache[p];
const cfg = require('./config.json');
console.log(cfg.timeout);

「require 缓存」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:确认读到的是不是同一个绝对路径 相对路径受 cwd 影响;配置类文件改用 fs.readFileSync 加 JSON.parse 每次现读;确实要走 require 就在读完删掉 require.cache 里那一条;把配置读取收进一个函数 别在多个模块顶端各 require 一次。

结果对不对很好判断,不重启进程改完文件再调用一次 打印出来的是新值 8000。

作者 9823189