假设我的 graphql 服务器想要以 JSON 形式获取以下数据,其中person3
and person5
是一些 id:
"persons": {
"person3": {
"id": "person3",
"name": "Mike"
},
"person5": {
"id": "person5",
"name": "Lisa"
}
}
Question: 如何使用apollo 创建模式类型定义?
按键person3
and person5
这里是根据我的查询动态生成的(即area
在查询中使用)。所以在另一个时候我可能会得到person1
, person2
, person3
回。
如你所见persons
不是 Iterable,因此以下内容不能用作我使用 apollo 所做的 graphql 类型定义:
type Person {
id: String
name: String
}
type Query {
persons(area: String): [Person]
}
中的按键persons
对象可能总是不同的。
当然,一种解决方案是将传入的 JSON 数据转换为使用数组persons
,但是没有办法处理这样的数据吗?
GraphQL 依赖于服务器和客户端提前了解每种类型可用的字段。在某些情况下,客户端可以发现这些字段(通过内省),但对于服务器来说,它们总是需要提前知道。因此,以某种方式根据返回的数据动态生成这些字段实际上是不可能的。
You could利用自定义JSON 标量(graphql-type-json 模块)并返回您的查询:
type Query {
persons(area: String): JSON
}
通过使用 JSON,您可以绕过返回数据以适应任何特定结构的要求,因此您可以发送回任何您想要的数据,只要它是正确格式化的 JSON。
当然,这样做有很大的缺点。例如,您失去了以前使用的类型提供的安全网(实际上可以返回任何结构,如果您返回错误的结构,则在客户端尝试之前您不会发现它)使用它并失败)。您还无法对返回数据中的任何字段使用解析器。
但是...你的葬礼:)
顺便说一句,在将数据发送回客户端之前,我会考虑将数据展平为数组(就像您在问题中建议的那样)。如果您正在编写客户端代码,并使用动态大小的客户列表,则数组可能比使用 id 键控的对象更容易使用。例如,如果您使用 React 并为每个客户显示一个组件,那么您最终会将该对象转换为数组以映射它。在设计 API 时,我会更加考虑客户端可用性,而不是避免对数据进行额外处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)