Gatsby: [讨论]功能:所有数据源的GraphQL模式快照,可解决未定义/空数据问题

创建于 2017-12-27  ·  92评论  ·  资料来源: gatsbyjs/gatsby

描述

当前,从数据源生成的GraphQL模式存在问题,在执行gatsby developgatsby build的那一刻,数据形状不完整,零件处于空状态或类型不同源数据是否已填写。 以下是一些示例问题。

  • #3009-WordPress数据源的某些属性设置为false时为空,即使它们应为对象或null
  • #1517&#2881-内容丰富的数据源,其中包含一些空/未定义的字段

如果随着数据源端数据形状的发展而变化,那么您可以创建完全填充的测试页或内容片段,这意味着没有空白字段,那将是很好的。 然后在Gatsby端上,您可以运行一个名为gatsby snapshot-schemas类的cli命令,它将获取当前数据源,通过常规的插件数据规范化路径运行源数据,通过现有的推断GraphQL模式代码运行数据最后,最后将生成的模式保存到/src的文件夹中,该文件夹称为schemas

在后续构建中,当Gatsby看到/src/schemas定义的模式时,可以跳过GraphQL模式的推断。 然后,可以将这些架构快照提交到站点仓库中,并允许数据形状更改需要新的快照,而不仅仅是数据源更改。 这些架构快照提供了许多可能性,例如验证传入数据形状的变化。 保存初始架构后,再次运行gatsby snapshot-schemas时,架构快照差异也会显示在Gatsby CLI中。

我希望从各种源代码插件的贡献者那里得到一些有关想法本身的反馈。 如果这个想法通过了气味测试,我希望获得一些有关快照应保存为哪种格式的反馈。 也许使用像gestalt-graphql之类的GraphQL模式语言会很好。

question or discussion

最有用的评论

我已经取得了一些进展。 决定暂时使用gatsby特定方法(在https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby/src/schema中添加对“强制类型”的支持),因为我发现它更易于使用而不是使用graphql模式对象。 我将尝试清理一下我的代码,以使其更具可读性,并在本周创建请求请求以在此处进行进一步讨论。

只是一点点潜伏的结果(imo很有希望):
我使用了https://github.com/gatsbyjs/gatsby-starter-blog,并在帖子中使用了frontmatter来模拟一些问题,这些问题可能导致由与架构不匹配的查询导致的构建错误:

// post #1
---
title: Hello World
date: "2015-05-01T22:12:03.284Z"
featuredImage: "sasalty_egg.jpg" // badly formatted value that wouldn't allow to make this File type 
test: "some string" // incompatible value type with other posts (in other posts test field is object) - it would be skipped in schema
---

// post #2
---
title: My Second Post!
date: "2015-05-06T23:46:37.121Z"
test:
  floatField: 5.5
  intField: 99
  arrayOfStringsField:
    - "it"
    - "works"
---

// post #3
---
title: New Beginnings
date: "2015-05-28T22:40:32.169Z"
test:
  stringField: "string"
  boolField: true
---

使用的类型定义:

type MarkdownRemark {
  frontmatter: frontmatter_forced_type
}

type frontmatter_forced_type {
  featuredImage: File
  title: ImageSharp
  test: TotallyCustomType
}

type TotallyCustomType {
  stringField: String
  floatField: Float
  intField: Int
  boolField: Boolean
  arrayOfStringsField: [String]
}

_注意:_这些不一定是完整的类型定义(在MarkdownRemark定义中,我只是强制frontmatter字段的类型不依赖自动类型命名)

使用更改之前,frontmatter的外观如下(没有test字段, featuredImage字段
before

之后:
after

所有92条评论

这似乎是一个有趣的想法,因为无论来源如何,它都应该起作用。 这绝对适合我的用例。
尽管我对简单字段很有信心,但是我想知道它对资产如何工作。

关于资产的好问题。 我认为对于资产,大多数数据源将它们表示为带有URL或资产路径的字符串。 模式快照仅将类型表示为带有URL /路径的字符串,或者是具有带有URL /路径的字符串属性的资产对象。

似乎是一个有趣的想法,但是为什么不跳过快照的额外间接操作并完全定义架构呢? 就像我们要去做一个完整的数据示例一样,直接指定gql模式同时还更清晰似乎没有更多的工作吗?

@jquense就是我在想的。 您可以运行命令来“快照”动态生成的模式,该模式将以标准graphql格式写出该模式的文件,也可以直接自己写相同的格式。

是的,我绝对喜欢将其保持打开状态以便与“快照”功能一起从头开始编写架构的想法。 我从“快照”功能中看到的好处是能够使自己轻松学习GraphQL模式语法并减少使用Gatsby和任何源插件启动和运行所需的样板代码量。

我目前正在研究..中Gatsby模式推断逻辑的内部。
https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby/src/schema
并熟悉如何定义GraphQL模式。 我将尝试尽快创建有关概念PR的证明。

我完全理解让用户喜欢新事物,但是我认为插件有点不同。 通常期望作者已经了解了gql,并且在使用源代码插件时,除了查询之外,用户通常不必搞乱其他任何事情。

这就是说,就定义速度而言,用于定义所述模式的模式语言可能不如查询复杂。 我认为,允许插件作者提供一个.graphql文件比花一个快照处理一个全面的数据对象要好得多,后者甚至不足以完全正确地定义模式。

我想提一下,尽管使用graphql-js而不是terser模式语言,但已经可以通过gatsby api手动定义模式并提供支持。

我了解插件作者应该已经了解gql和用户
不需要弄乱架构。 但是问题是模式
从源数据推断得出的结果很多时候都是不完整的
关于源数据的当前状态(请参阅我在
本期开幕)。 所以我看的方式是为了让用户不要
真的很麻烦,不得不从头开始编写模式,他们
可以设置源数据以完成,拍摄架构快照并
然后让盖茨比继续使用该快照。 这样用户可以避免
必须从头开始编写模式才能解决空/未定义的数据
导致graphql查询失败。

您还可以详细说明一下“我认为时间会更好一些”
花了允许插件作者提供.graphql ...”将起作用吗?

2017年12月28日,星期四,8:27 AM Jason Quense [email protected]
写道:

我完全理解让用户适应新事物,但是我认为
插件有点不同。 一般希望作者能够理解
gql已经存在,用户通常不必与其他任何东西混淆
而不是使用源插件时进行查询。

也就是说,用于定义所述架构的架构语言可能是
在提高速度方面,它比查询要简单。 我认为
最好花时间允许插件作者提供.graphql
文件,而不是使用快照来处理全面的数据对象,这可能
甚至不足以完全正确地定义架构。

我想提一下,手动定义架构已经
尽管使用了graphql-js,但仍可以通过gatsby api进行支持
简要模式语言。

-
您收到此消息是因为您创建了线程。
直接回复此电子邮件,在GitHub上查看
https://github.com/gatsbyjs/gatsby/issues/3344#issuecomment-354288169
或使线程静音
https://github.com/notifications/unsubscribe-auth/AAuc_6X_eEWEf281KUspXxB1NuPZPeC4ks5tE5clgaJpZM4RNLJn

因此,我认为我们在解决此问题的地方彼此缺少:)在WordPress示例中,我认为与其完全依赖于模式推断的插件,不如说它应该完全指定可能存在的字段,例如所有可空字段。 这样,用户根本不会遇到问题,因为gatsby将具有数据源的完整架构。

在插件作者可能无法知道所有字段的情况下,我仍然认为,尽管学习曲线更多,但最终将变得更准确,并且用户提供粗略模式与伪造的错误更少被推断为架构的数据。 是的,您需要预先了解更多信息(并且我们应该为此提供良好的文档),但是您可以避免用户需要了解gatsby如何推断模式的内部工作原理。 例如,如果用户想要指定日期字段,则(我认为)更简单地学习直接指定日期,而不是知道提供将被推断为日期的iso兼容字符串。 加上许多其他功能,例如连接两个数据节点或指定为nullablability,仅在使用架构定义与数据对象时才真正可行

那两个不同的插件呢? 一种允许我们轻松地在文件中指定架构,另一种允许我们从特定来源生成该文件。
因此,源可能会有所不同...例如,每个字段都完整的有内容的空间可能是生成模式的源。 然后,可以在具有相同体系结构的任何有内容的空间上使用该架构。 当然,如果需要,我们仍然可以手动调整架构。
无论如何,似乎插件no1是第一步。 我们可能仍会决定何时完成下一步该做什么。
@jquense某处有一个手动定义模式的示例? 我不知道有可能。

我喜欢两个插件的想法。 我认为API @jquense在谈论
https://www.gatsbyjs.org/docs/node-apis/#setFieldsOnGraphQLNodeType。
我认为它只允许向架构中添加字段,对吗? 并且不覆盖
推断出什么。

在2017年12月28日星期四上午10:06 M4rrc0 [email protected]写道:

那两个不同的插件呢? 一种可以让我们轻松指定
文件中的模式,另一个用于从特定文件生成该文件
资源。
因此来源可能有所不同...例如,一个有争议的空间
每个字段都是完整的,可能是生成模式的来源。 然后
该模式可用于任何具有相同内容的空间
建筑。 当然,如果出现以下情况,我们仍然可以手动调整模式
需要。
无论如何,似乎插件no1是第一步。 我们可能仍然
决定何时完成下一步操作。
@jquense https://github.com/jquense在某处有一个示例
手动定义的架构? 我不知道有可能。

-
您收到此消息是因为您创建了线程。
直接回复此电子邮件,在GitHub上查看
https://github.com/gatsbyjs/gatsby/issues/3344#issuecomment-354302287
或使线程静音
https://github.com/notifications/unsubscribe-auth/AAuc_4fqrocUXxBPkFsK2tFn2VVDduv3ks5tE66AgaJpZM4RNLJn

是的,我认为您是对的,并不会全部覆盖:/

我一般都喜欢使用插件来解决问题,但我认为这类事情可能需要在核心api中处理才能获得正确的可用性说明(我可能完全错了)。 在我的脑海中,理想的api只是将gatsby指向.graphql文件,其余的工作就完成了,但这可能不如我想象的那么好。 我认为,如果可能的话,在进入核心之前,所有可能都值得在插件中进行探索……我当然要遵从Kyle的想法,因为他是老板:)

好的,我将围绕第一个用于定义的插件进行探索
模式作为.graphql文件。 我也很想听听Kyle的意见:)
感谢大家的热烈讨论!

2017年12月28日星期四,上午10:31杰森·昆斯(Jason Quense) [email protected]
写道:

是的,我认为您是对的,并不会全部覆盖:/

我通常支持使用插件来解决问题,但我认为这种方式
可能需要在核心api中处理事物以达到正确的可用性
笔记(我可能完全是错的)。 在我看来,理想的api是
只是将gatsby指向.graphql文件,其余的工作就完成了,但这可能
不像我想象的那样好。 我认为所有这些都值得探索
如果可能的话,在可能进入核心之前使用插件...我当然
顺应凯尔的想法,因为他是老板:)

-
您收到此消息是因为您创建了线程。
直接回复此电子邮件,在GitHub上查看
https://github.com/gatsbyjs/gatsby/issues/3344#issuecomment-354306088
或使线程静音
https://github.com/notifications/unsubscribe-auth/AAuc_6wNLHfte9zCZ2OqgirIMRadX609ks5tE7RTgaJpZM4RNLJn

@ jsanchez034您是否对它有更多了解? 下周我将适当地尝试工作,如果您进行了一些研究并可以分享您的发现,我很感兴趣

嗨Michal,我进行了一些研究,并牢记了一些下一步。 我会发布
我几个小时后恢复使用机器时的发现。

2018年1月5日星期五,7:16 PM Michal Piechowiak [email protected]
写道:

@ jsanchez034 https://github.com/jsanchez034您是否对其进行了进一步研究?
下周我将尝试进行此工作,如果您做了,我很感兴趣
一些研究,可以分享您的发现

-
您收到此邮件是因为有人提到您。

直接回复此电子邮件,在GitHub上查看
https://github.com/gatsbyjs/gatsby/issues/3344#issuecomment-355699899
或使线程静音
https://github.com/notifications/unsubscribe-auth/AAuc_3w7px_NJjL2EKl8G5TP1GJgQFVWks5tHrtNgaJpZM4RNLJn

@pieh ,我开始研究如何将全新的模式注入Gatsby从源数据推断的模式中。 因此,我认为可以创建一个插件来向Gatsby添加架构。 以下是我对该插件的说明...

模式编写器插件

插件应该做什么?

  • 选取一个架构和解析器,然后将生成的架构缝合到主要的Gatsby架构中

    • src/schema查找文件夹,每个文件夹都有一个架构和解析器文件

    • 插件将获取所有文件,并通过graphql-tool npm软件包的makeExecutableSchema运行它们

    • 创建一个新的Gatsby Node API函数,该函数称为mergeSchema使用graphql-tool Schema缝合的Schema创建文件中的此行之前被调用 GraphQL工具通过src/schema手动创建的模式来缝合Gatsby产生的模式

  • 应该使用createNode为新模式设置一些虚拟样本数据

这些是我对模式编写器插件的粗略注释。 @MarcCoet提到的另一个插件是一个您可以将其指向域上的端点的域,该域中的数据被设置为处于完整状态,然后将生成模式并保存到src/schema

注意:模式将使用GraphQL类型语言定义

不幸的是,我不认为graphql-tools在这里可以正常工作,因为它是要合并完整的架构(包括定义和数据/解析器)并在这些架构之间添加链接。

mergeSchemas函数的文档(https://www.apollographql.com/docs/graphql-tools/schema-stitching.html#mergeSchemas)中了解有关合并的传递模式的信息:

schemas是GraphQLSchema对象或字符串的数组。 对于字符串,将仅使用扩展类型声明。 如上例所述,传递字符串对于将字段添加到现有类型以将架构链接在一起非常有用。

我们宁愿使用字符串选项,因为GraphQLSchema需要定义至少1个查询(否则会引发错误),但是扩展类型不允许覆盖字段类型。 尝试覆盖现有字段时引发错误(未调用冲突解决函数,因此我们对此无能为力):

Field "frontmatter.title" already exists in the schema. It cannot also be defined in this type extension

至于第二个选项(使用GraphQLSchema ),我通过添加虚拟查询来“破解”它,但是最初的问题是我不能使用“主”模式中的类型-我们不能简单地做到这一点:

type frontmatter {
  featuredImage: File
  title: String
}

因为文件未在此附加模式中定义。 我们可能会附加内置类型,这样它就可以工作,但是我想尝试“愚弄”该工具来完成它设计不了的工作(至少在目前是这样)。

我将尝试评估另外2种方法:

  • 搜索或制作旨在修改现有模式的工具(这将是更通用的graphql工具)
  • 或在创建架构时在字段上强制用户/插件定义的类型(具体取决于gatsby)

我已经取得了一些进展。 决定暂时使用gatsby特定方法(在https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby/src/schema中添加对“强制类型”的支持),因为我发现它更易于使用而不是使用graphql模式对象。 我将尝试清理一下我的代码,以使其更具可读性,并在本周创建请求请求以在此处进行进一步讨论。

只是一点点潜伏的结果(imo很有希望):
我使用了https://github.com/gatsbyjs/gatsby-starter-blog,并在帖子中使用了frontmatter来模拟一些问题,这些问题可能导致由与架构不匹配的查询导致的构建错误:

// post #1
---
title: Hello World
date: "2015-05-01T22:12:03.284Z"
featuredImage: "sasalty_egg.jpg" // badly formatted value that wouldn't allow to make this File type 
test: "some string" // incompatible value type with other posts (in other posts test field is object) - it would be skipped in schema
---

// post #2
---
title: My Second Post!
date: "2015-05-06T23:46:37.121Z"
test:
  floatField: 5.5
  intField: 99
  arrayOfStringsField:
    - "it"
    - "works"
---

// post #3
---
title: New Beginnings
date: "2015-05-28T22:40:32.169Z"
test:
  stringField: "string"
  boolField: true
---

使用的类型定义:

type MarkdownRemark {
  frontmatter: frontmatter_forced_type
}

type frontmatter_forced_type {
  featuredImage: File
  title: ImageSharp
  test: TotallyCustomType
}

type TotallyCustomType {
  stringField: String
  floatField: Float
  intField: Int
  boolField: Boolean
  arrayOfStringsField: [String]
}

_注意:_这些不一定是完整的类型定义(在MarkdownRemark定义中,我只是强制frontmatter字段的类型不依赖自动类型命名)

使用更改之前,frontmatter的外观如下(没有test字段, featuredImage字段
before

之后:
after

嗨@pieh! 感谢您接受此操作,您的解决方案看起来很有希望! 抱歉,在过去的两周里,我无法为这个问题做出更多贡献,我没有时间深入探讨这个问题。 让我知道是否有什么我可以帮助的。

如果有人感兴趣,您可以查看我的代码更改https://github.com/gatsbyjs/gatsby/compare/master...pieh:schema_wip (在删除了一些无效代码并重构了某些东西之后,我昨天所拥有的代码比我少得多)以为:))。

没有时间把PR的评论和描述很好地用于网站测试,所以我想现在就分享我的代码。 如果有人想使用它-将带有模式定义的gatsby-schema.gql文件放在项目的根目录中(以及gatsby-node.js等)。

这有可能进入公关吗?
我想很多人都会很高兴。

@MarcCoet更多,我更加深入了这段代码,我意识到,我在那个分支中的方法只能用作概念证明。 我计划进行这项工作以使其正确执行,但这项任务比我最初预期的要大得多(因为我正在学习更多有关当前模式创建的完成方式以及它提供的功能的信息,而我以前并不了解编码的东西)

因此,当前的架构创建如下所示:
current

对于每种类型的源,实现都会加倍。 我的概念证明(链接的分支)仅添加了另一个来源,现在我们将其增加了三倍:
poc

仅以当前形式添加它是无法维持的。

我想做的是,看起来像这样:
proposed
但这需要进行一些重大的重构/返工,因为当前的架构创建是通过从数据推断类型作为唯一数据源而设计的。 之后,添加其他资源对于我在概念验证过程中获得的知识将是微不足道的。

我想为此创建RFC问题(本周早些时候创建了流程图:))。 只是需要获得一些空闲时间来真正致力于讨论,这将开始。

@MarcCoet我个人已经暂时将我所有的项目移到了static-static,因为此功能对我来说本质上是一个大问题。
但是我计划在第二次修复后改回盖茨比。

我创建了有关重构的RFC问题(https://github.com/gatsbyjs/gatsby/issues/4261),如果有人有兴趣参加讨论,请这样做。

感谢您的更新和@pieh的工作。 我将密切关注RFC问题。

大家好。 有任何更新吗? 目前,我们可以使用Gatsby + Contentful作为阻止程序/显示阻止程序,只是想知道是否有任何积极的进展,或者我们是否应该考虑其他选择。 谢谢。

@ i8ramin目前还没有活跃的发展,我计划本周开始。

嗨,大家好,请检查是否有人在此问题上取得了进展-我们在处理Contentful> Gatsby中的可选/空白字段时才发现它-因此,有一个解决方案会很不错-显然:)预先感谢!

@pieh ,只是想知道开发中是否发生了什么事情? 很想将Gatsby与Contentful一起用于项目,但是,这有点阻碍。 提前加油!

@nicolaslair@nathanjdunn ! 抱歉,此方面缺少更新。 我不得不暂停该项目(再次),将时间暂时集中在gatsby v2上。 我希望我有更好的消息:(

@pieh ,这个问题会在Gatsby v2中解决吗?

尚未计划在v2中使用此功能-此功能不会破坏更改,因此计划尽快推出v2,然后在v2次要版本之一中添加此功能

@pieh和其他任何人,我正在做一个杂乱的Noramlizer,以确保GraphQL始终具有相同的数据模型,而不管可选/空字段等如何。有人在开发更多核心之前提出了更好的解决方法吗?

我使用的模式是创建“虚拟”条目(在CMS / markdown中),该条目将填充所有可选字段,稍后在构建gatsby站点时,我将在查询中进行过滤,因此虚拟节点不会显示在结果中。

@pieh是个好主意,谢谢,我想我会努力的

作为参考,我现在实际上在源插件中执行此伪条目变通方法,这使CMS团队保持满意,这意味着伪条目的规范化和排除在Gatsby代码中而不是CMS或UI React组件中进行。

@dominicchapman Care是否为此创建了一个演示
或中等职位?
或此时的任何东西

任何新闻?

刚刚看到@Undistraction的插件https://github.com/Undistraction/gatsby-plugin-node-fields

一种简单,一致的方法来管理节点上的字段创建,并支持默认值,值的转换和验证

我认为这应该是核心的一部分...我一定会尝试的。

有任何更新吗?

v2发布后将恢复。 我没有带宽来同时处理v2

在V2之后的某个时候是否有建议的解决方法,然后再次解决?
如果这么多使用GatsbyJS的人从未需要可选字段,这听起来很奇怪。 我将它与Contentful btw一起使用。

我们还将它与Contentful结合使用,这种行为使我们发疯。 如我们所见,Contentful插件在这里主要是错误的,因为(据说)从接收的数据而不是从通过API接收的实际内容类型模式构造模式。

@westmark内容

至于解决方法-如果可能,为每个将包含所有可选字段的内容类型创建虚拟条目,然后在创建页面或条目列表时过滤掉该虚拟条目。 虚拟条目数据将确保构建完整架构

@pieh感谢您的

@pieh我不知道-谢谢您的澄清。 那么,接下来的问题是,插件作者是否有可能在将缺失的数据传递给Gatsby之前为其注入虚拟值? 如果Gatsby将undefined作为值的键允许输入架构,则我认为这是一种更好的解决方法。

我们还通过gatsby-source-ghost遇到了这个问题。 我们的数据模式具有很多字段,这些字段可以合法地返回为null,因此被Gatsby省略。

我100%听到并了解,关于此的任何工作都将暂停到v2之后(我非常期待)。 我想将Ghost源代码插件标记为发生这种情况的另一个很好的示例,并提供帮助以帮助我们在有时间恢复此问题时可以做些什么🙂

问题:在V2中,我们可以使用它来避免“查询丢失的数据”问题吗?

https://next.gatsbyjs.org/docs/actions/#addThirdPartySchema

换句话说,Contentful插件可以使用此功能为尚无数据/条目的内容模型注入模式吗?

@pieh您是否有时间完善它并开始任何开发? 😁

大家好,我是GatsbyJS的新手,但是使用Contentful已有很长时间了,我才开始尝试该框架并使用GraphQL。 快速解决此问题,因为在Contentful中具有可选字段通常很有用。

但是,我发现您是否要提取一个集合(例如allContentfulNews等),并且该集合中至少有1个条目包含所有字段的内容(在我的情况下,我有一个可选的“到期日期” '),那么它将不会中断构建,并且“到期日期”为空的条目将返回null 。 因此,作为一种解决方法,我计划保留此“模板”帖子,并将其隐藏在前端。

@moreguppy我有一个类似的解决方案。 您创建一个就绪页面_Test_并隐藏此页面。 例如:

allContentfulPageExample( filter: { title: { ne: "Test" } } )

@moreguppy @loeildes是的,这正是我们与此同时解决的方式。 但是,从长远来看,这使它变得更加困难,每次添加新的内容模型/新字段时,都需要创建/更新所有创建的“虚拟”条目。

创建虚拟条目对我来说是一项临时工作。 由于上述原因不理想,这是否有可能很快出现?

仍然看不到解决办法? 我们将在21天内发布

@ bgnz968极不可能在21天之内找到正确的修复(或功能)土地。 我在这里没有任何约会。 这里有很多问题需要解决-一些与gatsby内置推断模式有关,一些与第三方缝合模式有关(https://github.com/gatsbyjs/rfcs/pull/11)。

图我也将大火记录在日志中...我还必须执行“虚拟条目”变通方法,以避免在少数使用gatsby-source-prismic的项目上产生损坏。 就像@stoltzrobin所说:这是一个足够好的临时修复程序,但是很老套。

模式快照感觉到要获得看起来如此基本和必不可少的东西(即可选数据字段)的步骤太多了。 但这听起来像是这样,或者明确编写期望的模式是允许可选数据字段比简单字符串或数字更复杂的唯一方法。

我还使用虚拟条目解决方法来解决此问题,但同意它是很棘手的。 希望看到修复!

还使用@loeildes解决方案。 只是在这里添加我的声音,希望不久会有更好的解决方案。

嘿伙计,
我尚未对此进行测试,但这可能是一种不需要创建虚拟内容的潜在的“清洁”解决方法。

https://medium.com/@Zepro/contentful -reference-fields-with-gatsby-js-graphql-9f14ed90bdf9

@Khaledgarbaya我没有太多时间来测试您的解决方案,但是,乍一看,我似乎只能通过传播Node来做到这一点?

... on Node {
    ... on FieldType {
     # ...
   }
}

是的,解决方法仅适用于“多态”引用,不适用于普通的可选字段

可能迟到了聚会,在Drupal源插件上也偶然发现了这一点,不仅是因为缺少字段,而且还因为缺少实体而使片段无法正常工作。

我相信@pieh解决方法就足够了,但是我想提一下。

我在这里看到使用http://json-schema.org/拍摄的https://www.drupal.org/project/schemata有用。 也许我们可以利用这一点,并提供一种可选的方式来提供json模式而不是进行推断。 然后,如何公开此json模式将部分取决于插件。

对此进行修复将是很棒的。 使用占位符内容确实有效,但会让人感到有些头疼,尤其是当您嵌套引用时

我在#10856中创建了一个类似但范围略有不同的问题-源插件如何解决缺少字段和节点类型的问题,只要有可用的架构来告知Gatsby有关丢失的内容。

@rexxars还有与此相关的另一张票证//github.com/gatsbyjs/gatsby/issues/4261@stefanprobst在允许提供类型的原型上进行了工作-请特别检查此评论https://github.com/gatsbyjs/gatsby/issues/4261#issuecomment -442549881-有定义Node类型及其形状的示例(即使没有可用数据推断)

@pieh谢谢! 这看起来很有希望!

原始帖子来自2017年12月。开始失去希望,我们将永远找不到合适的解决方案。

我知道这不能解决此版本的盖茨比中的问题,但是根据我的经验,盖茨比2.0的gatsby-source-graphql几乎消除了模式推断问题。

大家:#11480正在积极进行这项工作。

我们已经准备好新的Schema Customization API的Alpha版本,非常感谢您的反馈! 有关更多信息,请查看此博客文章

这非常令人激动,感谢您@stefanprobst的辛勤工作!

我已经在预览中看到了新的API:但是,我不清楚如何用它来“快照”现有的graphql模式来解决此票证中讨论的问题。 我看到例如有https://www.gatsbyjs.org/packages/gatsby-plugin-extract-schema/ ,其中包含一些简单的代码将架构提取到json文件。 那样的想法会否被再次“喂”到gatsby模式中?

(因为这是我们目前在项目中遇到的最大的麻烦,使用drupal + gatsby_source_drupal插件,所以使我不胜其烦,能够很好地对其进行修复非常好)。 :)

@vermario尚不支持创建架构快照主机。 但是它应该比创建快照更好地解决该问题。 合并后,我们将开始为插件(包括Drupal一个)实现类型定义。 如果Drupal具有自省端点(我不是drupal的专家)。 这样,即使没有任何数据,我们也可以生成正确的架构,因此根本不需要快照

@pieh听起来很棒:我们将继续关注这个空间。 同时,我们将添加“测试”内容(:/),并在构建时从graphql查询中排除该内容。 感到“肮脏” :)谢谢!

将新的架构自定义与gatsby-source-contentful一起使用时,我遇到问题。

定义其中一个字段指向引用数组的类型总是返回null

即:

type ContentfulPage implements Node {
   editorTitle: String
   title: String
   slug: String
   sections: [ContentfulSection] // im always null 
}

iya!

这个问题已经悄无声息。 幽灵般的安静。 👻

我们遇到了很多问题,因此我们目前在闲置30天后就关闭了问题。 从上一次更新到现在已经至少20天了。

如果我们错过了此问题,或者您想使其保持打开状态,请在此处回复。 您也可以添加标签“ not stale”以保持此问题的状态!

感谢您加入盖茨比社区! 💪💜

又见面了!

在此问题上发生任何事情已有30天了,因此我们友好的邻居机器人(就是我!)将关闭它。

请记住,我只是一个机器人,所以如果我错误地解决了这个问题,我就是HUMAN_EMOTION_SORRY 。 如果您还有其他需要,请随时重新打开此问题或创建一个新问题。

再次感谢您加入盖茨比社区!

将新的架构自定义与gatsby-source-contentful一起使用时,我遇到问题。

定义其中一个字段指向引用数组的类型总是返回null

即:

type ContentfulPage implements Node {
   editorTitle: String
   title: String
   slug: String
   sections: [ContentfulSection] // im always null 
}

@ sami616我发现这种方法有效:

// In gatsby-node.js
exports.sourceNodes = ({ actions }) => {
  const { createTypes } = actions
  const typeDefs = `
    type ContentfulPage implements Node {
      sections: ContentfulSection
    }
    type ContentfulSection implements Node {
      title: String
    }
  `
  createTypes(typeDefs)
}

似乎对于参考字段,您还必须定义要参考的模型的形状

所以我正在努力解决。 我在“ ContentfulHomepage”的内容类型上有一个“ Video”字段(内容中不需要),其中引用字段称为“ Blocks”,称为“ ContentfulBlockHomepageBanner”。

如果视频字段包含内容,效果很好...但是如果为null,则会掉落,所以这是我在空白字段问题上的尝试。

在下面查询。
Screenshot 2019-05-02 at 11 35 41

我的尝试
Screenshot 2019-05-02 at 11 34 59

错误出...
Screenshot 2019-05-02 at 11 34 41

谁能指出我在哪里出问题了? 谢谢。

又见面了!

在此问题上发生任何事情已有30天了,因此我们友好的邻居机器人(就是我!)将关闭它。

请记住,我只是一个机器人,所以如果我错误地解决了这个问题,我就是HUMAN_EMOTION_SORRY 。 如果您还有其他需要,请随时重新打开此问题或创建一个新问题。

谨在此提醒您:解决此问题或其他任何问题的最佳方法是打开请求请求。 请查看gatsby.dev/contribute ,以获取有关打开PR,分类问题和提供帮助的更多信息!

再次感谢您加入盖茨比社区!

我是唯一仍然有这个问题的人吗?

抱歉,我们正在为此努力。 我将其设置为不过期,因此该漫游器停止将其关闭。

将新的架构自定义与gatsby-source-contentful一起使用时,我遇到问题。
定义其中一个字段指向引用数组的类型总是返回null
即:

type ContentfulPage implements Node {
   editorTitle: String
   title: String
   slug: String
   sections: [ContentfulSection] // im always null 
}

@ sami616我发现这种方法有效:

// In gatsby-node.js
exports.sourceNodes = ({ actions }) => {
  const { createTypes } = actions
  const typeDefs = `
    type ContentfulPage implements Node {
      sections: ContentfulSection
    }
    type ContentfulSection implements Node {
      title: String
    }
  `
  createTypes(typeDefs)
}

似乎对于参考字段,您还必须定义要参考的模型的形状

@silviopaganini我发现在过渡期间这是一个很好的解决方案

是的现在尝试此操作似乎可行,但它不可扩展...我正在使用一个巨大的网站,如果我必须为所有非必填字段创建页面,那不是一件好事,但是现在可以使用

@moreguppy我正在尝试解决gatsby-source-wordpress的类似问题,但是当我将此代码添加到gatsby-node.js时,我收到以下消息:

错误:模式必须包含唯一命名的类型,但是包含多个名为“ wordpress__PAGEAcf”的类型。

我的代码:

exports.sourceNodes = ({ actions }) => {
  const { createTypes } = actions
  const typeDefs = `
    type wordpress__PAGEAcf implements Node {
      enter_content: String
    }
  `
  createTypes(typeDefs)
}

没关系,对于任何遇到类似问题的人,这是正确的格式,可以解决此问题:

exports.sourceNodes = ({ actions }) => {
  const { createTypes } = actions
  const typeDefs = `
    type wordpress__PAGE implements Node {
      acf: wordpress__PAGEAcf
    }
    type wordpress__PAGEAcf implements Node {
      enter_content: String
    }
  `
  createTypes(typeDefs)
}

又见面了!

在此问题上发生任何事情已有30天了,因此我们友好的邻居机器人(就是我!)将关闭它。

请记住,我只是一个机器人,所以如果我错误地解决了这个问题,我就是HUMAN_EMOTION_SORRY 。 如果您还有其他需要,请随时重新打开此问题或创建一个新问题。

谨在此提醒您:解决此问题或其他任何问题的最佳方法是打开请求请求。 请查看gatsby.dev/contribute ,以获取有关打开PR,分类问题和提供帮助的更多信息!

再次感谢您加入盖茨比社区!

https://github.com/gatsbyjs/gatsby/issues/3344#issuecomment -505001979开始重新打开并添加not stale标签

如果有人可以在#16291中提供一些实际测试,我将非常感激。 谢谢!

我们在#16291中提供了用于模式锁定的开放PR。 如果仍然对看到这片土地感兴趣的人可以分享一些反馈,那就太好了。 谢谢!

@stefanprobst 。 很棒的工作!
这么晚才回复很抱歉。 这个问题已经拖延了很长时间,以至于我习惯了变通方法,对我而言,这不再是一个主要问题。 它是如此的整洁,尽管它正在向前发展! :)
我给了它一个快速尝试,它无缝地工作! 那是罕见的致敬。 ; D
我正在为一个项目进行重大更新,在接下来的几周中,我将进行更多的“现实世界”测试。 我会在公关中进一步评论。
非常感谢您的工作!

@stefanprobst关于#19210的任何想法

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

ghost picture ghost  ·  3评论

rossPatton picture rossPatton  ·  3评论

totsteps picture totsteps  ·  3评论

hobochild picture hobochild  ·  3评论

theduke picture theduke  ·  3评论