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

时间:2019-03-04 06:22:37

标签: graphql apollo-server

让我们说我的类型如下:

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

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

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

代替:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

因此,如果有人查询用户,例如:

query getUser {
  user {
   id
   name
   email
  }
}

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

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

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

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