Инъекция переменных GraphQL Axios {}

я пишу простой пример поста в Grapql, используя axios. Идеальный рабочий пример

            let body =  { 
                query: `
                    query {
                        game(id:"5c9beed4a34c1303f3371a38") {
                            _id
                            title
                        }
                    }
                `, 
                variables: {}
            }
            axios.post("http://localhost:3344/graphql", body)
                .then(res => {
                    console.info(res.data) // cool data from server
                })

Но я хотел бы использовать такие переменные, которые я видел в каком-то примере, но я не могу заставить его работать.

            let body =  { 
                query: `
                    query {
                        game(id: $id) { // IT SUPPOSE THE ID VARIABLE SHOULD BE INJECTED HERE
                            _id
                            title
                        }
                    }
                `, 

                variables: {id: "5c9beed4a34c1303f3371a38"} // DECLARED VARIABLE ID
            }
            axios.post("http://localhost:3344/graphql", body)
                .then(res => {
                    console.info(res.data) // 400 (Bad Request)
                })

Объявление типа GRAphQl

            type Query {
                game(id: String!): Game!
            }

Согласно комментариям, я тоже пробовал это. Но все еще не работает

            let body =  { 
                query: `
                    query {
                        Game($id: String!) {
                            game(id: $id) {
                                _id
                                title
                            }
                        }
                    }
                `, 
                variables: {id: "5c9beed4a34c1303f3371a38"}
            }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
0
3 493
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы не передаете переменную id в своем запросе, вы должны определить ее на уровне запроса, как это

 let body =  { 
                query: `
                    query ($id: ID) {
                        game(id: $id) { // IT SUPPOSE THE ID VARIABLE SHOULD BE INJECTED HERE
                            _id
                            title
                        }
                    }
                `, 

                variables: {id: "5c9beed4a34c1303f3371a38"} // DECLARED VARIABLE ID
            }


ПРИМЕЧАНИЕ. Ваш тип должен совпадать с бэкэндом, например ID или String.

Я обновил вопрос с объявлением типа. Я попробовал ваш пример, но не работает. Всего с одним изменением query($id:String)

Rolly 28.03.2019 16:22

Можете ли вы сказать мне, какой у вас тип идентификатора на API? если это тип идентификатора, вы должны написать его здесь.

Mohsin Amjad 28.03.2019 16:33

я добавил пример типа.

Rolly 28.03.2019 16:35

вы пробовали это с запросом ($id: String!), потому что ! необходимо

Mohsin Amjad 28.03.2019 16:36
Ответ принят как подходящий

измените объявление типа на:

 type Query {
   game(id: ID!): Game!
 }

тогда:

const query = `query Game($id: ID!) {
                 game(id: $id) {
                    id
                    title
                 }
              }`;

axios.post("http://localhost:3344/graphql", 
  body: JSON.stringify({
    query,
    variables: { id: "5c9beed4a34c1303f3371a38" },
  })
).then(res => {
     console.info(res.data)
})

но в game(id: ID!) тип идентификатора - это строка

Rolly 28.03.2019 16:33

@roll, какой тип id в вашем определении типа? type Game { id: ID! ... например, тип здесь ID, если это так, вам нужно изменить определение запроса с game(id: String!): Game! на game(id: ID!): Game!, иначе изменить запрос с клиента на const query = `query Game($id: String!) { ...

Fraction 28.03.2019 16:38

Спасибо, ваш пример был наиболее близок к решению.

Rolly 28.03.2019 16:49

Спасибо всем, наконец-то я нашел способ решить проблему.

Может кому еще понадобится.

Определение типа

type Query {
    game(id: String!): Game!
}

Запрос должен быть таким

let body =  { 
    query: `
        query Game($id: String!) { // notice the query Game structure
            game(id: $id) {
                _id
                title
            }
        }`, 
    variables: {id: "5c9beed4a34c1303f3371a38"}
}

axios.post("http://localhost:3938/api/v1/graphql", body)
                .then(res => {
                    console.info(res.data)
                })

Другие вопросы по теме