基于PM2运行的NodeJS应用每日更新JSON文件无需手动重载方案问询
方案1:应用层动态读取JSON(无重启,最优雅)
问题根源是你的Node服务默认仅在启动时一次性读取JSON文件到内存,后续文件变更不会同步到内存数据,才需要重启进程更新。直接修改应用代码监听JSON文件变更自动更新内存缓存即可,全程不需要重启服务,无任何业务中断。
示例实现代码:
const fs = require('fs') const path = require('path') // 替换为你的JSON文件实际路径 const TARGET_JSON_PATH = path.resolve(__dirname, './data.json') // 初始化加载数据 let cachedJsonData = JSON.parse(fs.readFileSync(TARGET_JSON_PATH, 'utf-8')) // 监听JSON文件变更,自动更新缓存 fs.watch(TARGET_JSON_PATH, (event) => { if (event === 'change') { try { const newData = JSON.parse(fs.readFileSync(TARGET_JSON_PATH, 'utf-8')) cachedJsonData = newData console.log('JSON数据已自动更新') } catch (err) { console.error('JSON文件解析失败,沿用旧数据:', err.message) } } }) // 后续业务接口直接返回 cachedJsonData 即可
方案2:PM2自带文件监听自动重启(无需修改应用代码)
如果不想改动应用代码,可以直接使用PM2原生的文件监听功能,指定仅监听目标JSON文件的变更,文件更新后PM2会自动执行重载操作,不需要手动输入命令。
两种配置方式:
- 命令行直接启动时添加参数:
pm2 start 你的应用入口文件.js --watch /path/to/你的数据文件.json - 使用PM2配置文件(ecosystem.config.js)的话,添加如下配置:
module.exports = { apps: [{ name: '你的应用名称', script: 'app.js', // 仅监听目标JSON文件,避免其他文件变更误触发重启 watch: ['/path/to/你的数据文件.json'], ignore_watch: ['node_modules', 'logs'], // 防抖配置,1秒内多次变更仅触发一次重启 watch_delay: 1000 }] }
配置完成后执行pm2 start ecosystem.config.js启动即可。
方案3:Cron任务追加重载命令(最低改造成本)
如果以上两种方案都不适用,直接修改你的系统定时任务,在CURL拉取JSON成功之后追加PM2重载命令即可,注意要使用命令的绝对路径避免cron环境变量找不到执行文件。
示例cron配置:0 12 * * * /usr/bin/curl 你的数据拉取地址 -o /path/to/你的数据文件.json && /usr/local/bin/pm2 reload 你的应用名称
可执行
which pm2查询你环境中PM2的实际绝对路径替换上面的示例路径,同时要保证cron执行用户和启动PM2的用户一致。
内容的提问来源于stack exchange,提问作者Gregor Wedlich
相关产品推荐
相关产品推荐

