在 GraphQL 的查询里面,有些字段需要支持使用一些参数,比如按用户的 id 查询出指定的用户,这就需要在字段里添加一个 id 参数,在查询的时候可以设置一下这个用户 id 参数的值。
在 UserResolver 里面,可以再添加一个查询字段,用一个 @Query 装饰器,提供两个参数,第一个参数是个函数,它要返回的是这个字段的类型,这里把它设置成 User,后面添加一个配置对象参数,里面有个 name 属性,设置一下字段的名字,可以是 user 。
下面添加一个方法,方法的名字可以叫 getUser,这样在查询的时候,user 字段的解析器就会使用这个 getUser 方法。这个方法需要一个参数,这个参数要用 @Args 装饰器装饰,给这个装饰器提供一个参数值,设置成 id,这个 id 就是在 GraphQL 查询里面,给 user 字段指定的参数的名字。
用 Args 装饰一下方法的 id 参数,这个参数值的类型是 string。这样在这个 getUser 方法里面,它的这个 id 参数的值就会是在查询的时候,给 user 字段设置的 id 参数的值。
这个方法 return 的值,可以用一下 this.userService 上的 findOneById 这个方法,把 id 这个参数值交给这个 findOneById 。
打开自动生成的 Schema 观察一下,这里在 Query 这个类型里面,多了一个 user 字段,它有个 id 参数,值的类型是 String,这个字段返回的东西是一个 User。
服务
然后再打开 UserService 服务,在这个服务里,需要再添加一个方法,名字是 findOneById,这个方法支持一个 id 参数,类型是 string,这个方法要做的事情就是根据这个 id 参数的值,找到并且返回对应的用户数据。
return 的是用一下 this.data.users 这个数组上的 filter,过滤出符合指定条件的项目,提供一个方法参数,这个方法有个 item 参数,条件是 item 里的 id 的值等于这个 findOneById 方法的 id 参数的值。
这个 filter 返回的值是个数组,所以可以访问一下这个数组里的第一个数据项目。
测试
在 GraphQL Playground 里面可以试一下,写一个查询,用一下 user 这个查询字段,这个字段支持一个 id 参数,它的值应该是应用里的用户资源的 id 号。
user 这个字段返回的东西是一个 User,再设置一下需要的 User 字段,添加一个 id ,再添加一个 name 。 执行一下这个查询。
你会发现,这次服务器响应回来的东西就是 id 号是 1 的这个用户数据。 修改一下 id 参数的值,设置成 2 ,执行一下查询。这回响应回来的,就是 id 号是 2 的用户。