【问题标题】:GraphQL 中的感叹号是什么?
【发布时间】:2018-11-14 00:06:26
【问题描述】:

在我的架构文件中,我注意到某些类型后面有感叹号,例如

# Information on an account relationship
type AccountEdge {
  cursor: String!
  node: Account!
}

这些是什么意思?我在文档中或通过谷歌搜索找不到任何关于它的信息????

【问题讨论】:

    标签: graphql


    【解决方案1】:

    这意味着该字段不可为空。

    Graphql - Schemas and Types查看更多信息

    【讨论】:

    • 这比我预期的要花更长的时间。甚至 GraphQL 备忘单以及 Prisma 和 Apollo 文档似乎也没有明确提及这一点。
    • 带有漂亮突出显示的文档链接(适用于 Chrome):graphql.org/learn/schema/….
    • @Purplejacket 太棒了,我更新了答案中的链接! :)
    【解决方案2】:

    来自spec

    默认情况下,GraphQL 中的所有类型都可以为空; null 值是所有上述类型的有效响应。要声明不允许 null 的类型,可以使用 GraphQL Non-Null 类型。此类型包装一个基础类型,并且此类型与该包装类型的行为相同,但 null 不是包装类型的有效响应。尾随感叹号用于表示使用非 Null 类型的字段,如下所示:name: String!。

    换句话说,GraphQL 中的类型默认可以为空。类型后的感叹号专门将该类型指定为不可为空。

    根据使用的类型,这具有不同的含义。

    输出

    字段的类型应用非null时,这意味着如果服务器将该字段解析为null,则响应将失败验证。只要错误不是propagate all the way up to the root,您仍然可能会收到部分响应。

    例如,给定如下架构:

    type Query {
      user: User
    }
    
    type User {
      id: ID!
    }
    

    这里id 字段不为空。通过将该字段标记为非空,我们实际上保证我们永远不会为该字段返回空值。如果服务器确实返回 null,则表明出现了严重错误,我们想抛出验证错误。

    输入

    当非 null 应用于 输入 的类型(如参数、输入对象字段或变量)时,它会要求输入。例如:

    type Query {
      getUser(id: ID!, status: Status): User
    }
    

    这里,id 参数不为空。如果我们请求getUser 字段,我们将始终必须为其提供id 参数。另一方面,因为status 参数可以为空,所以它是可选的并且可以省略。这也适用于变量:

    query MyQuery ($foo: ID!) {
      getUser(id: $foo)
    }
    

    由于$foo变量不为空,所以发送查询时不能省略,其值不能等于null

    关于变量类型的特别说明

    因为在我们的示例中id 字段是非空ID(即ID!)类型,所以我们传递给它的任何变量也必须是非空ID .如果我们的$foo 变量是一个可以为空的ID,我们就不能将它传递给id 参数。然而,相反的情况是不正确的。如果参数可以为空,您可以将非空变量传递给它。

    换句话说:

    +----------+----------+--------+
    | Argument | Variable | Valid? |
    +----------+----------+--------+
    | String   | String   |   ✅   |
    | String   | String!  |   ✅   |
    | String!  | String   |   ❌   |
    | String!  | String!  |   ✅   |
    +----------+----------+--------+
    

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 2020-05-03
      • 2011-01-11
      • 1970-01-01
      • 2023-03-06
      • 2015-09-01
      • 2019-05-06
      • 2021-09-18
      相关资源
      最近更新 更多