GraphQL-变量未由操作定义

时间:2019-01-14 14:50:44

标签: graphql apollo-client

我的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对象用户的方法。当前用于我的查询的一种方法是getEntityUsers根解析器方法。该查询如下所示:

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
}

但是,如果我想使用第二种方法并更改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".仍然可以这样做吗?

1 个答案:

答案 0 :(得分:2)

每个操作(查询或变异)必须显式定义您在该操作中使用的任何变量。因此,如果您有一个名为$statusId的变量,则必须在操作定义中指定该变量的类型:

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

在查询中使用这些变量的地方(无论是在根级别还是在其他地方)都是无关紧要的-必须始终将它们定义为操作定义的一部分。