使用 n-deep 包装器类型堆栈获取模式

Posted

技术标签:

【中文标题】使用 n-deep 包装器类型堆栈获取模式【英文标题】:Get schema with n-deep wrapper type stack 【发布时间】:2020-08-24 05:09:20 【问题描述】:

我正在通过 GraphQL 从数据库中获取数据。有两种类型:GroupPerson。组有一个字段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 包装器类型堆栈获取模式的主要内容,如果未能解决你的问题,请参考以下文章

包装器类型

在堆栈上分配不完整的类型

了解Java的自动装箱与拆箱

自动生成函数的类型安全包装,然后仅使用 `__typename` 作为参数动态调用。打字稿

使用 sbt 和 testng 时,如何获取测试中抛出的异常的完整堆栈跟踪?

修饰器模式