对于 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
}
但是,如果您将消费者查询更改为仅询问 id
和 name
,那么它将不会 return 电子邮件。
您不能定义只有 returns if not null 的解析器。
是,您可以从父字段的解析器返回的值中省略 属性。
您的架构中的每个字段都有一个默认的解析器,如果您自己没有指定解析器(假设解析器首先被触发),该解析器就会运行。在您的示例中,如果我们省略 email
的解析器,则默认解析器将有效地执行以下操作:
- 在父字段解析为的值(在本例中为
Person
对象)上查找名为 email
的 属性
- 如果找到 属性,它将解析为 属性 的值——如果 属性 是一个函数,它将首先调用该函数并解析为返回值
- 如果找不到 属性,它将解析为 null
换句话说,如果父值中不存在与该字段同名的属性,则该字段将始终默认解析为空。还值得指出的是,GraphQL 没有 undefined
的概念,只有 null
。在 GraphQL.js 中,未定义的值总是被强制转换为 null
.
这个问题的公认答案不正确。根据 the spec,在 GraphQL 执行期间,每个字段都应该将其执行值添加到响应键的结果映射中。如果某个字段因错误而无法解析,则该字段应包含 null
值。如果字段执行到 null
值,则该字段应包含 null
值。没有允许省略由操作的选择集选择的可为空字段的有效响应格式。
假设我有如下类型:
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
}
但是,如果您将消费者查询更改为仅询问 id
和 name
,那么它将不会 return 电子邮件。
您不能定义只有 returns if not null 的解析器。
是,您可以从父字段的解析器返回的值中省略 属性。
您的架构中的每个字段都有一个默认的解析器,如果您自己没有指定解析器(假设解析器首先被触发),该解析器就会运行。在您的示例中,如果我们省略 email
的解析器,则默认解析器将有效地执行以下操作:
- 在父字段解析为的值(在本例中为
Person
对象)上查找名为email
的 属性 - 如果找到 属性,它将解析为 属性 的值——如果 属性 是一个函数,它将首先调用该函数并解析为返回值
- 如果找不到 属性,它将解析为 null
换句话说,如果父值中不存在与该字段同名的属性,则该字段将始终默认解析为空。还值得指出的是,GraphQL 没有 undefined
的概念,只有 null
。在 GraphQL.js 中,未定义的值总是被强制转换为 null
.
这个问题的公认答案不正确。根据 the spec,在 GraphQL 执行期间,每个字段都应该将其执行值添加到响应键的结果映射中。如果某个字段因错误而无法解析,则该字段应包含 null
值。如果字段执行到 null
值,则该字段应包含 null
值。没有允许省略由操作的选择集选择的可为空字段的有效响应格式。