对于 GraphQL 中可为空的字段,省略返回字段而不是 null 是否可以?

Is it OK to omit returning fields instead of null, for nullable fields in GraphQL?

假设我有如下类型:

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

电子邮件字段可以是null。当 return 从解析器获取一个人时,是否可以简单地不 return Person 对象上的电子邮件字段,例如:

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

而不是:

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

在 GraphQL 中,您 总是 return 消费者应用程序(frontend/query)要求什么。

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

query getUser {
  user {
   id
   name
   email
  }
}

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

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

但是,如果您将消费者查询更改为仅询问 idname,那么它将不会 return 电子邮件。

您不能定义只有 returns if not null 的解析器。

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

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

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

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

这个问题的公认答案不正确。根据 the spec,在 GraphQL 执行期间,每个字段都应该将其执行值添加到响应键的结果映射中。如果某个字段因错误而无法解析,则该字段应包含 null 值。如果字段执行到 null 值,则该字段应包含 null 值。没有允许省略由操作的选择集选择的可为空字段的有效响应格式。