You need to enable JavaScript to run this app. Next.js中getServerSideProps导入JSON数据不更新如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 18:45:04