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

Next.js如何在getStaticPaths内获取URL路径末尾数字?

首先纠正一个核心认知错误

getStaticPaths 是项目构建阶段(执行next build时)运行的函数,不会在用户发起页面请求时执行,函数上下文里根本不存在「当前用户访问的URL」,所以你不可能在这个函数里动态获取请求路径上的数字参数。

你硬编码num=2的写法本质是逻辑偏差:你用的是/category/[slug]/[pageNum]结构的动态分页路由,getStaticPaths的作用是提前把所有合法的路由路径(所有分类+所有对应分页页码)列出来供Next.js预生成静态页面,根本不需要依赖「当前URL」。

正确实现方案

第一步:确认动态路由文件位置

确保你的页面文件放在Pages Router的对应路径下:pages/category/[slug]/[pageNum].tsx,最后一级动态路由段命名为pageNum,后续可以直接从路由参数里取到页码。

第二步:改写getStaticPaths逻辑

你需要先拿到每个分类对应的总页数,遍历所有分类+所有合法页码生成全量路径,不需要硬编码固定num值:

export const getStaticPaths: GetStaticPaths = async () => {
  const allCategories = await getAllCategories()
  const paths: Array<{
    params: { slug: string; pageNum: string }
  }> = []

  // 遍历所有分类
  for (const { node } of allCategories.edges) {
    // 这里替换成你自己的分页逻辑:计算当前分类总共有多少页
    // 示例:假设分类节点返回总内容数,每页展示10条,总页数向上取整
    const pageSize = 10
    const totalPages = Math.ceil(node.totalCount / pageSize)
    // 遍历当前分类所有页码,生成对应路径
    for (let currentPage = 1; currentPage <= totalPages; currentPage++) {
      paths.push({
        params: {
          slug: node.slug,
          pageNum: String(currentPage) // 注意params的参数值必须是字符串类型
        }
      })
    }
  }

  return {
    paths,
    fallback: false 
    // 如果后续内容更新会新增页码、不想每次都重新构建,可以把fallback改成'blocking'
  }
}

第三步:在getStaticProps里取URL上的页码

URL上的页码参数不需要在getStaticPaths里提取,在页面对应的getStaticProps函数里,直接从上下文的params对象就能拿到:

export const getStaticProps: GetStaticProps = async (context) => {
  // 直接取动态路由参数,就是URL末尾的数字
  const pageNum = Number(context.params?.pageNum)
  const categorySlug = context.params?.slug as string
  // 用拿到的slug和pageNum拉取对应页的分类内容即可
  const pageData = await getCategoryPageData(categorySlug, pageNum)

  return {
    props: {
      pageData
    }
  }
}

特殊场景:请求时动态取URL数字的方案

如果你的场景不适合预生成所有静态页面,要在用户每次请求时动态处理,就不要用getStaticPaths+getStaticProps的静态生成方案,换成服务端渲染的getServerSideProps,这个函数在每次请求时执行,可以直接拿到请求URL提取数字:

export const getServerSideProps = async (context) => {
  // 从请求URL中提取末尾数字
  const pathSegments = context.req.url?.split('/').filter(Boolean) || []
  const pageNum = Number(pathSegments.pop())
  const categorySlug = pathSegments.pop() as string
  // 后续拉取数据逻辑
  const pageData = await getCategoryPageData(categorySlug, pageNum)
  return {
    props: {
      pageData
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:18:27