使用Next.js App Router时mongoose仅返回20条数据的问题
问题分析与解决方案
核心问题
使用Next.js App Router搭配revalidate缓存策略时,接口返回数据仅20条(数据库实际存储112条产品数据),切换为no-store策略则能获取全量数据;接口本身可以输出112条全量数据,但Server Action中只能拿到20条缓存数据。
原因排查
本质是旧缓存未更新导致的:
- Next.js默认会缓存GET类型Route Handler的响应结果,如果之前接口返回过20条数据,在
revalidate周期内,Server Action中的fetch请求会直接读取旧缓存,而非调用最新的接口逻辑。 - 即便当前接口能查询到全量数据,只要缓存未过期,
fetch就不会发起新请求去获取最新结果。
解决方案
方案1:在Route Handler中明确同步缓存策略
让接口本身的缓存规则和Server Action的revalidate保持一致,避免旧数据残留:
// app/Products/route.js export async function GET(request) { try { await mongoConection(); } catch (error) { console.log(error); } const products = await Product.find({}).sort({ createdAt: -1 }); console.log("Products length" + products.length); // 明确设置缓存策略,与Server Action的revalidate周期同步 return NextResponse.json({ products }, { next: { revalidate: 3 } }); }
方案2:强制Server Action的fetch请求获取最新数据
如果需要立即拿到全量数据,可在fetch中调整缓存配置:
// app/FetchProducts/action.js "use server"; export async function FetchProducts() { const result = await fetch(`${process.env.NEXT_PUBLIC_URL}/Products`, { // 方式1:完全不缓存,每次请求都拉取最新数据 cache: 'no-store', // 方式2:或设置revalidate为0,效果等同于no-store // next: { revalidate: 0 } }); const expected = await result.json(); console.log("expected length: " + expected.products.length); return expected; }
方案3:手动清除Next.js缓存
若上述配置无效,可手动清除缓存强制更新:
- 删除项目根目录下的
.next/cache文件夹 - 重启开发服务器(生产环境需重新部署或触发增量再生)
内容的提问来源于stack exchange,提问作者Captai-N
相关产品推荐
相关产品推荐

