前面我们定义了一个 GraphQL 的数据对象的类型,类型里面有两个字段,查询这些字段的时候,服务器要做的事情可以放在 Resolver 里面去做。
在 GraphQL 里面,可以直接查询的字段要放在 Query 这种类型里面,定义这样的字段,可以放在这个 Resolver 里面。
添加一个方法,名字叫 getAllUsers,在它上面可以使用一个 @Query 装饰器,要注意,这个 @Query 来自 @nestjs/graphql,不要导入来自 type-graphql 里的 Query。
装饰器里面,先设置一下返回的类型,一个函数参数,returns,函数返回的是一个数组,里面的项目是 User。保存一下文件,再到自动生成的 Schema 里面观察一下。
你会发现,在 Query 这个类型里面,现在多了一个字段是 getAllUsers,它的类型是一组 User。现在,如果在客户端,查询这个 getAllUsers 字段的话,就会执行 UserResolver 里面的这个 getAllUsers 方法。
这个 GraphQL 字段的名字,可以单独定义一下,给 @Query 提供第二个参数,它是一个对象,里面添加一个 name 属性,它的值就是给这个查询字段起的名字,比如 users。 再保存一下文件,观察生成的 Schema,这次 Query 类型里面,会出现一个 users 字段。
服务
这个 getAllUsers 方法返回的值,可以交给一个服务去处理,在这个类里面可以注入一个依赖,添加一个 constructor 构造方法,里面添加一个参数属性 private readonly userService,类型设置成 UserService。
打开 UserService 服务,在这个服务里先注入 MockModule 里的 MOCK_DATA 的值。添加一个构造方法 constructor ,用 @Inject 这个装饰器,要注入的是 MOCK_DATA,添加一个参数属性,private readonly ,参数的名字是 data,类型先设置成 any 。
在这个服务里面,添加一个方法,这个方法做的事情就是返回所有的用户,方法的名字可以叫 findAll,这个方法 return 的值是 this.data.users 。
回到 UserResolver,让这个 getAllUsers 方法, return 的值,可以用一下 this.userService 上的 findAll 这个方法,它会返回全部的用户。
查询
在 GraphQL Playground 里面,可以试一下,创建一个查询,一组大括号,里面输入一个 users,这个 users 是 Query 这个类型里的一个字段。
执行一下这个查询,响应回来的是一个 error,就是错误,提示要选择几个子字段。因为 users 这个字段返回的是一组 User,在我们的 GraphQL 的 Schema 里面,User 也是一种类型,它里面有 id 字段,还有 name 字段。
这里我们可以继续指定返回的用户资源需要哪些字段的值,比如我只需要用户的 name 字段,一组大括号,里面添加一个 name 字段。再执行一下查询,这次 GraphQL 服务器给我们返回了一组 User 数据,放在了 data 里的 users 这个属性里了,它里面的值是一组 User,每个 User 对象里面,只包含了一个 name 字段。
如果需要用户的 id 字段,查询的时候,这里可以再添加一个 id 字段,执行一下。这次返回的这组 User 数据里面,会包含 id 还有 name 字段。