GraphQL - 语法错误GraphQL请求(5:15)预期名称

时间:2017-07-16 15:39:28

标签: javascript graphql

我正在尝试实现一个graphQL API,它在查询方面做得很好,但是对于突变来说效果不是很好:

以下是使用apollo-clientgraphql-tag的基本变异:

import gql from 'graphql-tag'
const addNewPlace = (place) => {
    return client.mutate({
        mutation: gql`
        mutation {
          addNewPlace(
          input: {
            $title: String!
          }
          ) {
            place { title }
          }
        }
        `,
        variables: {
          title: place.title
        }
      })
  }

这里我试图使用变量。当将突变改变为下面的突变时,它会顺利进行,但这不是正确的ID方式。

const addNewPlace = (place) => {
    return client.mutate({
        mutation: gql`
        mutation {
          addNewPlace(
          input: {
            title: "${place.title}"
          }
          ) {
            place { title }
          }
        }
        `
    })
}

知道我犯了哪些错误吗?

1 个答案:

答案 0 :(得分:5)

使用变量时,您需要采取以下三个步骤:

  1. 将变量添加到正在发送的请求中。在Apollo中,通过在传递给variables的对象中指定mutate属性来完成。你写道:

    变量:{title:place.title}

    这很好。我们发送一些变量,称为title,具有任何值,以及对我们服务器的请求。此时,GraphQL甚至不知道变量。

  2. 在您的操作中声明您的变量。您不必为您的操作命名,但这样做是好的做法:

    变异 AddNewPlace($ title:String) {

    在这里,我们告诉GraphQL我们已经包含了一个名为title的变量。您可以将其称为任何东西(例如foo),只要它与您传递给#1中的变量prop的内容相匹配即可。这一步很重要,因为A)GraphQL需要知道变量,B)需要知道传递的变量类型

  3. 最后,在变异中包含变量,如下所示:

    addNewPlace(输入:{title:$ title}){

  4. 注意不要将步骤#2中的变量定义与步骤#3中的输入定义混淆。另外,我假设你的typeDefs包含某种input类型,如AddNewPlaceInput。你可以传入一个像这样的对象,而不是只传入标题:

    variables: { input: { title: place.title } }
    

    然后你的突变看起来像这样:

    mutation AddNewPlace($input: AddNewPlaceInput) {
      addNewPlace(input: $input) {
        # fields returned by the mutation
    

    强烈建议启用Graph i QL端点,这样您就可以在客户端实施查询和突变之前轻松测试它们。

    最后,您可能需要检查并确保突变中要求的字段与您的类型定义匹配。我只是在这里猜测,但是如果您的变异解析为地方类型,那么除非您的地方类型实际上有place { title },否则您不需要titleplace。 1}} field。