Next.js构建后修改接口引用的JSON文件,如何让接口返回更新内容?
问题根因
- Node.js的
require模块加载机制默认会缓存已加载的文件内容,只要服务进程不重启,重复require同一个文件都会直接返回第一次加载的缓存结果,不会重新读取磁盘上的最新文件。 - Next.js构建时会把静态导入的JSON文件直接打包到构建产物中,运行时不再关联原data.json文件,所以修改/删除原文件都不会影响接口返回。
解决方案1(推荐):使用fs模块动态读取文件
放弃require导入,改用Node.js原生fs模块每次请求都主动读取磁盘上的最新文件,配合process.cwd()定位项目根目录路径,适配开发和生产环境的路径差异。
修改后的pages/api/info.js代码如下:
import fs from 'fs' import path from 'path' export default function handler(req, res) { // 定位项目根目录下/data/data.json文件的绝对路径 const jsonFilePath = path.join(process.cwd(), 'data', 'data.json') // 读取文件内容并解析为JSON const fileContent = fs.readFileSync(jsonFilePath, 'utf-8') const data = JSON.parse(fileContent) // 原有业务逻辑保持不变 res.status(200).json(data.something) }
如果你的JSON文件较大,可以改用异步fs.readFile避免阻塞事件循环,普通大小的配置类JSON用同步读取性能足够。
解决方案2:清除require缓存
如果仍要使用require导入,可以在每次加载前手动清除对应文件的缓存:
export default function handler(req, res) { // 清除data.json的模块缓存 delete require.cache[require.resolve('../../data/data.json')] const data = require('../../data/data.json') res.status(200).json(data.something) }
该方案依赖相对路径解析的准确性,生产环境构建后可能出现路径匹配失败导致缓存清除失效的问题,仅适合开发阶段临时使用。
额外注意
如果你的项目部署在Serverless平台,因为Serverless函数实例是冷启动且独立的,直接修改服务端本地的JSON文件不会生效,这种场景建议把JSON内容存在数据库、对象存储等外部存储中,API路由从外部存储读取最新内容。
内容的提问来源于stack exchange,提问作者DavidPH
相关产品推荐
相关产品推荐

