ExpressJS写入文件后无法获取新数据问题求助
问题原因
Node.js 的 require 机制会缓存已加载的模块文件(包括 JSON 文件)。第一次调用 require("./name.json") 时,文件内容会被存入缓存,后续即使文件内容修改,require 也直接返回缓存里的旧数据,只有重启服务器才会重新读取文件。你禁用 etag 无效,是因为这是服务端模块缓存的问题,和客户端静态文件缓存无关。
解决方案
方案一:使用 fs 模块实时读取文件(推荐)
放弃用 require 加载 JSON,每次请求时通过 fs.readFile 读取最新的文件内容:
const fs = require('fs'); const path = require('path'); // 示例获取接口 app.get('/api/get-name-data', (req, res) => { const jsonPath = path.join(__dirname, 'name.json'); fs.readFile(jsonPath, 'utf8', (err, rawData) => { if (err) { console.error(err); return res.status(500).send('读取文件失败'); } try { const fileData = JSON.parse(rawData); res.json(fileData); } catch (parseErr) { console.error(parseErr); res.status(500).send('文件内容不是合法JSON'); } }); });
方案二:清除模块缓存后重新 require(不推荐)
如果一定要用 require,可以每次请求时先清除该文件的缓存,再重新加载:
// 示例获取接口 app.get('/api/get-name-data', (req, res) => { const modulePath = require.resolve('./name.json'); // 删除对应模块的缓存 delete require.cache[modulePath]; // 重新加载文件 const fileData = require('./name.json'); res.json(fileData); });
注意:这种方式会破坏 Node.js 的模块缓存机制,频繁调用可能影响性能,不建议在高并发场景使用。
内容的提问来源于stack exchange,提问作者eko
相关产品推荐
相关产品推荐

