Я не могу получить переменные в запросе 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
, как в егорешение.