Next.js 14 + Prisma部署后findMany无法获取更新数据问题
问题分析与解决
核心原因
Next.js 14的App Router对无动态参数的GET API路由默认启用了静态数据缓存,部署时会预渲染该接口的响应并缓存,后续请求直接返回缓存内容,不会重新查询数据库。而带动态参数的api/campaigns/username/[...username]因为包含路由参数,默认被标记为动态路由,每次请求都会执行查询,所以能获取最新数据。
解决方案
针对api/campaigns路由,可通过以下方式禁用缓存或配置自动刷新:
1. 添加revalidate配置(推荐)
在API路由文件顶部添加export const revalidate,指定缓存刷新间隔(单位:秒),比如设置为10秒自动刷新一次:
import { NextResponse } from "next/server"; import prisma from "@/prisma/client"; // 每10秒刷新一次缓存 export const revalidate = 10; export async function GET() { try { const featuredCampaigns = await prisma?.campaign.findMany({ orderBy: { createdAt: "desc", }, where: { fundingComplete: false, }, include: { CampaignComment: { include: { user: { select: { username: true, }, }, }, }, }, }); if (featuredCampaigns.length === 0) { return NextResponse.json( { error: "No campaigns found" }, { status: 404 } ); } return NextResponse.json({ campaigns: featuredCampaigns }, { status: 200 }); } catch (error) { return NextResponse.json({ error: `Error: ${error}` }, { status: 500 }); } }
2. 强制路由为完全动态
如果需要每次请求都实时查询数据库,可添加export const dynamic = 'force-dynamic',彻底禁用静态缓存:
import { NextResponse } from "next/server"; import prisma from "@/prisma/client"; // 强制每次请求都执行查询,不缓存 export const dynamic = 'force-dynamic'; export async function GET() { // 原查询逻辑不变 }
3. 手动设置响应头禁用缓存
在返回响应时添加缓存控制头,告诉客户端和CDN不要缓存:
return NextResponse.json( { campaigns: featuredCampaigns }, { status: 200, headers: { 'Cache-Control': 'no-store, max-age=0' } } );
为什么带用户名的接口正常?
api/campaigns/username/[...username]包含动态路由参数username,Next.js会自动将这类路由视为动态路由,默认不会预渲染缓存,每次请求都会执行服务器端的查询逻辑,因此能获取数据库的最新数据。
内容的提问来源于stack exchange,提问作者cdub
相关产品推荐
相关产品推荐

