当前位置:首页 > 技术文章 > 正文内容

解决 Next.js 部署后 API 缓存不刷新的问题

问题背景

本地开发中,直接访问 /api/chatsessions 能实时获取 PostgreSQL 的最新数据。但部署至服务器跑 PM2、Nginx 反代后,却始终返回旧内容,数据库更新后网页依旧不刷新。


排查步骤

1. 确认 Route Handler 类型

/api/chatsessions 是 App Router 的 Route Handlerroute.ts ),默认是动态的,但仍可能使用 数据缓存(Data Cache) ,导致返回旧数据 Medium Medium+11nextjs.org+11Stack Overflow+11 。


2. dynamic = 'force-dynamic' 不足以清缓存

#技术分享 #掘金虽然在 Handler 顶部写了 export const dynamic = 'force-dynamic' ,它只关闭“完整路由缓存”(Full Route Cache),但不影响数据缓存 nextjs.org+4Reddit+4Stack Overflow+4 。


3. 缺少 fetchCache = 'force-no-store'

官方说明:需同时添加 export const fetchCache = 'force-no-store'default-no-store ,才能跳过 Data Cache,确保每次请求都刷新数据 nextjs.org+1Medium+1 。


4. 注意斜杠跳转问题

访问 /api/chatsessions 会自动 308 跳转到 /api/chatsessions/ 。若前端和 Nginx 路径不一致,可能导致缓存配置失效。


解决方案

export const dynamic = 'force-dynamic';
export const fetchCache = 'force-no-store';

import { NextResponse } from "next/server"; import { Pool } from "pg";

const pool = new Pool({ connectionString: process.env.DATABASE_URL });

export async function GET() { const client = await pool.connect(); try { const { rows } = await client.query(` SELECT id, created_at FROM chats ORDER BY created_at DESC LIMIT 50 `); const sessions = rows.map(r => ({ id: r.id, createdAt: r.created_at })); return NextResponse.json(sessions, { headers: { 'Cache-Control': 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0' } }); } finally { client.release(); } }
  • dynamic = 'force-dynamic' :禁用完整路由缓存
  • fetchCache = 'force-no-store' :禁用数据缓存,即 Data Cache
  • 在返回头中加入 Cache-Control: no-store :防止浏览器或代理缓存

辅助配置:Nginx 与前端请求

Nginx 配置

location ^~ /api/ {
  proxy_pass         http://127.0.0.1:3000;
  proxy_cache        off;
  proxy_buffering    off;
  add_header Cache-Control "no-store, max-age=0" always;
}

前端 fetch 示例

await fetch('/api/chatsessions/', { cache: 'no-store' });

确保 API 路径统一带斜杠,避免 308 重定向带来的缓存问题。


验证方法

  1. 修改数据库内容后,使用 curl -i https://.../api/chatsessions/ 查看响应头是否带 Cache-Control: no-store
  2. 访问接口并刷新页面,应立即获取最新数据。

总结

  • Next.js Route Handler 默认仍使用数据缓存,需要配合使用 dynamic + fetchCache 才能彻底关闭;
  • 保证 API 路径带斜杠,防止跳转时走代理缓存;
  • 全链路禁缓存保障(路由层 + Handler + Nginx + 前端),即可实现“每次请求都实时更新”。

--- 这篇记录了从问题定位到解决完整流程,希望能帮助遇到同样问题的同学。

相关文章

2020最新门店财务收支管理系统(通用版),直接套用,自动计算

连锁企业的财务不知道怎么做各门店的收支表,不会门店汇总,别着急,看这里,今天小编和大家分享一套2020最新最新门店财务收支系统(通用版),可以快速录入,自动计算,既方便又全面!希望对大家有所帮助!(文...

Vue3 如何实现父子组件传值?(vue父子组件传值props)

在Vue 3中,要实现父子组件传值效果主要通过props和emit两种机制来实现,下面我们就来详细介绍一下这两种机制。父组件向子组件传值propsprops是Vue组件的一种机制,主要的作用就是实现从...

Vue3开发极简入门(16):祖孙组件间通信之provide&inject

前文说了Vue的组件间关系,有父子、爷孙、其他关系。例如之前的Father、Son是父子关系,App与Son就是爷孙关系。而props的Son,与emits的Son,就是其他关系。前文的props是父...

Vue 2 和 Vue 3的区别(vue2和vue3的区别有哪些)

1.双向数据绑定原理不同Vue2 的双向数据绑定是利用ES5的一个APIObject.definePropert() 对数据进行劫持,结合发布订阅模式的方式来实现的。Vue3 中使用ES6的Proxy...

Windows 下 Git 拉 Gitlab 代码(gitlab拉项目)

读者提问:『阿常你好,Windows 下 Git 拉 Gitlab 代码的操作步骤可以分享一下吗?』阿常回答:好的,总共分为五个步骤。一、Windows 下安装 Git官网下载链接:https://g...

jenkins+gitlab 实现自动化部署(gitlab触发jenkins)

目录1、安装jdk,要记住安装路径2、安装maven,要记住安装路径3、安装git,要记住安装路径4、安装gitlab5、安装jenkins(centos7)创建安装目录下载通用war包启动和关闭Je...