【问题标题】:GraphQL:不可为空的数组/列表
【发布时间】:2018-03-27 23:39:23
【问题描述】:

我现在正在学习 GraphQL,在浏览教程时,我遇到了我无法理解的行为。 假设我们在模式中定义了类型:

type Link {
  id: ID!
  url: String!
  description: String!
  postedBy: User
  votes: [Vote!]!
}

由于文档votes: [Vote!]! 意味着该字段应该是不可为空的,并且数组本身也应该是不可为空的。但就在该教程的作者显示查询示例之后,对于某些链接,它为votes 字段返回空数组。像这样:

{
 "url": "youtube.com",
 "votes": []
},
{
 "url": "agar.io",
 "votes": []
}

所以我的问题是:“不可为空”是否意味着 graphQL 架构中的“空”或者它只是 graphQL 服务器的某种错误行为(我的意思是它返回空数组而没有警告应该有什么到期到架构)。

谢谢!

【问题讨论】:

标签: javascript graphql graphql-js apollo express-graphql


【解决方案1】:

Non-null 的意思就是它听起来的样子——不是 null。空数组不为空——它仍然返回一个值。

这是一个汇总表:

declaration accepts: | null | []   | [null] | [{foo: 'BAR'}]
------------------------------------------------------------------------
[Vote!]!             | no   | yes  | no     | yes
[Vote]!              | no   | yes  | yes    | yes
[Vote!]              | yes  | yes  | no     | yes
[Vote]               | yes  | yes  | yes    | yes

[Vote!]! 表示该字段(在本例中为 votes)不能返回 null 并且它必须解析为一个数组 并且该数组中的个人项目可以为空。所以[][{}][{foo: 'BAR'}] 都是有效的(假设foo 是非空的)。但是,以下抛出:[{foo: 'BAR'}, null]

[Vote]!表示该字段不能返回null,但返回列表中的任何单个项都可以为null。

[Vote!] 表示整个字段可以为空,但如果确实返回值,则需要一个数组,并且该数组中的每一项都不能为空。

[Vote] 表示整个字段可以为空,但如果确实返回值,则需要一个数组。但是,数组的任何成员也可以为空。

如果您需要验证数组是否为空,则必须在解析器逻辑中执行此操作。如果您希望 GraphQL 在数组为空时仍然抛出异常,只需让您的解析器返回一个被拒绝的 Promise。

有关更多信息,您可以阅读 GraphQL 简介的list and non-null 部分或查看spec

【讨论】:

  • 也许我因为教程中的段落而感到困惑: "[Episode]! 表示一个 Episode 对象数组。由于它也是不可为空的,因此您总是可以期望一个数组(零或更多项目)当您查询出现字段时。” 出于某些原因,我认为如果没有感叹号意味着 “零个或多个项目”,因此存在感叹号意味着应该有至少 1 项。感谢您的回答!
  • @daniel-rearden 感谢您的准确回答。但是我会用一个里面有空值的数组来做什么呢? [][null] 非常相似(内部没有信息),为什么我们都需要呢?
  • @VladimirAlexiev 这对于为每个请求的元素返回一个数组元素可能很有用(例如:请求[4, 1, 2, 6] => 响应[Vote, null, null, Vote]
  • 我认为还有另一个原因:将特定元素报告为错误。假设 Vote 有一个必填字段,但它缺少或一个特定的投票:那么应该传播错误并且应该取消整个 Vote。并且如果数组的类型是 [Vote!] 那么整个数组应该被清空!
  • 好点@VladimirAlexiev 根据列表元素是否为非空,错误的传播方式会有所不同。有关详细信息,请参阅规范的 this section
猜你喜欢
  • 2018-01-09
  • 2018-01-28
  • 2020-07-05
  • 2018-06-15
  • 2019-04-11
  • 2016-12-15
  • 2021-09-02
  • 2020-09-23
  • 1970-01-01
相关资源
最近更新 更多