为什么每个 GraphQL query/mutation 有 "two names"?

Why are there "two names" for each GraphQL query/mutation?

我正在学习GraphQL,有一个基本点让我很困惑。我知道有一个简单的解释,但我找不到。具体来说,来自 Apollo 文档 (https://www.apollographql.com/docs/apollo-server/essentials/data.html#operation):

...it makes sense to name the operation in order to quickly identify operations during debugging or to aggregate similar operations together...Operations can be named by placing an identifier after the query or mutation keyword, as we’ve done with HomeBookListing here:

query HomeBookListing {   
     getBooks {
     title   
     } 
 }

如果 HomeBookListing 是查询的名称,那么 getBooks 是什么?解析器的名称?

同样,当您将变量传递给查询时,为什么会有 "two levels" 个参数,像这样

mutation HomeQuickAddBook($title: String, $author: String = "Anonymous") {
  addBook(title: $title, author: $author) {
    title
  }
}

那么,$title: String, $author: String = "Anonymous" 是传递给查询的变量,title: $title, author: $author 是传递给解析器的变量吗?

我当然可以记住这个模式,但我很想从概念上理解不同部分在这里的作用。非常感谢任何见解!

您可能会发现回顾 the spec 很有帮助,但以下是一个更简短的解释:

什么是操作?

GraphQL 中有三种操作(querymutationsubscription)。通常,GraphQL 请求仅包含这三个操作中的一个,它构成了请求的根,或者是架构其余部分的入口点。

每个操作都有一个关联的对象类型。按照惯例,这些类型被命名为 QueryMutationSubscription,但它们的命名在功能上与您的模式无关。除了它们与特定操作的关联之外,这些对象类型没有什么特别之处——每个对象类型都有一个 namedescriptionfields,就像您的架构中的任何其他对象类型一样。我们将这三种类型统称为根操作类型.

在您的示例中,query 根类型有一个名为 getBooks 字段。该字段根据与架构中任何其他字段相同的规则进行解析。该字段唯一的特殊之处在于它位于根部——没有 "parent" 字段在它之前被解析。

操作名称是可选的,因为它们不会影响服务器返回的数据——它们通常用于调试目的(尽管一些客户端和工具使用它们来提供其他功能,所以拥有它们总是好的) .然而,至少为你的根操作类型指定一个字段名是必要的,否则你的操作实际上不会做任何事情(即查询服务器数据)。同样,这些字段是您进入架构其余部分的入口点和数据图的起点。

好的,但是变量呢?

根据规范:

Variables must be defined at the top of an operation and are in scope throughout the execution of that operation.

虽然我们不使用值初始化文档中的变量,但我们确实需要通过告诉 GraphQL 变量的类型来定义它。这允许 GraphQL 然后验证整个文档中变量的使用。例如,如果您将变量定义为 String,然后尝试在 Int 的输入字段中使用它,验证将失败并且您的请求甚至在执行之前就会崩溃。

变量始终被定义为操作定义的一部分——但是它们可以在文档中的任何地方使用,甚至可以多次使用。所以这里没有 "two levels of parameters" -- 一行只是定义,另一行是用法。

关于语义的一句话

尽管我们有一个规范,但围绕 GraphQL 的语言已经超越了其中概述的术语。术语 "query" 具有多种含义,您在查看各种文档和文章时可能会遇到这些含义。牢记这些定义有助于避免混淆:

  • 按照惯例,我们将与 query 操作关联的根操作类型命名为 Query 类型
  • 非正式地,Query(即 getBooks)上的字段通常被称为架构的 "queries"(就像 [=14= 上的字段一样) ] 类型通常称为架构的 "mutations"。
  • 我们发送给服务器的完整请求字符串,包括整个操作和任何相关的fragments正式称为文档。但是,我们通常将发出请求称为查询您的服务器。这导致文档本身经常被称为查询,操作是否包含实际上是 query 或不同的操作,如 mutation.