Next.js 14数据缓存失效求助:请求始终从源端拉取数据
针对你给出的代码,缓存不生效的可能原因如下:
函数定义存在语法错误
你的函数参数写法完全错误:async(/shopby/category/Snacks%20&%20Candy) => {这种写法会导致函数无法正确接收参数,且内部使用的url变量未定义。实际运行时要么抛出错误,要么请求路径异常,Next.js无法生成有效的缓存键。正确写法应该是在函数内定义请求URL,或者将URL作为参数传入:const fetchFromBackEnd = async () => { const url = "/shopby/category/Snacks%20%26%20Candy"; // 修正转义符 const options = { method: "GET", headers: { accept: "application/json" }, next: { revalidate: 60 * 60 * 24 } }; const response = await fetch(url, options); return response.json(); };URL转义字符错误
原路径中的%20&是双重转义,正确的&URL编码应为%26,或者直接写&让fetch自动处理转义。错误的URL会导致每次请求的缓存键不匹配,无法命中缓存。函数调用环境不符合缓存规则
Next.js的next.revalidate缓存配置仅在Server Components、Server Actions、Route Handlers中生效。如果这个函数是在Client Components里调用的,缓存配置会被忽略,fetch会走浏览器默认缓存逻辑,而非Next.js服务器端缓存。开发模式默认跳过缓存
在npm run dev的开发模式下,Next.js为了调试便利,会默认跳过fetch缓存,每次都重新请求数据源。只有在生产模式(执行npm run build && npm start)下,缓存规则才会正常生效。请求参数或头信息动态变化
如果每次调用函数时,请求URL带有动态变化的参数,或者请求头包含用户特定的内容(如Cookie),Next.js会生成不同的缓存键,导致无法复用之前的缓存。检查请求的URL和头信息是否每次都保持一致。
内容的提问来源于stack exchange,提问作者Ons Jannet

