向 GraphQL 模式询问它支持的查询信息通常很有用。GraphQL 允许我们使用内省系统来做到这一点!
对于我们的星球大战示例,文件 starWarsIntrospection-test.ts 包含许多演示内省系统的查询,并且是一个可以运行以测试参考实现的内省系统的测试文件。
我们设计了类型系统,所以我们知道有哪些类型可用,但如果我们不知道,我们可以通过查询 __schema
字段来询问 GraphQL,该字段始终在查询的根类型上可用。现在让我们这样做,并询问有哪些类型可用。
哇,这么多类型!它们是什么?让我们把它们分组
现在,让我们尝试找出开始探索可用查询的最佳位置。当我们设计类型系统时,我们指定了所有查询的起始类型;让我们询问内省系统有关该类型的信息!
这与我们在类型系统部分所说的内容相符,即Query
类型是我们开始的地方!请注意,这里的命名只是按照惯例;我们可以将我们的Query
类型命名为任何其他名称,如果我们指定它是查询的起始类型,它仍然会在这里返回。但是,将它命名为Query
是一个有用的约定。
检查一个特定的类型通常很有用。让我们看一下Droid
类型
但是,如果我们想了解更多关于Droid的信息呢?例如,它是一个接口还是一个对象?
kind
返回一个__TypeKind
枚举,其中一个值为OBJECT
。如果我们询问Character
,我们会发现它是一个接口
对于一个对象来说,知道哪些字段可用是有用的,所以让我们询问内省系统关于Droid
的信息
这些是我们定义在Droid
上的字段!
id
在那里看起来有点奇怪,它没有类型的名称。这是因为它是一种NON_NULL
类型的“包装器”。如果我们查询该字段类型的ofType
,我们将在那里找到ID
类型,告诉我们这是一个非空ID。
类似地,friends
和appearsIn
都没有名称,因为它们是LIST
包装器类型。我们可以查询这些类型的ofType
,这将告诉我们它们是什么列表。
最后,让我们看看内省系统的一个对工具特别有用的功能;让我们向系统询问文档!
因此,我们可以使用内省访问有关类型系统的文档,并创建文档浏览器或丰富的IDE体验。
这只是内省系统的皮毛;我们可以查询枚举值、类型实现的接口等等。我们甚至可以内省内省系统本身。规范在“内省”部分对这个主题进行了更详细的说明,并且内省文件在GraphQL.js中包含实现符合规范的GraphQL查询内省系统的代码。