2017-10-16 117 views
1

我正在学习GraphQL,并在通读教程时遇到了我无法理解的行为。 比方说,我们在架构中定义的类型: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服务器的错误行为(我的意思是它返回的什么阵不警告应该有一些由于架构造成的)。

谢谢!

回答

3

非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,它必须解析到一个数组中没有一个个人项目在该数组内可以为null。因此[][{}][{foo: 'BAR'}]都将是有效的(假设foo非空)。但是,下面的投:[{foo: 'BAR'}, null]

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

[Vote!]意味着整个字段可以空的,但如果它返回一个值,它需要一个阵列和阵列中的每个项目不能为空。

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

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

欲了解更多信息,您可以阅读GraphQL入门的list and non-null章节。

+0

也许我因为教程中的段落而感到困惑: _“[Episode]!表示一个Episode对象的数组,因为它也是不可空的,所以当你有一个数组查询出现在字段中。“_ 由于某些原因,如果缺少感叹号意味着_”零个或多个项目“_因此感叹号的存在意味着至少应该有一个项目。感谢您的回答! – DefLee