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

Next.js多语言环境下getStaticPaths生成路径slug参数报错排查

问题描述

使用Strapi作为CMS,查询slug字段,计划在Next.js中通过getStaticPaths和getStaticProps生成静态页面。为支持多语言,遍历locales获取每个Announcement的路径时,出现如下报错:

Error: A required parameter (slug) was not provided as a string in getStaticPaths for /updates/announcements/[slug]

现有getStaticPaths代码

export async function getStaticPaths({ locales }: any) {
  const paths = await (
    await Promise.all(
      locales.map(async (locale: any) => {
        const { data } = await client.query({
          query: gql`
            query Announcements {
              announcements(locale: "${locale}") {
                data {
                  attributes {
                    slug
                    locale
                  }
                }
              }
            }
          `,
        });
        return {
          announcements: data.announcements.data,
          locale,
        };
      })
    )
  ).reduce((acc, item) => {
    item.announcements.map((p: any) => {
      acc.push({
        params: {
          slug:
            p.attributes.slug === "/" ? false : p.attributes.slug.split("/"),
        },
        locale: p.attributes.locale,
      });
      return p;
    });
    return acc;
  }, []);

  return {
    paths,
    fallback: false,
  };
}

console.log(paths)输出

[
  { params: { slug: [Array] }, locale: 'en' },
  { params: { slug: [Array] }, locale: 'en' },
  { params: { slug: [Array] }, locale: 'en' },
  { params: { slug: [Array] }, locale: 'da' },
  { params: { slug: [Array] }, locale: 'sv' },
  { params: { slug: [Array] }, locale: 'nb' }
]
问题原因与解决方案

核心原因

你的页面路由是/updates/announcements/[slug],属于单个动态参数路由,Next.js要求params中的slug必须是字符串类型。但代码中使用p.attributes.slug.split("/")将slug拆分为数组,同时对"/"的情况设置为false,这两种处理都不符合单个动态参数的类型要求,因此触发报错。

修复方案

  1. 移除split("/"),直接使用p.attributes.slug的原始字符串值
  2. 修正slug为"/"的处理逻辑,不要返回false,改用合法字符串(比如空字符串,或根据业务需求调整为有效slug)

修改后的关键代码片段:

acc.push({
  params: {
    slug: p.attributes.slug === "/" ? "" : p.attributes.slug,
  },
  locale: p.attributes.locale,
});

补充说明

只有当路由为/updates/announcements/[...slug](catch-all路由)时,才允许slug为数组类型。当前路由是单个动态参数,必须保证params.slug为字符串。

内容的提问来源于stack exchange,提问作者Mathias Riis Sorensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:50:46