【问题标题】:Next.js catch-all / as routingNext.js 包罗万象/作为路由
【发布时间】:2021-09-09 19:57:28
【问题描述】:

首先,如果这有点混乱,请道歉。那是因为我也很困惑。
我是 Next.js 的新手,我正在使用 WP 作为无头 CMS 从 Gatsby 迁移一个站点。我没有构建原始网站,所以我继承了一堆我不熟悉的代码。

我正在使用/pages/listing/[slug].js 组件为此客户生成单独的列表。我通过在 getStaticPaths 中查询所有 slug 的列表来获取路径,并使用 slug 查询 db 以获取使用 getStaticProps 的页面的数据。到目前为止一切都很好。 现在唯一的问题是我被告知客户希望保留他们目前的网址 - 例如listing/experience/location/product-name-hereproduct-name-here 是我从 CMS 获取的 slug),但我只知道该怎么做listing/product-name-here.

到目前为止,我失败的方法是:

  • 将组件更改为[...slug].js,但我开始抱怨 slug 不是数组。即使我在获取静态路径时手动将其更改为数组,因为仅获取 slug,我仍然没有使用正确的 url。
  • Link 组件上使用as 属性。它会将我发送到我现在想要的链接,但我收到 500 错误。如果我使用href 属性(即listing/product-name-here)手动输入网址,页面加载正确,但网址错误。

我想知道是否有某种方法可以访问该 URL,但到目前为止我唯一遇到的是useRouter,因为这是一个钩子,我无法在组件本身之外使用它。

如果不清楚,请随时提出任何问题。我将代码 sn-ps 排除在外是因为我觉得我的方法根本上是错误的,而不是我遇到的烦人的错误。

编辑 该问题最终通过将fallback 设置为true 并为处理API 相关数据的任何内容设置大量可选链接以及所有道具的空默认值来解决。我的直觉仍然是,这不是处理此问题的正确“下一步”方法,但该项目是从 Gatsby 迁移过来的,并且有点被硬塞进去,所以我只需要让它工作。

【问题讨论】:

  • 您需要创建一个文件:./pages/listing/experience/location/[slug].js,基本上是目录中的目录。请参考:Nested Routes
  • @brc-dd 感谢您的评论,但这不是我想要的。实际上,我确实找到了一种从 CMS 获取路径的方法,getStaticPaths 正在获取值数组来创建捕获所有[...slug].js 的路线,但getStaticProps 没有看到params.slug 被传递给它。所以我无法在数据库中查询我需要的页面内容。

标签: javascript url routes next.js catch-all


【解决方案1】:

编辑为第一个答案不起作用。

使用pages/listing/[...slug].js作为文件名,然后从getStaticPaths返回一个像这样的对象:

  return {
    paths: [
      { params: { slug: ["path1"] } },
      { params: { slug: ["path2"] } },
      { params: { slug: ["deeper", "path"] } }
    ],
    fallback: false
  };

这意味着以下地址正在工作:

  • 列表/路径1
  • 列表/路径2
  • 列出/深入/路径

然后,您可以从上下文context.params.slug 中以getStaticProps 中的数组的形式访问slug。这将包含 ["path1"]["path2"]["deeper", "path"],具体取决于访问的页面。

您可以在下面的沙盒中试用:

https://codesandbox.io/s/confident-microservice-lu2jl?file=/pages/listing/%5B...slug%5D.js

【讨论】:

  • 我看过这个,但我认为它可能是指来自useRouter 钩子的router 对象。该路径出现在getStaticPaths 的数组中,但getStaticProps 只是没有被调用。我看到 Vercel 支持团队的一张票说虚假值不会传递给 getStaticProps,但我检查了正在传递的路径对象,它绝对是真实的。如果您能提供更多见解,我将不胜感激。
  • 我很抱歉,答案是错误的,我做了一个有效的代码框并再次写了答案。
  • 感谢您的宝贵时间。我最终删除了对getStaticProps 的所有调用并在页面上呈现任何复杂的内容,结果证明该数组能够传递给getStaticProps。然而,问题似乎是 api 调用返回 undefined 并且 then 返回数据。因此,应用程序会立即看到未定义并抛出错误,而不是获取所需的信息。你有没有遇到过这个问题,使用Promise.all会有效吗?
  • 听起来您需要一些逻辑来显示微调器,例如在加载时?您可以在渲染函数开始时检查它是否未定义,并显示一些加载文本或微调器,直到数据可用。
  • 我想我可能已经遇到了先获取未定义然后再获取数据的解决方案。阅读这个关于fallback属性的东西,如果它设置为true,它就像那样工作,如果它设置为阻塞,那么它会在第一次尝试时等待数据:nextjs.org/docs/basic-features/…
猜你喜欢
  • 2020-12-15
  • 2016-08-20
  • 2011-04-02
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 2021-08-17
相关资源
最近更新 更多