web-dev-qa-db-ja.com

graphql - 演算によって定義されていない変数

My GraphQLスキーマは次のように定義されています。

type Query {
    getEntity(id: Int!): Entity
    getEntityUsers(entityId: Int!, statusId: Int): [User]
}

type Entity {
    id: Int!
    name: String!
    email: String!
    logo: String
    createdAt: DateTime!
    updatedAt: DateTime!

    users(statusId: Int): [User]
}
 _

ご覧のとおり、私はEntityオブジェクトをユーザーに取得する方法が2つあります。現在私の照会のために機能しているものは、getEntityUsers rootリゾルバメソッドです。このクエリは次のようになります。

query getEntityUsers($entityId: Int!, $statusId: Int) {
        users: getEntityUsers(entityId: $entityId, statusId: $statusId) {
            ...
        }
    }
 _

..変数を使って:

{
    entityId: 1,
    statusId: 2
}
 _

statusIdを渡すことを可能にすることによって他の方法を作るためのものですか?今すぐクエリは次のようになります。

query getEntity($id: Int!) {
        entity: getEntity(id: $id) {
            ...
            users (statusId: 2) {
                ... 
            }
        }
    }
 _

これは明らかに変数と連携します。

{
    id: 1
}
 _

しかし、私がこの2番目の方法を使ってstatusIdを変更したい場合はどうなりますか?ルートリゾルバで定義されていない場合は、statusIdを渡す方法はありますか?

クエリを試してみました。

query getEntity($id: Int!) {
        entity: getEntity(id: $id) {
            ...
            users (statusId: $statusId) {
                ... 
            }
        }
    }
 _

..変数を使って:

{
    id: 1,
    statusId: 2
}
 _

しかし、私は誤りを得るだけです:Variable "$statusId" is not defined by operation "getEntity".これを行うには何がありますか?

6
jrkt

すべての操作(クエリまたは突然変異)は、その操作内で使用する変数を明示的に定義する必要があります。そのため、_$statusId_という変数がある場合は、この変数の型を操作定義の一部として指定する必要があります。

_query getEntity($id: Int!, $statusId: Int) {
  # your selection set here
}
_

これらの変数がクエリ内で(ルートレベルまたは他の場所で)使用されている場合は、無関係です - それらは常にあなたの操作定義の一部として定義されなければなりません。

3
Daniel Rearden