2017-07-16 56 views
0

我想實現一個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 } 
      } 
     } 
     ` 
    }) 
} 

任何想法,我犯了我的錯誤?

回答

2

當使用變量,有需要採取三個步驟:

  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

很高興幫助:)祝你好運! –