2017-08-26 49 views
3

第一次尝试盖茨比和它的一个很高兴。但是我遇到了一个奇怪的问题GraphQL:GraphQL忽略了一些(但不是全部)任意分配降价frontmatter数据

我使用的盖茨比源文件系统和盖茨比,变压器备注插件,从降价文件中提取内容。

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

现在的问题是,一些本人为地赋予frontmatter数据的GraphQL可用,有些不是。例如,如果我试图查询日期,我总是会得到类型为frontmatter_2的“GraphQL错误未知字段date”。而如果我查询标签,我会为那些包含一个的项目获取标签数组,而对于那些不包含这些项目的项目则获得标签数组。

这里有什么问题?我如何总能得到null作为节点中不存在的字段的值?

这也许注意到,这种行为变化取决于我的降价文件的目录结构。如果我移动它们,一些Frontmatter字段在GraphQL中变得可用,以前不是,反之亦然。它也发生了一些代码更改通过HMR被推送后,一些字段变得可用 - 但是在我重新启动Gatsby之后,尽管没有触及代码之间,它们又一次消失了。

非常感谢您的帮助!

编辑

失败敲我的头这一段时间后,我使出确保所有降价frontmatter具有相同类型的字段相同。

我猜

TODO链接到文档中的自动推理类型/场。

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

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

+0

不是一个直接的答案,但检查GraphiQL与盖茨比,这是一个巨大的帮助,了解什么时候可用的数据。 http:// localhost:8000/___ graphql – chmac

+0

感谢您的评论。我了解GraphiQL,这确实非常有帮助。然而,我的问题是关于gatsby-transformer-remark如何解析前端并决定哪些数据在节点接口中如何结束。 - 自从我问这个问题以来,有很多更新。也许它已被修复......我很快就要再试一次。 –

+0

Gatsby根据可用数据“推断”GraphQL模式。 [这](https://github.com/gatsbyjs/gatsby/issues/3913)问题表明,有些领域,如果不存在于每个记录,可能偶尔会被丢弃。确保每个文档都在每个文档上的解决方法可能是最强大的解决方案,至少现在是这样。 – chmac

回答

0

您可能会碰到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上添加测试以过滤特定节点类型

注意:这是完全未经测试的,关闭袖口,伪代码,请自担风险!

+0

非常感谢!我会尽快进行测试,并将其标记为答案。再次感谢! –

相关问题