Ruby 中 GraphQL 类型的字段定义中感叹号的目的是啥?

Posted

技术标签:

【中文标题】Ruby 中 GraphQL 类型的字段定义中感叹号的目的是啥?【英文标题】:What is the purpose of exclamation marks in field definitions for GraphQL types in Ruby?Ruby 中 GraphQL 类型的字段定义中感叹号的目的是什么? 【发布时间】:2019-05-06 00:25:56 【问题描述】:

我正在关注this guide 学习带有Ruby后端的GraphQL,在“查询返回链接”部分,有以下代码:

# defines a new GraphQL type
Types::LinkType = GraphQL::ObjectType.define do
  # this type is named `Link`
  name 'Link'

  # it has the following fields
  field :id, !types.ID
  field :url, !types.String
  field :description, !types.String
end

我知道感叹号只是一个“非”运​​算符,但有人可以在这里解释一下它的用途吗?

【问题讨论】:

【参考方案1】:

这是一个必填(不可为空)字段。实施:

字符串!表示该字段不可为空,这意味着 GraphQL 服务承诺在您查询该字段时始终为您提供一个值。在类型语言中,我们将用感叹号表示。

https://graphql.org/learn/schema/#object-types-and-fields

好像被关键字语法取代了:

field :handle, String, null: false

http://graphql-ruby.org/type_definitions/objects.html

【讨论】:

那么感叹号在类型之前还是之后没有关系吗?阅读本文档,所有不可为空的值都由它跟随,而不是在它之前:GraphQL Ruby - Non-Null Types - 而在this documentation 中,它用于在类型之前,但没有解释......? 在 Ruby graphql DSL 中,它位于类型之前,因为它使用了重载运算符 - !(types.String)。它在 graphql 模式定义中映射到 types.String!。它 types.String! 被使用,它会被视为类型名称的一部分:String! 太好了,谢谢!在您的帮助下,我找到了this documentation,它指出它现在已被删除,以避免与内置逻辑运算符产生歧义。 当然可以! :)【参考方案2】:

“!” GraphQL 中的标记指定该字段不可为空。在您的示例中,id、url、description 字段都不能为 NULL。

field :id, !types.ID
field :url, !types.String
field :description, !types.String

如果在列表中使用,它的含义会略有不同。

[整数]! :列表不能为NULL。如果您传递“null”,那将是一个错误,而“[1, 2, null]”是可以接受的。 [Int!] : 列表内容不能为 NULL。它将接受“null”列表,但“[1, 2, null]”会导致错误。

【讨论】:

以上是关于Ruby 中 GraphQL 类型的字段定义中感叹号的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

向 graphql-ruby 实现添加多个过滤器

graphql-ruby:Int 不是定义的输入类型(在 $first 上)

如何在类型定义中为 GraphQL 字段定义数组数据类型

GraphQL 错误:输入类型中未定义字段

Graphql 日期字段类型必须是输出类型但得到:未定义

数组中类型为 graphql 对象的 GraphQL 字段