首页 文章

GraphQL忽略了一些(但不是全部)任意分配的降价前端数据

提问于
浏览
3

第一次尝试盖茨比,这是一种乐趣 . 但是我遇到了一个奇怪的GraphQL问题:

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

所有这些数据的前端数据都不相同( title 除外) . 有些人有 date 字符串(博文),同样有 tag 数组,有些有 gallery 对象 .

现在的问题是,一些任意分配的前端数据在GraphQL中可用,而另一些则不然 . 例如,如果我尝试查询日期,我总是得到“GraphQL Error Unknown字段 date on type frontmatter_2 ” . 然而,如果我查询标签,我会为那些包含一个标签的项目获取标签数组,而对于那些没有标签的人,我会得到 tags: null .

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

可能需要注意的是,此行为会根据我的markdown文件的目录结构而改变 . 如果我移动它们,一些Frontmatter字段在GraphQL中可用,以前没有,反之亦然 . 在通过HMR推送一些代码更改之后,也会发生一些字段变得可用 - 但是在我重新启动Gatsby之后,尽管没有触及中间的代码,但它们仍然消失了 .

非常感谢您的帮助!

Edit

在用一段时间不成功地撞击我之后,我采取了确保所有降价前线具有相同类型的相同字段的方法 .

我想是的

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

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

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

1 回答

  • 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 上添加测试以筛选特定节点类型

    注意:这是完全未经测试的,不包括袖口,伪代码,使用风险自负!

相关问题