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
相关产品推荐
相关产品推荐

