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,这两种处理都不符合单个动态参数的类型要求,因此触发报错。
修复方案
- 移除
split("/"),直接使用p.attributes.slug的原始字符串值 - 修正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
相关产品推荐
相关产品推荐

