【问题标题】:GraphQL when using Introspection some fields dont have type name?GraphQL 使用 Introspection 时某些字段没有类型名称?
【发布时间】: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 没有显示类型。 我应该错过了什么。

提前致谢。

【问题讨论】:

    标签: graphql


    【解决方案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
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-09
      • 2019-08-07
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多