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

使用getStaticProps和getStaticPaths后Next.js渲染错误及404问题求助

Next.js动态路由getStaticProps/Paths错误解决

错误原因与修复步骤

1. getStaticProps参数解构错误

原代码中getStaticProps的参数写法错误,locale是context对象的属性,需从context中解构:

// 错误写法
export async function getStaticProps({ locale,context }) {
// 正确写法
export async function getStaticProps({ locale, params }) {

2. 未将获取到的博客数据传递给组件

getStaticProps中找到的blogItems需要添加到返回的props中,否则组件无法获取服务端渲染的数据,导致客户端与服务端内容不匹配:

export async function getStaticProps({ locale, params }) {
  const { blogId } = params;
  const blogItems = blogData.find(i => i.id === blogId);
  
  return {
    props: {
      ...(await serverSideTranslations(locale, ['blogList'])), // 第二个参数是翻译命名空间数组
      blogItems // 将数据传给组件
    },
  };
}

3. 组件中未正确接收并使用props数据

组件里直接使用未定义的blogItems,需从props中获取,同时处理fallback: true时的加载状态:

export default function BlogPage({ blogItems }) { // 接收props
  const { t } = useTranslation();
  const router = useRouter();

  // 处理fallback状态,避免未加载完成时渲染错误
  if (router.isFallback) {
    return <div>加载中...</div>;
  }

  // 如果没有找到对应博客,返回404
  if (!blogItems) {
    return <div>404 - 博客不存在</div>;
  }

  return (
    <>
      <h1>{blogItems.date}</h1>
    </>
  );
}

4. serverSideTranslations调用错误

serverSideTranslations的第二个参数是需要加载的翻译命名空间数组,不是具体数据,应改为对应的命名空间(比如['blogList'])。

5. 动态路由文件名与路径匹配问题

确保页面文件名为[blogId].js(或.tsx),且放在pages/blog/目录下,这样访问/blog/1才能正确匹配。

6. fallback: true的补充说明

当fallback: true时,未在getStaticPaths中预定义的路径会触发增量静态生成,此时组件需要通过router.isFallback判断加载状态,避免hydration错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:25:25