And*_*dru 13 apollo graphql apollo-server
假设我的graphql服务器想要获取以下数据作为JSON,其中person3
和person5
是一些id:
"persons": {
"person3": {
"id": "person3",
"name": "Mike"
},
"person5": {
"id": "person5",
"name": "Lisa"
}
}
Run Code Online (Sandbox Code Playgroud)
问题:如何使用apollo创建模式类型定义?
密钥person3
和person5
这里是动态生成的,具体取决于我的查询(即area
在查询中使用).因此,在其他时间我可能会person1
,person2
,person3
返回.如您所见persons
,不是Iterable,因此以下不能用作我用apollo做的graphql类型定义:
type Person {
id: String
name: String
}
type Query {
persons(area: String): [Person]
}
Run Code Online (Sandbox Code Playgroud)
persons
对象中的键可能总是不同的.
当然,一种解决方案是将传入的JSON数据转换为使用数组persons
,但是没有办法处理数据吗?
Dan*_*den 15
GraphQL依赖于服务器和客户端,提前知道每种类型可用的字段.在某些情况下,客户端可以发现这些字段(通过内省),但对于服务器,它们总是需要提前知道.因此,以某种方式基于返回的数据动态生成这些字段实际上是不可能的.
您可以使用自定义JSON标量并将其返回给您的查询:
type Query {
persons(area: String): JSON
}
Run Code Online (Sandbox Code Playgroud)
通过使用JSON,您可以绕过返回数据的要求以适应任何特定结构,因此只要格式正确的JSON,您就可以发回任何您想要的内容.
当然,这样做有很大的缺点.例如,您丢失了之前使用的类型所提供的安全网(实际上可以返回任何结构,如果您返回错误的结构,在客户端尝试之前您将无法找到它)使用它并失败).您还失去了对返回数据中的任何字段使用解析器的功能.
但是......你的葬礼:)
顺便说一句,在将数据发送回客户端之前,我会考虑将数据扁平化为数组(就像您在问题中建议的那样).如果您正在编写客户端代码,并使用动态大小的客户列表,则可能更容易使用数组而不是id键入的对象.例如,如果您正在使用React并为每个客户显示一个组件,那么您最终会将该对象转换为数组以进行映射.在设计API时,我会更好地考虑客户端可用性,而不是避免额外处理数据.
归档时间: |
|
查看次数: |
6609 次 |
最近记录: |