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

Def*_*Lee 16 javascript apollo graphql graphql-js express-graphql

我现在正在学习GraphQL,在学习教程的过程中,我遇到了一些我无法理解的行为.假设我们已经在模式中定义了类型:

type Link {
  id: ID!
  url: String!
  description: String!
  postedBy: User
  votes: [Vote!]!
}
Run Code Online (Sandbox Code Playgroud)

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

{
 "url": "youtube.com",
 "votes": []
},
{
 "url": "agar.io",
 "votes": []
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:不是"非可空"在graphQL模式中意味着"空",或者它只是graphQL服务器的某种错误行为(我的意思是它返回任何数组而没有警告应该有一些由于模式) .

谢谢!

Dan*_*den 45

非null意味着它听起来完全是什么 - 不是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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

有关更多信息,您可以阅读GraphQL简介的列表和非空章节.

  • 也许我因为教程中的段落而感到困惑: _"[Episode]! 表示 Episode 对象的数组。由于它也是不可空的,因此当您查询出现字段时,您总是可以期待一个数组(具有零个或多个项目) ."_出于某些原因,我认为如果没有感叹号意味着_“零个或多个项目”_,那么存在感叹号意味着应该至少有 1 个项目。感谢您的回答! (2认同)
  • @daniel-rearden 感谢您的准确回答。但是我为什么要使用一个里面有空值的数组呢?`[]` 和 `[null]` 非常相似(里面没有信息),那么为什么我们需要两者呢? (2认同)