gpt4 book ai didi

graphql - 具有动态键的对象的 Apollo/GraphQL 字段类型

转载 作者:行者123 更新时间:2023-12-02 12:38:09 25 4
gpt4 key购买 nike

假设我的 graphql 服务器想要以 JSON 形式获取以下数据,其中 person3person5 是一些 id:

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

问题:如何使用apollo创建模式类型定义?

这里的键 person3person5 是根据我的查询(即查询中使用的 area)动态生成的。因此,在其他时间我可能会返回 person1person2person3。如您所见,persons 不是一个 Iterable,因此以下内容不能用作我使用 apollo 所做的 graphql 类型定义:

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

persons 对象中的键可能始终不同。

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

最佳答案

GraphQL 依赖于服务器和客户端提前了解每种类型可用的字段。在某些情况下,客户端可以发现这些字段(通过内省(introspection)),但对于服务器来说,它们总是需要提前知道。因此,以某种方式根据返回的数据动态生成这些字段实际上是不可能的。

可以使用自定义 JSON scalar (graphql-type-json 模块)并返回您的查询:

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

通过使用 JSON,您可以绕过返回数据以适应任何特定结构的要求,因此您可以发送回任何您想要的数据,只要它是正确格式化的 JSON。

当然,这样做有很大的缺点。例如,您失去了以前使用的类型提供的安全网(实际上可以返回任何结构,如果您返回错误的结构,则在客户端尝试之前您不会发现它)使用它并失败)。您还无法对返回数据中的任何字段使用解析器。

但是...你的葬礼:)

顺便说一句,在将数据发送回客户端之前,我会考虑将数据展平为数组(就像您在问题中建议的那样)。如果您正在编写客户端代码,并使用动态大小的客户列表,则数组可能比使用 id 键控的对象更容易使用。例如,如果您使用 React 并为每个客户显示一个组件,那么您最终会将该对象转换为数组以映射它。在设计 API 时,我会更加考虑客户端可用性,而不是避免对数据进行额外处理。

关于graphql - 具有动态键的对象的 Apollo/GraphQL 字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46562561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com