Apollo客户端:未定义变量。收到状态码400

JSm*_*ith 4 node.js graphql apollo-client

我正在尝试使用Apollo Client在GraphQL查询中使用动态变量。我遵循了文档,但是Apollo不断给我错误,说我的变量未定义,最终以状态码400响应。

这是Apollo的文档所说的内容:

mutate:(options ?: MutationOptions)=> Promise一个从用户界面触发突变的函数。您可以选择将变量,optimisticResponse,refetchQueries和update作为选项传递,这将覆盖传递给Mutation组件的所有道具。该函数返回一个满足您突变结果的promise。

这是我尝试编写的代码:

const fetch = require('node-fetch');
const ApolloClient = require('apollo-boost').default;
const gql = require('graphql-tag');

const client = new ApolloClient({
    uri: "http://api.domain.com/graphql",
    fetch
});

run();

async function run() {
    try {
        const resp = await client.mutate({
            mutation: gql`mutation {
                trackPr(id: $id, pr: $pr, title: $title, body: $body, state: $state, merged: $merged) {
                    id
                }
            }`,
            variables: {
                id: 1,
                pr: 1,
                title: "test title",
                body: "test body",
                state: "test state",
                merged: false
            },
        });


        console.log(resp.data);
    } catch(ex) {
        console.log(ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我将为每个变量显示一条错误消息,指出尚未定义:

[GraphQL错误]:消息:未定义变量“ $ id”。,位置:[对象对象],[对象对象],路径:未定义

在这些错误消息中的每条消息之后,然后我得到一条状态码为400的最终消息:

[网络错误]:ServerError:响应失败:收到状态码400

突变本身可以很好地运行,而无需使用变量,并且所有值都直接在突变中设置,但是我不知道为什么它认为未定义变量。

Dan*_*den 8

操作中使用的任何变量都必须声明为操作定义的一部分,如下所示:

mutation SomeOptionalMutationName ($id: ID!) {
  trackPr(id: $id) {
    id
  }
}
Run Code Online (Sandbox Code Playgroud)

这使GraphQL可以根据所提供的类型来验证变量,还可以验证是否在使用变量代替正确的输入。