GraphQL LogoGraphQL

内省

向 GraphQL 模式询问它支持的查询信息通常很有用。GraphQL 允许我们使用内省系统来做到这一点!

对于我们的星球大战示例,文件 starWarsIntrospection-test.ts 包含许多演示内省系统的查询,并且是一个可以运行以测试参考实现的内省系统的测试文件。

我们设计了类型系统,所以我们知道有哪些类型可用,但如果我们不知道,我们可以通过查询 __schema 字段来询问 GraphQL,该字段始终在查询的根类型上可用。现在让我们这样做,并询问有哪些类型可用。

哇,这么多类型!它们是什么?让我们把它们分组

  • Query、Character、Human、Episode、Droid - 这些是我们类型系统中定义的类型。
  • String、Boolean - 这些是类型系统提供的内置标量。
  • __Schema、__Type、__TypeKind、__Field、__InputValue、__EnumValue、__Directive - 这些都以双下划线开头,表示它们是内省系统的一部分。

现在,让我们尝试找出开始探索可用查询的最佳位置。当我们设计类型系统时,我们指定了所有查询的起始类型;让我们询问内省系统有关该类型的信息!

这与我们在类型系统部分所说的内容相符,即Query类型是我们开始的地方!请注意,这里的命名只是按照惯例;我们可以将我们的Query类型命名为任何其他名称,如果我们指定它是查询的起始类型,它仍然会在这里返回。但是,将它命名为Query是一个有用的约定。

检查一个特定的类型通常很有用。让我们看一下Droid类型

但是,如果我们想了解更多关于Droid的信息呢?例如,它是一个接口还是一个对象?

kind返回一个__TypeKind枚举,其中一个值为OBJECT。如果我们询问Character,我们会发现它是一个接口

对于一个对象来说,知道哪些字段可用是有用的,所以让我们询问内省系统关于Droid的信息

这些是我们定义在Droid上的字段!

id在那里看起来有点奇怪,它没有类型的名称。这是因为它是一种NON_NULL类型的“包装器”。如果我们查询该字段类型的ofType,我们将在那里找到ID类型,告诉我们这是一个非空ID。

类似地,friendsappearsIn都没有名称,因为它们是LIST包装器类型。我们可以查询这些类型的ofType,这将告诉我们它们是什么列表。

最后,让我们看看内省系统的一个对工具特别有用的功能;让我们向系统询问文档!

因此,我们可以使用内省访问有关类型系统的文档,并创建文档浏览器或丰富的IDE体验。

这只是内省系统的皮毛;我们可以查询枚举值、类型实现的接口等等。我们甚至可以内省内省系统本身。规范在“内省”部分对这个主题进行了更详细的说明,并且内省文件在GraphQL.js中包含实现符合规范的GraphQL查询内省系统的代码。

继续阅读 →GraphQL最佳实践