Node.js更新db.json后接口返回旧数据仅重启服务生效问题
问题原因
- Node.js 的
require加载机制自带模块缓存,你在服务启动时执行的var filex = require('./db.json')会把当时的db.json内容加载到内存并永久缓存,后续你修改磁盘上的db.json文件不会自动更新这块缓存,所以接口返回的filex永远是服务启动时的旧数据,只有重启服务才会重新加载文件内容。
修复方案
有两种可选的修复方式,按需选择即可:
方式1:每次请求实时读取文件(简单稳妥,适合低并发场景)
删掉全局声明的var filex = require('./db.json')这行代码,所有需要返回db.json内容的接口,每次请求时都重新读取磁盘文件:
// 你已经引入了jsonfile,直接用它的读文件方法即可 // 修改所有返回db内容的接口,示例如下: app.post('/api',function(req,res){ const latestData = jsonfile.readFileSync(file) res.send(latestData) }) app.get('/api',function(req,res){ const latestData = jsonfile.readFileSync(file) res.send(latestData) }) app.post('/api/v1/users/initial_authentication',function(req,res){ const latestData = jsonfile.readFileSync(file) res.send(latestData) }) app.get('/api/v1/users/initial_authentication',function(req,res){ const latestData = jsonfile.readFileSync(file) res.send(latestData) })
方式2:更新文件同时更新内存变量(性能更高,适合高并发场景)
保留全局的filex变量,每次你修改完db.json文件之后,主动更新filex的值,不用每次请求读磁盘,也不需要修改其他接口的代码:
// 原来的写文件逻辑修改为: app.post('/gettingdata',function(req,res){ var user_id = req.body.usrid; var obj = JSON.parse(user_id) jsonfile.writeFileSync(file, obj,{flag: 'w'}); // 新增这行,同步更新内存里的缓存变量 filex = obj res.send('updated'); })
注意如果你的项目还有其他修改db.json文件的入口,需要在所有写文件的位置都同步更新filex变量,避免出现数据不一致。
内容的提问来源于stack exchange,提问作者yousaf raza
相关产品推荐
相关产品推荐

