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

Next.js getStaticProps未执行且next build报错求助

问题根源

你用的是Next.js App Router(文件路径为src/app/pages/products/[productSlug]/page.tsx),但代码里用了Pages Router专属的getStaticProps和getStaticPaths——App Router完全不支持这两个API,这就是它们不执行、TypeScript报错的核心原因。

解决步骤

1. 用generateStaticParams替代getStaticPaths

App Router通过generateStaticParams预生成动态路由路径,完全替代旧的getStaticPaths。

2. 移除getStaticProps,改用Server Component直接取数

App Router页面默认是Server Component,不需要通过getStaticProps传参,直接在组件内部根据路由参数获取数据即可,Next.js会自动静态化这些请求(默认缓存)。

3. 清理无用依赖

你导入了useState、useEffect等客户端钩子但没用到,直接删掉,避免把组件误转为Client Component(如果不需要交互的话)。

修正后的代码
import { medusa } from "@/app/requests/medusaClient";
import { Product } from "@/app/models/productModel";

// 定义路由参数类型
interface ProductPageParams {
  params: {
    productSlug: string;
  };
}

// Server Component,直接接收路由参数
export default async function ProductPage({ params }: ProductPageParams) {
  // 根据slug从Medusa获取产品数据
  const { product } = await medusa.products.retrieve(params.productSlug);

  return (
    <>
      <h1>Product details</h1>
      <div>
        <h2>{product.title}</h2>
      </div>
    </>
  );
}

// 预生成所有产品的路由路径,替代getStaticPaths
export async function generateStaticParams() {
  const response = await medusa.products.list();

  return response.products.map((product: Product) => ({
    params: {
      productSlug: product.id, // 注意:若实际用产品的slug字段而非id,此处改为product.slug
    },
  }));
}
额外注意事项
  • 如果你的productSlug对应产品的slug字段(不是id),需要同步调整两处:generateStaticParams里改为product.slug,同时Medusa的查询逻辑要改成根据slug获取产品(比如用medusa.products.list({ slug: params.productSlug })后取第一个结果)。
  • 若需要客户端交互,在组件顶部加'use client'指令,但静态数据获取仍保留在Server Component部分,或用Suspense包裹客户端组件。
  • Next.js会自动缓存Medusa API请求结果,构建时静态生成所有产品页面,效果和原代码getStaticProps+fallback: false完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:58:14