You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:32:05