2016-06-22 121 views
4

我尝试进行这样的查询:Graphql查询只不为空的对象

{ 
people{ 
    pet{ 
    name 
    } 
} 
} 

结果:

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

我想要的是得到一个仅包含一个宠物的人,有什么方法来实现这个不解码我的解析器?

+0

http://stackoverflow.com/questions/36451910/graphql-query-only-include-field-if-not-null – SlartyBartfast

回答

0

这是不可能的你描述的方式。 GraphQL将调用解析函数来获取数据。如果您不希望响应某些数据,则必须在服务器上的某个地方对其进行过滤。唯一可以控制的是查询,模式和解析函数。

没有办法在查询中纯粹表达您的要求。如果你把它放在模式中,你将不再能够查询没有宠物的人。所以唯一的方法就是将它写入你的解析函数中。例如,您可以添加一个名为hasPet你的人场boolean变量,而做到这一点的解析器:

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

可惜的是,这将需要你“向前看”,并计算出,如果一个人有首先是一个宠物,但如果你使用DataLoader之类的东西来缓存后端数据库或DB请求,这实际上并不昂贵,因为无论如何您都必须获取宠物。这样你就可以提前一点拿到它。

如果您正在从数据库中提取您的人员,那么在那里已经过滤了它们,而不是在解析函数中进行过滤。