【问题标题】:GraphQL spec List and NonNull clarificationGraphQL 规范列表和 NonNull 说明
【发布时间】:2017-12-26 14:56:20
【问题描述】:

我在解释 GraphQL 规范的这一部分时遇到了一些问题。

https://facebook.github.io/graphql/#sec-Combining-List-and-Non-Null

1.

如果 List 的修改类型为 Non-Null,则该 List 可能不会 包含任何空项。

2.

如果 Non‐Null 的修改类型是 List,则不接受 null, 但是接受一个空列表。

我假设这些是

  1. 列表[类型!]
  2. 列表[类型]!

假设这么多是正确的。

第一个问题:对于 1,规范没有明确说空列表是无效的,不是吗?

graphql-js 项目中的This test 建议不应该这样做。

如果是这样,规范中没有指定非空列表的内容?

第二个问题:如果没有修饰符 (1),我是否应该能够提交具有空值的列表(如下所示)?

List[Book]

Book
title: String!

createBook(input: {books: [{null, {title: "Book a"}}]})

GraphiQL 似乎不允许将 null 添加到列表中,无论修饰符是否存在。那会是 GraphiQL 中的错误吗?

【问题讨论】:

    标签: graphql


    【解决方案1】:

    你猜对了。有four possible combinations

    [字符串]

    null // valid
    [] // valid
    ['a', 'b'] // valid
    ['a', null, 'b'] // valid
    

    [字符串!]

    null // valid
    [] // valid
    ['a', 'b'] // valid
    ['a', null, 'b'] // invalid
    

    [字符串]!

    null // invalid
    [] // valid
    ['a', 'b'] // valid
    ['a', null, 'b'] // valid
    

    [字符串!]!

    null // invalid
    [] // valid
    ['a', 'b'] // valid
    ['a', null, 'b'] // invalid
    

    第一个问题:对于 1,规范没有明确说空列表是无效的,是吗?

    没必要。默认情况下,GraphQL 中的所有类型都可以为空,包括列表。上面的第一个例子适用。

    第二个问题:如果没有修饰符 (1),我是否可以提交具有空值的列表(如下所示)?

    是的。 GraphQL spec section 5.3.3 声明参数必须与架构中定义的类型兼容。

    然而,在实践中,发送一个包含空元素的列表是没有用的。这可能是 GraphiQL 不采用它的原因。


    旁注:关于何时使用不可为空的类型,this article 可以补充一些观点,说明为什么在 GraphQL API 中使用可空类型可能是一个不错的选择,即使该字段不应该'不为空。

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      相关资源
      最近更新 更多