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

Next.js服务端组件加载时如何重新调用FETCH API?

解决Next.js服务端组件路由导航时不重新获取数据的问题

你设置了cache: 'no-store'但路由跳转时API仍不重新调用,可尝试以下几种方案:

1. 明确设置页面级别的revalidate: 0

在服务端组件所在页面添加export const revalidate = 0,强制页面每次请求都重新渲染,避免Next.js缓存服务端组件的输出:

export const revalidate = 0; // 禁用页面缓存,每次请求都重新执行服务端组件代码

const Home = async () => {
  const data = await getData();
  return <div>Home</div>;
};

export default Home;

2. 完善fetch的缓存配置

虽然cache: 'no-store'等价于revalidate: 0,但同时明确设置next.revalidate: 0可以确保覆盖任何全局缓存配置:

const garageData = await fetch(
  `${process.env.NEXT_PUBLIC_BACKEND_URL}users`,
  {
    cache: 'no-store',
    next: { 
      tags: ['user'],
      revalidate: 0 // 强制该fetch请求不缓存
    },
    method: 'GET',
    headers: {
      Authorization: `Bearer ${data?.jwtToken}`,
    },
  }
);

3. 关闭页面预取

如果使用Link组件时开启了预取(默认开启),Next.js会提前加载页面数据并缓存,导致路由跳转时复用缓存数据。可以关闭目标页面的预取:

<Link href="/home" prefetch={false}>跳转到首页</Link>

4. 强制组件动态渲染

如果以上方法无效,使用next/dynamic强制组件每次都动态渲染:

import dynamic from 'next/dynamic';

// 强制服务端组件每次请求都重新渲染
const Home = dynamic(() => import('./Home'), {
  ssr: true,
  dynamic: 'force-dynamic',
});

export default Home;

注意事项

  • 确保jwtToken的来源是每次请求都能获取到最新值(比如从服务端cookies()获取,而非客户端缓存),否则即使重新调用API,请求头也不会变化。
  • 检查是否有上层组件或全局配置设置了缓存规则,覆盖了当前页面的缓存配置。

内容的提问来源于stack exchange,提问作者shehwarmtp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:42:36