使用 n-deep 包装器类型堆栈获取模式
Posted
技术标签:
【中文标题】使用 n-deep 包装器类型堆栈获取模式【英文标题】:Get schema with n-deep wrapper type stack 【发布时间】:2020-08-24 05:09:20 【问题描述】:我正在通过 GraphQL 从数据库中获取数据。有两种类型:Group
和Person
。组有一个字段people
,它是Person
对象的列表。
我正在尝试使用 GraphQL 的内置 introspection 从服务器获取架构。我遇到的问题是 people
字段是一个不可为空的类型,它包含一个包含不可为空类型的列表类型,我必须使用这个冗长的查询:
__type(name: "Group")
name
fields
name
type
name
kind
ofType
kind
name
ofType
kind
name
ofType
kind
name
ofType
kind
name
要获取此架构:
"data":
"__type":
"name": "Group",
"fields": [
"name": "people",
"type":
"name": null,
"kind": "NON_NULL",
"ofType":
"kind": "LIST",
"name": null,
"ofType":
"kind": "NON_NULL",
"name": null,
"ofType":
"kind": "OBJECT",
"name": "Person",
"ofType": null
]
除了不方便和难以阅读的查询之外,它不是通用的,我必须知道架构中包装器类型的最大深度才能构造它。
有什么方法可以在架构中获取所有包装器类型(无论深度如何)?
【问题讨论】:
【参考方案1】:不幸的是,一般情况下无法做到这一点。没有最大深度是因为 GraphQL 支持用 List 包装类型任意次数。所以虽然通常你只会看到
[String!]!
这也是一个有效的类型
[[[[[[[[[[[[String]!]!]!]!]!]!]!]!]!]!]!]!
您几乎必须选择一个合理的深度并随波逐流。对于它的价值,this 是官方“完整”自省查询的样子。它的深度为七。
【讨论】:
也就是说,如果您想要一种更简单的解析类型、字段等的方法,您可以转换自省结果 into a GraphQLSchema object 并使用它。以上是关于使用 n-deep 包装器类型堆栈获取模式的主要内容,如果未能解决你的问题,请参考以下文章
自动生成函数的类型安全包装,然后仅使用 `__typename` 作为参数动态调用。打字稿