52

我现在正在学习 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 服务器的某种错误行为(我的意思是它返回空数组而没有警告应该由于模式而存在某些东西) .

谢谢!

4

1 回答 1

161

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

这是一个汇总表:

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

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

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

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

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

有关更多信息,您可以阅读 GraphQL 介绍的列表和非空部分或查看规范

于 2017-10-16T13:46:05.210 回答