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

如何用Strapi生成嵌套动态页面的多动态路径?

解决Next.js嵌套动态页面([category]/[client].js)的路径生成问题

核心问题分析

你的代码在getStaticPaths中错误地将同一分类下的所有客户名称合并成了单个字符串,导致生成category/client1client2这类无效路径。正确的做法是为每个客户生成独立的路径对象,需要用flatMap替代map来展开嵌套的客户数组。

修改后的代码实现

1. 修复getStaticPaths生成正确路径

export const getStaticPaths = async () => {
    const categoryPathResponse = await fetcher(
        `${process.env.NEXT_PUBLIC_STRAPI_URL}/categories?populate=*`
    );
    const data = categoryPathResponse.data;

    // 使用flatMap展开每个分类下的客户,生成独立路径
    const paths = data.flatMap((categoryItem) => {
        const categorySlug = categoryItem.attributes.path.toString().toLowerCase();
        // 遍历当前分类下的所有客户,生成对应的路径参数
        return categoryItem.attributes.clients.map((client) => {
            // 处理客户名称为URL友好的slug(替换空格为短横线,转小写)
            const clientSlug = client.name.toLowerCase().replace(/\s+/g, "-");
            return {
                params: {
                    category: categorySlug,
                    client: clientSlug
                },
            };
        });
    });

    return {
        paths,
        fallback: false,
    };
};

2. 优化getStaticProps的API请求

你的API请求URL存在两个?符号(会导致参数解析错误),同时Strapi的过滤参数写法可以更规范:

export async function getStaticProps(context) {
    const { category, client } = context.params;

    // 修正URL中的多余?,并规范Strapi的过滤与填充语法
    const data = await fetcher(
        `${process.env.NEXT_PUBLIC_STRAPI_URL_BASE}/categories?filters[path][$eq]=${category}&filters[clients][name][$eq]=${client}&populate[clients][populate]=*`
    );

    return {
        props: { client: data },
    };
}

关键说明

  • flatMap的作用:先对每个分类执行map生成客户路径数组,再将所有分类的路径数组合并成一个一维数组,确保每个客户对应一个独立的路径对象。
  • 客户Slug处理:单独对每个客户的名称进行转小写、替换空格的操作,避免多个客户名称被拼接。
  • API参数修正:移除多余的?,将客户过滤条件正确嵌套在filters[clients]下,确保Strapi能正确筛选出指定分类下的目标客户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:10:49