Next.js 13集成Prisma:生产环境数据库条目无法更新
解决Next.js 13生产环境API数据不实时更新的缓存问题
你的问题核心是Next.js 13生产环境下API路由被静态缓存,导致数据库更新后接口返回旧数据,仅重新部署才会刷新。以下是具体解决步骤:
1. 强制API路由动态执行,禁用静态缓存
Next.js 13的App Router中,GET类型API路由默认会被静态优化(构建时预渲染并缓存结果)。要让API每次请求都实时查询数据库,需在API文件顶部添加动态配置:
import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); // 关键配置:禁用静态缓存,强制每次请求都运行服务器端代码 export const dynamic = 'force-dynamic'; export async function GET() { try { const guestbookEntries = await prisma.entries.findMany(); return Response.json(guestbookEntries); } catch (error) { return Response.json({ error: 'Error getting guestbook entries', }); } }
dynamic: 'force-dynamic'会将该API路由标记为服务器端动态路由,每次请求都会重新执行查询逻辑,不再复用构建时的缓存数据。
2. 调整前端fetch的缓存策略
前端请求时需确保不使用浏览器或Next.js的缓存,将cache: 'force-cache'改为cache: 'no-store':
const getGuestbookEntries = async () => { try { const response = await fetch('/api/getGuestbookEntries', { cache: 'no-store', // 强制不缓存,每次请求最新数据 }); const entries = await response.json(); setData(entries); } catch (err) { setErrorMessage('Error on fetching'); setSeverity('error'); setIsVisible(true); } };
no-store会告知浏览器和Next.js缓存层,不要存储该请求的任何响应数据,每次都发起全新请求到服务器。
3. 额外检查(可选)
默认情况下Prisma不会缓存查询结果,若之前自定义过Prisma缓存配置,可在查询时显式禁用:
const guestbookEntries = await prisma.entries.findMany({ cacheStrategy: { ttl: 0 } // 禁用Prisma查询缓存 });
完成以上修改后,生产环境新增数据库条目后,刷新页面或重新调用getGuestbookEntries即可看到最新数据,无需等待部署。
内容的提问来源于stack exchange,提问作者jonu29
相关产品推荐
相关产品推荐

