尽管其有效性,但未提供所需类型的变量

Kev*_*vvv 2 javascript reactjs graphql react-native react-apollo

我收到 GraphQL 错误,但我似乎无法查明其来源。

所需类型“String!”的变量“$title” 没有提供。
所需类型“String!”的变量“$body” 没有提供。
所需类型“Int!”的变量“$price” 没有提供。

错误消息很简单。此突变需要三个必需变量,并且错误显示没有提供任何类型,即使明确提供了它们。令人困惑的部分是使用 GraphQL Playground 的相同突变工作得很好。在前端使用其他突变也能正常工作。这告诉我这不是解析器或服务器的问题。

我的突变 GraphQL 如下所示:

export const CREATE_POST_MUTATION = gql`
    mutation CreatePost($title: String!, $body: String!, $price: Int!) {
        createPost(data: {
            title: $title, body: $body, price: $price
            }
        ){
            id
            title
        }
    }
`
Run Code Online (Sandbox Code Playgroud)

我正在使用 Apollo 的 React Hook:

export const CREATE_POST_MUTATION = gql`
    mutation CreatePost($title: String!, $body: String!, $price: Int!) {
        createPost(data: {
            title: $title, body: $body, price: $price
            }
        ){
            id
            title
        }
    }
`
Run Code Online (Sandbox Code Playgroud)

表单的提交处理程序:

    const [createPost, { data, loading }] = useMutation(CREATE_POST_MUTATION, {
        onCompleted: data => {
            setCompleted({
                data,
            })
            setModal(true)
        },
        onError: data => {
            setCompleted({
                isOpen: true,
                error: true,
            })
        },
    }) 
Run Code Online (Sandbox Code Playgroud)

控制台日志记录title显示状态,以便将它们正确传递price到. 即使我直接将值分配给的变量而不传入状态,也会显示相同的错误。这告诉我这些错误与表单无关。descriptioncreatePostcreatePost

我在子组件中使用 Formik 和 Yup 作为表单,但即使我将所有内容都剥离到只剩下TextInput,也会显示相同的错误消息:

服务器端的 GraphQL 架构:

type Mutation {
    createPost(data: CreatePostInput!): Post!
}

input CreateUserInput {
    title: String!
    body: String!
    price: Int!
}
Run Code Online (Sandbox Code Playgroud)

当我在服务器端控制台记录相应的突变解析器时,请求和参数甚至没有到达那里。

lar*_*arz 5

尽管您在内部传递变量data,但您的 graphql 并不期望它们在内部data。所以改变

await createPost({
  variables: {
    data: {
      title,
      body: description,
      price: Number(price),
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

await createPost({
  variables: {
    title,
    body: description,
    price: Number(price),
  }
})
Run Code Online (Sandbox Code Playgroud)

  • 或者,您也可以按原样保留“createPost”调用并更改查询,以便它只有一个具有适当类型的变量(“$data”)。 (2认同)
  • 您的突变使用“mutation CreatePost($title: String!, $body: String!, $price: Int!)”定义变量,然后在突变内部,将它们传递到带有“data”的对象内。但是您必须以与定义变量完全相同的方式传递变量。 (2认同)