GraphQL 的查询有点像是选择一个对象里的字段。对象都有个类型,在创建 GraphQL 服务的时候会去创建一些对象的类型。用的是一种特定的语言,叫做 GraphQL schema language。
之前我们用 Nest 框架创建的 GraphQL 服务,它会根据我们写的 TypeScript 代码,自动生成一个 GraphQL Schema,放在了项目根目录下面的这个 schema.gql 文件里了。打开这个文件。
在这个 GraphQL Schema 里面,用的就是 GraphQL Schema Language 这种语言定义的一些对象类型。定义类型用的是 type 这个关键词,后面是要定义的类型的名字。然后它里面是这种类型的对象里面包含的一些字段。比如这个 Post 类型里面,有 id 字段,还有一个 title 字段。
字段名字的后面,需要再设置了一下这个字段值的类型,比如这个 id 的值是 ID 类型的,title 的值是 String 类型的。ID,String,Int,Float 还有 Boolean 这些类型是 GraphQL 里面默认带的一些 Scalar 类型,就是标量类型。
字段类型的最后有个 ! 号,表示这个字段的值不会是空值。意思就是在客户端那里查询这个字段的时候,服务端会保证返回一个值。
如果字段的类型是一个列表,可以使用方括号这种形式,比如 User 类型里的 posts 字段,它的类型就是一个列表,或者叫一个数组,这个列表里的每个项目的类型是 Post。这个 Post 是我们在这个 Schema 里定义的一个对象类型。
有些字段可能会支持使用一些参数,这些参数会放在字段名字后面的括号里面,比如这个 Query 类型里的 user 字段,就支持一个 id 参数,参数值的类型是个字符串。在查询的时候可以设置这个字段里的 id 参数的值,在这个字段的 Resolver 那里可以得到查询的时候设置的这个参数的值,然后根据这个参数值再去获取到对应的数据。
Resolver
每个字段可能会对应一个方法或者函数,在查询那里选择了一个字段,在服务端这里就会执行跟它对应的方法或函数去作一些事情,比如获取到需要的数据。这些方法或者函数叫做 Resolver,可以翻译成解析器。
Query 与 Muation
在这个 Schema 里面,有两个比较特别的类型,就是这个 Query 类型,还有这个 Mutation 类型。这两个东西定义的是 GraphQL 的查询入口。
查询数据的时候,都会从 Query 这个类型里提供的字段作为入口开始。需要修改应用里的数据,一般会从 Mutation 类型里面提供的字段开始。