Vue Apollo: переменные не добавляются в запрос graphql, или я неправильно принимаю их в бэкэнде (Golang) - PullRequest
0 голосов
/ 26 февраля 2019

Я не могу получить переменные в запросе graphql, выполненном с помощью apollo, в тело запроса, которое будет принято на бэкэнд-сервер.

У меня есть простой внешний интерфейс vue и переход на бэкэнд.В vue-компоненте у меня есть следующий запрос:

apollo: {
    entry: {
      query: gql`
        query variables($userID: Int){
          entries(userID: $userID) {
            id,
            value,
            timeStamp
          }
        }
      `,
      variables() {
        return {
          userID: 2
        }
      },

      update: data => data,
    }
  }
}

На моем бэкэнде я добавляю функцию-обработчик для всех запросов POST

// GraphQL returns an http.HandlerFunc for our /graphql endpoint
func (s *Server) GraphQL() http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        //Allow CORS here By * or specific origin
        w.Header().Set("Access-Control-Allow-Origin", "*")

        w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
        // Check to ensure query was provided in the request body
        if r.Body == nil {
            http.Error(w, "Must provide graphql query in request body", 400)
            return
        }

        var rBody reqBody
        // Decode the request body into rBody
        err := json.NewDecoder(r.Body).Decode(&rBody)
        if err != nil {
            http.Error(w, "Error parsing JSON request body", 400)
        }

        fmt.Println(rBody.Query)

        // Execute graphql query
        result := gql.ExecuteQuery(rBody.Query, *s.GqlSchema)

        // render.JSON comes from the chi/render package and handles
        // marshalling to json, automatically escaping HTML and setting
        // the Content-Type as application/json.
        render.JSON(w, r, result)
    }
}

Когда я запускаю запрос, явернул {"записи": ноль}.Когда я распечатываю запрос, который был отправлен на мой сервер go, я получаю следующее:

query variables($userID: Int) {
  entries(userID: $userID) {
    id
    value
    timeStamp
    __typename
  }
}

В строке 2 этого я надеюсь увидеть записи (userID: 2).Действительно, если я удаляю переменные из моего запроса, выполненного в vue, и жестко кодирую userID в запросе, все работает.

Я проверил, чтобы убедиться, что переменная каким-то образом отправляется, что, если я посмотрю наСделанный POST-запрос имеет следующие параметры:

operationName   variables
query   query variables($userID: Int) { entries(userID: $userID) { id value timeStamp __typename } }
variables   {…}
userID  2

Не правильно ли я принимаю данные на моем бэкэнде, так как переменная userID отправляется в запросе POST?

Решение: Спасибо @cgcgbcbc за решение.Моя reqBody структура была следующей:

type reqBody struct {
    Query     string                 `json:"query"`
}

Когда это должно быть:

type reqBody struct {
    Query     string                 `json:"query"`
    Variables map[string]interface{} `json:"variables"`
}

Тогда мне просто нужно было передать rBody.Variables моей функции ExecuteQuery, как в егорешение.

1 Ответ

0 голосов
/ 26 февраля 2019

По вашему вопросу, данные, получаемые в вашем бэкэнде, верны, сам запрос не содержит параметр запроса, параметр запроса отправляется с помощью клавиши variables.

Проблема ответа - эта строка result := gql.ExecuteQuery(rBody.Query, *s.GqlSchema).variables из тела запроса также необходимо передать в ExecuteQuery.Примером реализации с использованием функции graphql-go/graphql Do может быть

func executeQuery(query string, schema graphql.Schema, variables map[string]interface{}) *graphql.Result {
    result := graphql.Do(graphql.Params{
        Schema:        schema,
        RequestString: query,
        VariableValues: variables
    })
    if len(result.Errors) > 0 {
        fmt.Printf("errors: %v", result.Errors)
    }
    return result
}

. Примером типа reqBody может быть

type reqBody struct {
    Query string
    Variables map[string]interface{}
}

Тогда json.NewDecoder(r.Body).Decode(&rBody) автоматически установит Query иПеременные

...