我正在学习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
是传递给解析器的变量吗?
我当然可以记住这种模式,但是我非常想从概念上理解这里的不同部分在做什么。非常感谢任何见解!
答案 0 :(得分:3)
您可能会发现复习the spec很有帮助,但是下面的解释稍微简短一些:
GraphQL中有三个操作(query
,mutation
和subscription
)。通常,一个GraphQL请求仅包含这三个操作之一,它构成了请求的根或架构其余部分的入口。
每个操作都有一个与之关联的对象类型。按照惯例,这些类型分别命名为Query
,Mutation
和Subscription
,但是它们的命名在功能上与架构无关。除了它们与特定操作的关联之外,这些对象类型没有什么特别的-每个对象类型都有一个name
,description
和fields
,就像架构中的任何其他对象类型一样。我们将这三种类型统称为 root操作类型。
在您的示例中,query
根类型具有一个名为getBooks
的 field 。该字段根据与架构中任何其他字段相同的规则进行解析。关于此字段的唯一特殊之处是它位于根目录上-之前没有任何“父”字段已解决。
操作名称是可选的,因为它们不影响服务器返回的数据-它们通常用于调试目的(尽管某些客户端和工具使用它们来提供其他功能,所以拥有它们总是很好的)。但是,必须为您的根操作类型至少指定一个字段名称,否则您的操作实际上将不执行任何操作(即,向服务器查询数据)。同样,这些字段是您进入架构其余部分的入口,也是数据图的起点。
根据规范:
变量必须在操作的顶部定义,并且在执行该操作的范围内。
虽然我们没有在文档内部使用值初始化变量,但是我们确实需要通过告诉GraphQL变量的类型来定义它。这样,GraphQL便可以验证整个文档中变量的用法。例如,如果您将变量定义为String
,然后尝试在Int
的输入字段中使用它,则验证将失败并且您的请求将被执行,甚至无法执行。< / p>
变量始终被定义为操作定义的一部分-尽管它们可以在文档中的任何位置使用,甚至可以多次使用。因此,这里没有“两级参数”-一行只是定义,另一行是用法。
即使我们有一个规范,但GraphQL周围的语言已经超越了其内部概述的术语。 “查询”一词具有多种含义,您在阅读各种文档和文章时可能会遇到。记住这些定义有助于避免混淆:
query
类型关联的根操作类型命名为Query
Query
(即getBooks
)上的字段通常被称为架构的“查询”(就像Mutation
类型上的字段一样)称为架构的“突变”。query
还是其他操作,例如mutation
。