2017-10-04 67 views
1

比方说,我graphql服务器要在那里person3person5一些ID的获取以下数据作为JSON:与动态密钥阿波罗/ GraphQL字段类型为对象

"persons": { 
    "person3": { 
    "id": "person3", 
    "name": "Mike" 
    }, 
    "person5": { 
    "id": "person5", 
    "name": "Lisa" 
    } 
} 

问题:如何创建模式类型定义与阿波罗?

这里的密钥person3person5取决于我的查询(即在查询中使用的area)动态生成。所以在另一次我可能会得到person1person2,person3返回。 正如你看到的persons不是Iterable的,所以下面将不作为graphql类型定义我与阿波罗做工作:

type Person { 
    id: String 
    name: String 
} 
type Query { 
    persons(area: String): [Person] 
} 

persons对象键可以永远是不同的。

当然,一种解决方案是将传入的JSON数据转换为使用persons的数组,但是没有办法像这样使用数据?

+0

你能澄清一下'b'和'g'是什么意思'动态生成取决于我的查询吗?一个或另一个的存在取决于请求中的字段吗? –

+0

@DanielRearden所以'b'和'g'都是id的。也许我应该在这个问题上更清楚一点。该查询将包含仅用于获取人员子集的选项,因此对于一个查询,响应将包含id为“a”,“b”,“c”的人员以及用于另一个查询例如“b”和“g”的人员,如这个问题。 – Andru

+0

@DanielRearden我现在把'b'改成'person3',把'g'改成'person 5',并加入了一些文字和变量以使其更清晰。该查询将包含选项以仅获取文本中概述的人员子集。 – Andru

回答

3

GraphQL依赖服务器和客户端提前知道哪些字段可用于每种类型。在某些情况下,客户端可以发现这些字段(通过内省),但对于服务器而言,他们总是需要提前知道。所以以某种方式根据返回的数据动态生成这些字段是不可能的。

可以利用定制JSON scalar和返回的查询:

type Query { 
    persons(area: String): JSON 
} 

通过使用JSON,你绕过需要为返回的数据,以适应任何特定的结构,这样你就可以发回什么只要格式正确的JSON就可以。

当然,这样做有很大的缺点。例如,你失去了以前使用过的类型所提供的安全网络(从字面上看,任何结构都可以返回,如果你返回了错误的结构,直到客户端尝试之后才会发现它)使用它并失败)。您也失去了对返回数据中的任何字段使用解析器的能力。

可是......你的葬礼:)

顺便说一句,我会考虑将其发送回客户端之前的数据不上不下到一个数组(就像你在你的问题的建议)。如果您正在编写客户端代码,并使用动态大小的客户列表,那么使用数组将更容易处理,而不是通过id键入的对象。例如,如果您正在使用React,并为每个客户显示一个组件,那么您最终会将该对象转换为数组映射它。在设计你的API时,我会让客户可用性成为一个更高的考虑因素,而不是避免额外处理你的数据。

+0

感谢您的意见!我转换来自服务器的传入数据。仅供参考:使用ID的对象的原因是客户端更快地检索,因为它只是查找某个特定人员的ID。 – Andru

+0

我的情况是通过Rails/GraphQL API返回验证错误。我不知道什么键会有错误,因此我使用了一个自定义的JSON标量。 –

+0

其实我改变了我的方法来使用嵌套数组,这让我一直返回带有错误的字段。 –