【问题标题】:Gatsby build / createPages: error handlingGatsby build/createPages:错误处理
【发布时间】:2020-04-21 09:38:28
【问题描述】:

我正在使用 gatsby 构建一个非常大的网站(5k+ 页,300k+ 图片)。源数据不可靠(例如经常缺少字段),导致createPage过程中出现错误。

问题在于,如果单个 createPage 运行引发错误,整个构建 将失败。所以有时 5k 页面构建成功,然后整个页面因为一个错误而崩溃。

我尝试将页面创建包装在 try...catch 中,但没有任何区别:

      try {
        createPage({
          path: node.slug,
          component: path.resolve(`./src/templates/BlogPost.js`),
          context: {
            id: node.id,
          },
        });
      } catch (error) {
        console.log(error);
      }

(我也尝试在组件级别检查数据,如果不完整则返回null,但createPage 仍会创建一个(空白)页面,我不希望这样:我只想数据错误时要跳过的页面)

所以我的问题是:如何在构建过程中处理错误/失败的页面创建,以便跳过失败的页面而不是使整个构建崩溃?

注意,这几乎是 this question 的副本,但那里的解决方案对我不起作用:如果数据不正确,我无法呈现错误页面,如果这是,我需要完全跳过该页面尽可能

【问题讨论】:

  • 您可以在将数据传递给 createPage 之前对其进行验证吗?
  • 是的,这最终是解决方案,不是吗 - 我真的试图避免这种情况,因为我们的构建时间已经很疯狂,并且在每个产品上验证深度 json 只会增加这一点。但如果真的没有其他办法,那就是我必须做的:(
  • 300k 图像...哇!

标签: gatsby


【解决方案1】:

您应该为源数据显式定义 GraphQL 架构: https://www.gatsbyjs.org/docs/schema-customization/#creating-type-definitions

这样,GraphQL 调用将不会返回错误,而是 null 用于节点上的缺失字段。然后,您可以检查这些虚假值并跳过createPage 调用。

例如在我的this theme 中,我为Page 类型明确定义了GraphQL 模式:https://github.com/LekoArts/gatsby-themes/blob/567858957ca484aef8114a7d0b8e4f14df0c8a00/themes/gatsby-theme-minimal-blog-core/gatsby-node.js#L90-L96

https://github.com/LekoArts/gatsby-themes/blob/567858957ca484aef8114a7d0b8e4f14df0c8a00/themes/gatsby-theme-minimal-blog-core/gatsby-node.js#L111-116

如果最终用户没有创建任何页面(通过在内容/页面中创建文件),查询将返回 null,我可以检查一下:https://github.com/LekoArts/gatsby-themes/blob/567858957ca484aef8114a7d0b8e4f14df0c8a00/themes/gatsby-theme-minimal-blog-core/gatsby-node.js#L337-L347

【讨论】:

  • 绝对成功,正是我所需要的——也感谢分享 repo,看看它在实践中是如何工作的非常有用
猜你喜欢
  • 2020-01-10
  • 2021-07-25
  • 2019-06-21
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2021-10-24
  • 2019-03-17
  • 2020-08-24
相关资源
最近更新 更多