GraphQL 忽略了一些(但不是全部)任意分配的 markdown frontmatter 数据

Posted

技术标签:

【中文标题】GraphQL 忽略了一些(但不是全部)任意分配的 markdown frontmatter 数据【英文标题】:GraphQL ignores some (but not all) arbitrarily assigned markdown frontmatter data 【发布时间】:2018-02-04 08:12:33 【问题描述】:

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

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

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

现在的问题是,这些任意分配的 frontmatter 数据中的一些在 GraphQL 中可用,而有些则不可用。例如,如果我尝试查询日期,我总是得到“GraphQL 错误未知字段date on type frontmatter_2”。而如果我查询标签,我会得到包含 1 的项目的标签数组和不包含的项目 tags: null

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

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

非常感谢您的帮助!

编辑

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

我猜

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

documentation 的一部分是关于这个问题的。

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

【问题讨论】:

不是一个直接的答案,但请查看带有 Gatsby 的 GraphiQL,它对于了解什么时候可用的数据非常有帮助。 localhost:8000/___graphql 感谢您的评论。我知道 GraphiQL,它确实很有帮助。但是,我的问题是关于 gatsby-transformer-remark 如何解析 frontmatter 并决定哪些数据最终如何在节点接口中结束。 – 自从我问这个问题以来,它已经有很多更新了。也许它已经修复了……我得尽快再试一次。 Gatsby 从可用数据中“推断”出 GraphQL 模式。 This 问题表明某些字段(如果不是每条记录中都存在)可能偶尔会被删除。确保每个文档都包含每个字段的解决方法可能是最可靠的解决方案,至少目前是这样。 【参考方案1】:

您可能遇到了this 错误,有时 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'),
    )

  

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

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

【讨论】:

非常感谢!我会尽快对此进行测试,如果可行,将其标记为答案。再次感谢!

以上是关于GraphQL 忽略了一些(但不是全部)任意分配的 markdown frontmatter 数据的主要内容,如果未能解决你的问题,请参考以下文章

我们如何允许用户在 SharePoint 网站上管理一些权限,但不是全部?

似乎它忽略了 apollo graphql 中的更新突变?

Gatsby WordPress Source - 不使用时被 graphql 忽略的灵活内容布局

从列表中删除元组删除了一些但不是全部

使用 Shiro 插件保护 Grails 应用程序中的一些页面,但不是所有页面

nginx 提供一些(但不是全部)php 文件作为下载