在GraphQL中命名查询和突变有什么意义?

Nol*_*lan 21 graphql

请原谅这个天真的问题,但我已经全神贯注地寻找答案了,我发现的一切都是模糊的,或者对我没有任何意义.以GraphQL规范为例:

query getZuckProfile($devicePicSize: Int) {
  user(id: 4) {
    id
    name
    profilePic(size: $devicePicSize)
  }
}
Run Code Online (Sandbox Code Playgroud)

命名此查询有什么意义?我见过一些关于包含多个操作的GraphQL文档.命名查询是否会以某种方式影响返回的数据?我自己测试了这个,但是我没有可以轻松玩的服务器和数据集来进行实验.但是,如果某个文档中的某些内容可以澄清这一点会很好 - 到目前为止所有示例都是超级简单的单个查询,或者是被命名但却无法解释其原因的查询(除了"这里很酷)你可以做的事情.")当我每次请求发送一个匿名查询时,我从命名查询中得到什么好处?

另外,关于突变,我在规范中看到:

mutation setName {
  setName(name: "Zuck") {
    newName
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您指定getZuckProfile两次.为什么?我得到其中一个是变异的字段名称,需要将其与后端模式匹配,但为什么不:

mutation {
  setName(name: "Zuck") {
...
Run Code Online (Sandbox Code Playgroud)

我可以两次指定相同的名称有什么好处?我知道第一个可能是随意的,但为什么不是噪音呢?我不得不遗漏一些明显的东西,但到目前为止我找不到任何东西已经为我清除了.

Pet*_*ela 15

查询名称在服务器上没有任何意义.它仅用于客户端识别响应(因为您可以在单个请求中发送多个查询/突变).

实际上,如果这是GraphQL请求中的唯一内容(并且没有任何参数),则只能发送一个匿名查询对象:

{
  user(id: 4) {
    id
    name
    profilePic(size: 200)
  }
}
Run Code Online (Sandbox Code Playgroud)

这仅适用于查询,而不适用于突变.

但是,使用query(或mutation)关键字后,您需要提供一个名称.理论上,即使没有名称,服务器也可以处理请求,但这不是当前GraphQL规范允许的.

编辑

正如下面@orta所述,服务器也可以使用该名称来标识持久查询.但是,这不是GraphQL规范的一部分,它只是一个自定义实现.


ort*_*rta 5

我们使用命名查询,以便可以对其进行一致的监视,并可以对查询进行持久存储。那里有重复的查询变量来填补空白。

举个例子:

query getArtwork($id: String!) {
  artwork(id: $id) {
    title
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处使用Artsy GraphQL API运行它

优点是每次查询相同,而不是不同的字符串,因为查询变量是不同的位。这意味着您可以在这些查询之上构建工具,因为您可以将它们视为不可变的。