为什么每个GraphQL查询/突变都有“两个名称”?

时间:2019-03-20 19:24:58

标签: graphql apollo apollo-server

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

  

...命名操作以便快速识别是很有意义的   调试过程中的操作或汇总类似操作   在一起...操作可以通过在   查询或变异关键字,就像我们在此处使用HomeBookListing所做的那样:

query HomeBookListing {   
     getBooks {
     title   
     } 
 }

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

类似地,当您将变量传递给查询时,为什么会有“两级”参数,像这样

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

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

我当然可以记住这种模式,但是我非常想从概念上理解这里的不同部分在做什么。非常感谢任何见解!

1 个答案:

答案 0 :(得分:3)

您可能会发现复习the spec很有帮助,但是下面的解释稍微简短一些:

什么是操作?

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

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

在您的示例中,query根类型具有一个名为getBooks field 。该字段根据与架构中任何其他字段相同的规则进行解析。关于此字段的唯一特殊之处是它位于根目录上-之前没有任何“父”字段已解决。

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

好的,但是变量呢?

根据规范:

  

变量必须在操作的顶部定义,并且在执行该操作的范围内。

虽然我们没有在文档内部使用值初始化变量,但是我们确实需要通过告诉GraphQL变量的类型来定义它。这样,GraphQL便可以验证整个文档中变量的用法。例如,如果您将变量定义为String,然后尝试在Int的输入字段中使用它,则验证将失败并且您的请求将被执行,甚至无法执行。< / p>

变量始终被定义为操作定义的一部分-尽管它们可以在文档中的任何位置使用,甚至可以多次使用。因此,这里没有“两级参数”-一行只是定义,另一行是用法。

一个关于语义的词

即使我们有一个规范,但GraphQL周围的语言已经超越了其内部概述的术语。 “查询”一词具有多种含义,您在阅读各种文档和文章时可能会遇到。记住这些定义有助于避免混淆:

  • 按照惯例,我们将与query类型关联的根操作类型命名为Query
  • 非正式地,该Query(即getBooks)上的字段通常被称为架构的“查询”(就像Mutation类型上的字段一样)称为架构的“突变”。
  • 我们发送到服务器的完整请求字符串,包括整个操作和任何相关的fragments,正式称为 document 。但是,我们通常将发出请求称为查询服务器。这导致文档本身经常被称为查询,无论该操作实际上包含query还是其他操作,例如mutation