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

问题描述:

我想实现一个graphQL API,它去很好地查询,但它会不会那么好与突变:使用apollo-client我的基本突变GraphQL - 语法错误GraphQL请求(5:15)预期的名称

这里和graphql-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. 添加变量来发送的请求。在Apollo中,它是通过在传递给mutate的对象内指定一个variables属性完成的。你写道:

    变量:{title:place.title}

    这很好。我们发送一些名为title的变量以及任何值以及对服务器的请求。在这一点上,GraphQL甚至不知道变量。

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

    突变AddNewPlace($标题:字符串) {

    在这里,我们告诉GraphQL我们提供了一个叫做变量标题。你可以称它为任何东西(例如foo),只要它符合你传递给#1中变量prop的东西。这一步非常重要,因为A)GraphQL需要了解变量和B),它需要知道你传递什么类型的变量的

  3. 最后,包括变量在你的突变,就像这样:。

    addNewPlace(输入:{标题:$标题}){

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

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

然后你的突变是这样的:

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

我会强烈建议使得图形 QL端点,因此您可以在客户端实施它们之前轻松测试您的查询和突变。

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

+0

这是一个非常好的解释。感谢那!它帮助我解决了我的问题。现在深入研究GraphQL文档以更好地了解它。 – Ancinek

+0

很高兴帮助:)祝你好运! –