Next.js中getServerSideProps导入JSON数据不更新如何解决?
问题根因
该现象是Node.js 模块缓存机制导致的:当你通过import引入JSON文件时,Node会在首次加载后将其内容缓存到内存中,后续所有导入操作都会直接返回缓存副本,不会重新读取磁盘上的最新文件。所以哪怕你修改了JSON内容,getServerSideProps每次运行拿到的还是旧数据,表现和SSG的静态缓存一致。
推荐解决方案
直接修改权限读取逻辑,放弃静态import引入JSON,改为每次调用时主动读取磁盘上的最新文件,完全适配getServerSideProps每次请求触发的运行机制:
1. 修改/lib/permissions.js
import fs from 'fs' import path from 'path' export function getPermissions() { // 拼接JSON文件的绝对路径,process.cwd()对应Next.js项目根目录 const jsonPath = path.join(process.cwd(), 'db', 'users.json') // 实时读取最新文件并解析 const fileContent = fs.readFileSync(jsonPath, 'utf8') return JSON.parse(fileContent) } export function hasPermission(username, group, perm = false) { if (!perm) perm = getPermissions() if (username in perm && perm[username].groups.includes(group)) { return true } if (perm.all.groups.includes(group)) { return true } return false }
2. 原有页面代码无需大幅改动
getServerSideProps本身会在每次请求时运行,每次调用getPermissions都会拿到最新的JSON内容:
export async function getServerSideProps(context) { const params = context.query const permissions = getPermissions() return { props: { params, permissions } } }
可选方案(不推荐)
如果确实要保留模块导入的写法,也可以手动清除JSON文件的模块缓存,但该方式依赖Node内部缓存规则,稳定性不如直接读文件:
// /lib/permissions.js export function getPermissions() { // 每次调用前清除缓存,强制重新加载JSON delete require.cache[require.resolve('../db/users.json')] return require('../db/users.json') }
注意事项
- 两种方案都完全基于
getServerSideProps实现,不会禁用自动静态优化(ASO),符合Next.js官方最佳实践 - 权限数据会在每次用户请求页面时重新读取,修改JSON文件后刷新页面即可生效
内容的提问来源于stack exchange,提问作者HelpingHand
相关产品推荐
相关产品推荐

