我正在使用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
仍然会创建一个(空白(页面,我不希望这样:如果数据不好,我只希望跳过该页面(
所以我的问题是:如何在构建过程中处理错误/失败的页面创建,从而跳过失败的页面,而不是破坏整个构建
注意,这几乎是这个问题的重复,但那里的解决方案对我不起作用:我不能在数据不好的情况下呈现错误页面,如果这是可能的,我需要完全跳过页面
您应该为源数据显式定义GraphQL模式:https://www.gatsbyjs.org/docs/schema-customization/#creating-类型定义
这样,GraphQL调用将不会返回错误,而是为节点上丢失的字段返回null
。然后,您可以检查这些错误的值,并跳过createPage
调用。
例如,在我的这个主题中,我明确定义了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