首页 文章

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

提问于
浏览
7

我现在正在学习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 回答

  • 21

    非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
    

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

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

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

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

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

    有关更多信息,请阅读GraphQL简介的list and non-null章节 .

相关问题