web-dev-qa-db-ja.com

GraphQLでのクエリとミューテーションの命名のポイントは何ですか?

素朴な質問を許してください、しかし私は答えを探し回ってみました、そして私が見つけたすべては曖昧であるか私にとって意味がありません。この例をGraphQL仕様から見てみましょう。

query getZuckProfile($devicePicSize: Int) {
  user(id: 4) {
    id
    name
    profilePic(size: $devicePicSize)
  }
}

このクエリにgetZuckProfileという名前を付ける意味は何ですか?複数の操作を含むGraphQLドキュメントについて何かを見ました。クエリに名前を付けると、返されるデータに何らかの影響がありますか?私はこれを自分でテストしますが、簡単に試すことができるサーバーとデータセットがありません。しかし、どこかのドキュメントのどこかでこれを明確にできるとよいでしょう-これまでの例はすべて、非常に単純な単一のクエリであるか、名前が付けられているが、その理由が説明されていないクエリです(「ここはかっこいいリクエストごとに1つの匿名のクエリを送信すると、手元にないクエリに名前を付けるとどのようなメリットがありますか?

また、突然変異に関しては、私は仕様に見ます:

mutation setName {
  setName(name: "Zuck") {
    newName
  }
}

この場合、setNameを2回指定しています。どうして?これらの1つはミューテーションのフィールド名であり、それをバックエンドスキーマに一致させるために必要であることがわかりますが、なぜそうではないのですか。

mutation {
  setName(name: "Zuck") {
...

同じ名前を2回指定するとどのようなメリットがありますか?最初はおそらく恣意的であることがわかりますが、なぜそれがノイズではないのですか?私は明白な何かを見逃している必要がありますが、これまでに見つけたものは何も私のためにそれを片付けていません。

27
Nolan

クエリ名は、サーバーではまったく意味がありません。これは、クライアントが応答を識別するためにのみ使用されます(単一の要求で複数のクエリ/ミューテーションを送信できるため)。

実際、それがGraphQLリクエストで唯一のものである場合(そしてパラメーターがない場合)は、匿名クエリオブジェクトのみを送信できます。

{
  user(id: 4) {
    id
    name
    profilePic(size: 200)
  }
}

これは、ミューテーションではなく、クエリに対してのみ機能します。

ただし、query(またはmutation)キーワードを使用したら、名前を指定する必要があります。サーバーは理論的には名前がなくても要求を処理できる可能性がありますが、それは現在のGraphQL仕様では許可されていません。

[〜#〜]編集[〜#〜]

@ortaが以下に記すように、この名前はサーバーが永続的なクエリを識別するためにも使用できます。ただし、これはGraphQL仕様の一部ではなく、単なるカスタム実装です。

12
Petr Bela

名前付きクエリを使用して、それらを一貫して監視できるようにし、クエリの永続的なストレージを実行できるようにします。重複がある forクエリ変数 でギャップを埋めます。

例として:

query getArtwork($id: String!) {
  artwork(id: $id) {
    title
  }
}

Artsy GraphQL APIに対して実行できます

利点は、クエリ変数が異なるビットであるため、毎回同じクエリが異なる文字列ではないことです。これは、それらを不変として扱うことができるため、これらのクエリの上にツールを構築できることを意味します。

2
orta