Graphql查询只能不是null对象

时间:2016-06-22 13:11:15

标签: express meteor graphql graphql-js

我试图执行这样的查询:

{
 people{
   pet{
     name
   }
 }
}

结果:

{
 "people": {
   "pet": null
 }
},
{
 "people": {
   "pet": {
     name: "steve"
  }
 }
}

我想要的只是获得包含宠物的人,有没有办法在我的解析器上实现这一点?

1 个答案:

答案 0 :(得分:0)

这不可能按照你描述的方式进行。 GraphQL将调用resolve函数来获取数据。如果您不想在响应中使用某些数据,则必须在服务器上的某个位置对其进行过滤。您唯一可以控制的是查询,架构和解析函数。

无法在查询中完全表达您的要求。如果将它放在架构中,您将无法再查询没有宠物的人。因此,唯一的方法是在解析函数中编写它。例如,你可以在你的人员字段中添加一个名为hasPet的布尔参数,并在解析器中执行此操作:

people(root, { hasPet }){
  // get allPeople
  if (typeof hasPet === 'undefined'){
    return allPeople
  }
  return allPeople.filter((person) => person.hasPet() === hasPet)
}

不幸的是,这将要求您“向前看”并确定一个人是否有宠物,但如果您使用DataLoader之类的东西缓存后端或数据库请求,这实际上并不昂贵,因为你无论如何都要拿取宠物。这样你就可以提前获取它。

如果您是从数据库中提取人员,那么在那里过滤它们当然是有意义的,而不是在解析功能中。