graphql中的感叹号是什么?

Jua*_*edo 26 graphql

在我发现的模式文件中,我注意到某些类型后面有感叹号,例如

# Information on an account relationship
type AccountEdge {
  cursor: String!
  node: Account!
}
Run Code Online (Sandbox Code Playgroud)

这些是什么意思?我在文档中或通过谷歌搜索找不到任何相关内容

Dan*_*den 38

规范

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

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

这具有不同的含义,具体取决于使用类型的位置。

输出

当非空应用于字段的类型时,这意味着如果服务器将该字段解析为null,则响应将无法通过验证。您可能仍会收到部分响应,只要错误不会一直传播到 root

例如,给定一个架构,如:

type Query {
  user: User
}

type User {
  id: ID!
}
Run Code Online (Sandbox Code Playgroud)

这里的id字段是非空的。通过将字段标记为非空,我们有效地保证我们永远不会为此字段返回空。如果服务器确实返回 null,则表明出现了严重错误并且我们想要抛出验证错误。

输入

当 non-null 应用于input的类型时,例如参数、输入对象字段或变量,它会使该输入成为必需的。例如:

type Query {
  getUser(id: ID!, status: Status): User
}
Run Code Online (Sandbox Code Playgroud)

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

query MyQuery ($foo: ID!) {
  getUser(id: $foo)
}
Run Code Online (Sandbox Code Playgroud)

因为$foo变量是非空的,所以当你发送查询时,它不能被省略,它的值不能等于null

关于变量类型的特别说明

由于该id领域是一个非空ID(即ID!在我们的例子)类型,我们传递给它的变量都必须有一个非空ID。如果我们的$foo变量是可空的ID,我们就不能将它传递给id参数。然而,事实并非如此。如果参数可以为空,则可以将其传递给非空变量。

换句话说:

+----------+----------+--------+
| Argument | Variable | Valid? |
+----------+----------+--------+
| String   | String   |   ?   |
| String   | String!  |   ?   |
| String!  | String   |   ?   |
| String!  | String!  |   ?   |
+----------+----------+--------+
Run Code Online (Sandbox Code Playgroud)


Jua*_*uan 32

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

请参阅Graphql中的更多信息- 模式和类型

  • 这花了比我预期的更长的时间才发现。甚至 GraphQL 备忘单以及 Prisma 和 Apollo 文档似乎都没有明确提到这一点。 (2认同)