GraphQL:不可为空的数组/列表

时间:2017-10-16 12:36:17

标签: javascript graphql graphql-js apollo express-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服务器的某种错误行为(我的意思是它返回任何数据而没有警告,应该有一些由于模式)。

谢谢!

1 个答案:

答案 0 :(得分:31)

非空意味着它听起来完全是什么 - 不是空的。空数组不为空 - 它仍然返回一个值。

这是一个摘要表:

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]表示整个字段可以为空,但如果它确实返回一个值,则需要一个数组。但是,数组的任何成员也可以为null。

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

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

相关问题