当前,该架构可以正常工作并提供所需的结果
type Personal{
userId:String
name: String
email: String
}
type Contact{
mobile_no:String
email:String
}
type Address{
address:String
lat:String
long:String
}
getContact(userId: String): Contact
getPersonal(userId: String): Personal
getAddress(userId: String): Address
但是我想返回
type Response {
status: Boolean
message: String
data: []
}
使用状态和消息键返回数据,其中数据包含联系人,个人和地址对象的数组。
不编写ResponseContact,ResponsePersonal和ResponseAddress
我有想法要在这样的数据中返回scalar JSON
scalar JSON
type Response {
status: Boolean
message: String
data: [JSON]
}
但是这种模式的问题我不能使用graphql第二个要点“问您想要什么” 所需结果
type ResponseAddress {
status: Boolean
message: String
data: [Address]
}
type ResponsePersonal {
status: Boolean
message: String
data: [Personal]
}
type ResponseContact {
status: Boolean
message: String
data: [Contact]
}
getContact(userId: String): ResponseContact
getPersonal(userId: String): ResponsePersonal
getAddress(userId: String): ResponseAddress
不编写ResponseAddress,ResponsePersonal和ResponseContact。
类似的东西
type Response {
status: Boolean
message: String
data: [Address|Personal|Contact]
}
getContact(userId: String): Response
getPersonal(userId: String): Response
getAddress(userId: String): Response
当然以上语法是错误的。
为什么:-因为我想返回此响应更多的位置,并且不想使用较长的模式。
要点:-这可能吗?
答案 0 :(得分:3)
可以通过使用接口或联合将多个类型分配给单个字段:
union ResponseData = Address | Personal | Contact
type Response {
status: Boolean
message: String
data: ResponseData
}
请记住,查询此字段时,客户端将需要利用内联片段以指定针对每种可能的类型请求哪些字段:
query {
getContact {
status
message
data {
... on Address {
# Address field here
}
... on Personal {
# Personal field here
}
... on Contact {
# Contact field here
}
}
}
}
您可以查看the docs,以获取有关如何实现联合和接口的详细说明。请记住,您只能创建对象类型的并集,因此,如果您需要一个返回列表的响应,则需要为响应定义至少两种类型:
type Response {
status: Boolean
message: String
data: ResponseData
}
type ListResponse {
status: Boolean
message: String
data: [ResponseData]
}
注意:以这种方式使用联合确实会增加客户端的复杂性,我通常会说,仅拥有较小的架构是不值得的。诸如GraphiQL和GraphQL Playground之类的工具使使用大型模式对于用户而言轻而易举。如果您需要的话,拥有具有冗余类型的大型架构并不是一件坏事。