4

第一次尝试盖茨比,很高兴。但是我遇到了一个奇怪的 GraphQL 问题:

我正在使用 gatsby-source-filesystem 和 gatsby-transformer-remark 插件从 markdown 文件中提取内容。

所有的frontmatter数据都不相同(除了title)。有些有一个date字符串(博客文章),同样有一个tag数组,有些有一个gallery对象。

现在的问题是,这些任意分配的 frontmatter 数据中的一些在 GraphQL 中可用,而有些则不可用。例如,如果我尝试查询日期,我总是会得到“GraphQL Error Unknown field dateon type frontmatter_2”。而如果我查询标签,我会得到包含一个和tags: null不包含的那些项目的标签数组。

这里有什么问题?如何始终获取null节点中不存在的字段的值?

值得注意的是,这种行为会根据我的降价文件的目录结构而改变。如果我移动它们,GraphQL 中的一些 frontmatter 字段将变得可用,而以前不可用,反之亦然。还有一种情况是,在通过 HMR 推送一些代码更改后,一些字段变得可用 - 但在我重新启动 Gatsby 后,尽管没有触及中间的代码,它们又消失了。

非常感谢您的帮助!

编辑

在尝试了一段时间没有成功之后,我求助于确保所有 markdown frontmatter 具有相同类型的相同字段。

我猜是

TODO 链接到关于自动推断类型/字段的文档。

部分文档是关于这个问题的。

当我有更多时间时,我想了解更多关于 GraphQL 以及它在 Gatsby 中的工作原理。任何指针表示赞赏。

4

1 回答 1

4

您可能遇到了这个错误,有时 GraphQL 似乎遗漏了稀疏填充的字段。

但是,要回答您的具体问题,您如何确保始终获得null空字段。你可以通过使用onCreateNode钩子来做到这一点。每个节点都会调用这个钩子。

类似以下伪代码的内容将实现您的目标:

exports.onCreateNode = ({node, getNode, boundActionCreators}) => {
  const { createNodeField } = boundActionCreators

  if (_.get(node, 'internal.type') === `MarkdownRemark`) {

    // Repeat this for each field
    createNodeField({
      node,
      name: 'date',
      value: _.get(node, 'frontmatter.date', 'default date'),
    })

  }
}

这将从frontmatterto复制值,fields并确保它们始终以某些默认值存在(如果它们尚不存在)。您可以添加测试node.internal.type以过滤特定节点类型

注意:这是完全未经测试的,即开即用的伪代码,使用风险自负!

于 2018-02-19T13:38:12.420 回答