【问题标题】:Is it OK to omit returning fields instead of null, for nullable fields in GraphQL?对于 GraphQL 中的可空字段,是否可以省略返回字段而不是 null?
【发布时间】:2019-03-05 02:33:56
【问题描述】:

假设我有一个类型如下:

type Person {
  id: String!
  name: String!
  email: String
}

电子邮件字段可以是null。从解析器返回 Person 时是否可以简单地不返回 Person 对象上的电子邮件字段,例如:

{
  id: '1056'
  name: 'Bob Smith',
}

代替:

{
  id: '1056'
  name: 'Bob Smith',
  email: null
}

【问题讨论】:

    标签: graphql apollo-server


    【解决方案1】:

    是的,您可以从父字段的解析器返回的值中省略该属性。

    架构中的每个字段都有一个默认解析器,如果您自己没有指定解析器(假设解析器首先被触发),该解析器就会运行。在您的示例中,如果我们省略 email 的解析器,则默认解析器将有效地执行以下操作:

    • 在父字段解析为的值上查找名为 email 的属性(在本例中为 Person 对象)
    • 如果找到该属性,则解析为该属性的值——如果该属性为函数,则先调用该函数并解析为返回值
    • 如果没有找到该属性,它将解析为 null

    也就是说,如果父值中不存在与该字段同名的属性,则该字段默认总是解析为null。还值得指出的是,GraphQL 没有undefined 的概念,只有null。在 GraphQL.js 中,未定义的值总是被强制转换为 null

    【讨论】:

      【解决方案2】:

      在 GraphQL 中,您总是返回消费者应用(前端/查询)要求的内容。

      所以,如果有人像这样查询用户:

      query getUser {
        user {
         id
         name
         email
        }
      }
      

      如果电子邮件为空,则输出为:

      {
        id: '1056'
        name: 'Bob Smith',
        email: null
      }
      

      但是,如果您将消费者查询更改为只询问idname,则它不会返回电子邮件。

      您不能定义仅在不为 null 时才返回的解析器。

      【讨论】:

      • 是的,但是解析器是否必须为电子邮件字段返回 null 或者是否省略了足够多的内容?在我的测试中,如果省略了客户端要求的可为 null 的字段,GraphQL 将返回 null。
      • @Kainan 在您的解析器中,如果电子邮件值不存在,您必须以某种方式返回 null。但是如果客户不要求它,电子邮件的解析器将不会启动。
      猜你喜欢
      • 2021-10-29
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2021-10-24
      • 2022-01-02
      • 2019-10-25
      • 2018-11-14
      相关资源
      最近更新 更多