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

Gatsby+Strapi预览跳转错误:指向单页而非列表页求助

问题

使用Gatsby搭配Strapi,通过@strapi/plugin-gatsby-preview插件实现预览功能时,某集合类型的预览按钮点击后跳转到错误页面——本该指向对应的dynamic page set列表页,实际却跳转到单个programme页面。

查阅官方文档得知:当内容关联多个页面时,若预览跳转不符合预期,可通过createPage API的ownerNodeId指定页面归属的节点,该ID需与页面GraphQL查询对应的Gatsby node.id一致。

尝试在创建dynamic page set列表页及单个programme页面时,给嵌套循环内的createPage传入ownerNodeId,但问题仍未解决,代码如下:

data.allStrapiDynamicPageSet.edges.forEach(({ node: { id, strapi_id, pageSlug, location, programmes } }) => {
  actions.createPage({
    path: `dynamic-page-set/${strapi_id}`,
    component: path.resolve("./src/templates/dynamic-page-sets-listing.js"),
    context: {
      id: id,
    },
  });
  programmes.forEach((prog) => {
    actions.createPage({
      path: `i/${prog.progSlug}/${pageSlug}`,
      component: path.resolve("./src/templates/dynamic-page-set.js"),
      ownerNodeId: id,
      context: {
        id: id,
        progId: prog.id,
        type: "DYNAMIC_PAGE_SET",
        ProgrammeName: pageSlug,
        degreeId: prog?.degree_level?.id,
        locationId: location?.id,
      },
    });
  });
});
解决方案

你的问题出在没有给dynamic page set列表页设置ownerNodeId,反而只给单个programme页面加了这个属性。

@strapi/plugin-gatsby-preview会根据Strapi内容节点关联的Gatsby页面匹配跳转目标,当一个Strapi节点对应多个Gatsby页面时,插件会优先选择带有ownerNodeId且匹配的页面,或按页面创建顺序判断。你现在只给子页面(programme)设置了ownerNodeId,导致插件认为子页面是该Strapi节点的默认预览页面,所以跳转错误。

修正方法:给dynamic page set列表页的createPage也加上ownerNodeId,同时调整子页面的ownerNodeId绑定到自身节点ID,修正后的代码如下:

data.allStrapiDynamicPageSet.edges.forEach(({ node: { id, strapi_id, pageSlug, location, programmes } }) => {
  // 给列表页添加ownerNodeId,绑定到对应的Strapi节点
  actions.createPage({
    path: `dynamic-page-set/${strapi_id}`,
    component: path.resolve("./src/templates/dynamic-page-sets-listing.js"),
    ownerNodeId: id, // 关键:给列表页设置ownerNodeId
    context: {
      id: id,
    },
  });
  programmes.forEach((prog) => {
    actions.createPage({
      path: `i/${prog.progSlug}/${pageSlug}`,
      component: path.resolve("./src/templates/dynamic-page-set.js"),
      ownerNodeId: prog.id, // 绑定到programme自身的Gatsby节点ID
      context: {
        id: id,
        progId: prog.id,
        type: "DYNAMIC_PAGE_SET",
        ProgrammeName: pageSlug,
        degreeId: prog?.degree_level?.id,
        locationId: location?.id,
      },
    });
  });
});

这样设置后,预览dynamic page set内容时会跳转到列表页,预览单个programme内容时会跳转到对应的子页面,实现正确的预览分流。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:05:26