GraphQL:不可为空 array/list

GraphQL: Non-nullable array/list

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

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

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

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

所以我的问题是:在 graphQL 模式中 "non-nullable" 不是指 "empty" 还是它只是 graphQL 服务器的某种错误行为(我的意思是 returns 数组什么都没有没有警告应该有一些由于模式)。

谢谢!

非空的意思就是它听起来的意思——不是空的。空数组不是 null -- 它仍然是 returning 一个值。

这里是摘要table:

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)不能 return null and 它必须解析到一个数组 ,该数组中的 none 个项目可以为 null。所以 [][{}] 以及 [{foo: 'BAR'}] 都是有效的(假设 foo 是非空的)。但是,以下 抛出:[{foo: 'BAR'}, null]

[Vote]! 表示该字段不能 return 为空,但 returned 列表中的任何单个项目都可以为空。

[Vote!]表示整个字段可以为null,但是如果是return一个值,则需要是一个数组,并且每一项在该数组中不能为空。

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

如果您需要验证数组是否为空,则必须在您的解析器逻辑中进行。如果您希望 GraphQL 在数组为空时仍然抛出异常,只需让您的解析器 return 拒绝 Promise。

有关详细信息,您可以阅读 list and non-null section of the GraphQL introduction or take a look at the spec