GraphQL 使用 Introspection 时某些字段没有类型名称?

Posted

技术标签:

【中文标题】GraphQL 使用 Introspection 时某些字段没有类型名称?【英文标题】:GraphQL when using Introspection some fields dont have type name? 【发布时间】:2021-10-23 08:35:48 【问题描述】:

我正在学习 GraphQL,对于我的用例,我需要知道每个 ObjectType 有哪些字段类型。

但是在尝试时,其中一些没有显示类型。 这是我正在做的查询:


 __type(name: "Todo")
  fields
    name
    type
      name   
  
    
  


结果如下:


  "data": 
    "__type": 
      "fields": [
        
          "name": "priority",
          "type": 
            "name": "Int"
          
        ,
        
          "name": "_id",
          "type": 
            "name": null
          
        ,
        
          "name": "completed",
          "type": 
            "name": "Boolean"
          
        ,
        
          "name": "title",
          "type": 
            "name": null
          
        ,
        
          "name": "list",
          "type": 
            "name": "List"
          
        ,
        
          "name": "_ts",
          "type": 
            "name": null
          
        
      ]
    
  

这是架构定义

type Todo 
  priority: Int
  _id: ID!
  completed: Boolean
  title: String!
  list: List
  _ts: Long!

正如您在结果中看到的,_id、title 和 _ts 没有显示类型。 我应该错过了什么。

提前致谢。

【问题讨论】:

【参考方案1】:

列表类型和非空类型没有名称。相反,您必须查询kind 属性和ofType 以获取更多信息:

query 
  __type(name: "Todo") 
    fields 
      name
      type 
        name
        kind
        ofType 
          name
        
      
    
  

这将导致如下结果:


  "data": 
    "__type": 
      "fields": [
        
          "name": "priority",
          "type": 
            "name": "Int",
            "kind": "SCALAR",
            "ofType": null
          
        ,
        ...
        
          "name": "title",
          "type": 
            "name": null,
            "kind": "NON_NULL",
            "ofType": 
              "name": "String"
            
          
        ,
        ...
      ]
    
  

请注意,这可以是多个级别的深度,因为您可以拥有一个不可为空类型的不可空列表。因此,您甚至可能想要深入四级:

query 
  __type(name: "Resource") 
    fields 
      name
      type 
        name
        kind
        ofType 
          name
          kind
          ofType 
            name
            kind
            ofType 
              name
              kind
            
          
        
      
    
  

【讨论】:

以上是关于GraphQL 使用 Introspection 时某些字段没有类型名称?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 graphql Introspection 查询?

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

IdentityServer4 Introspection 多租户请求

Sass Introspection函数

学习 Introspection API(由 FxCop 使用)

Introspection 函数