Пост-запрос GraphQL в axios

У меня проблема с GraphQL. Я хочу отправить запрос axios.post на свой сервер. Я могу это сделать в почтальоне:

{
    "query":"mutation{updateUserCity(userID: 2, city:\"test\"){id name age city knowledge{language frameworks}}} "
}

и в graphiql:

mutation {
  updateUserCity(userID: 2, city: "test") {
    id
    name
    age
    city
    knowledge {
      language
      frameworks
    }
  }
}

но не могу этого сделать в моем коде: ((вот мой фрагмент кода:

const data = await axios.post(API_URL, {
  query: mutation updateUserCity(${ id }: Int!, ${ city }: String!) {
    updateUserCity(userID: ${ id }, city: ${ city }){
      id
      name
      age
      city
      knowledge{
        language
        frameworks
      }
    }
  }
}, {
    headers: {
      'Content-Type': 'application/json'
    }
  })

что не так в моем коде?

Вероятно, хорошая ссылка, похоже, в строке запроса нет данных. medium.com/@stubailo/…

Austio 15.10.2018 14:37

нет, я пробовал этот метод, но это не помогло

Tatevik 15.10.2018 14:52
graphql.org/graphql-js/passing-arguments
xadm 15.10.2018 21:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
20
3
29 273
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Похоже, вы пытаетесь передать в запрос переменные. Если я не ошибаюсь, то, что у вас есть в вызове axios, отличается от других.

const data = await axios.post(API_URL, {
  query: `
    updateUserCity(userID: ${id}, city:${city}){
      id
      name
      age
      city
      knowledge{
        language
        frameworks
      }
    }
  `
}, {
  headers: {
    'Content-Type': 'application/json'
  }
});

Я считаю, что это должно сработать, если у вас есть переменные id и city, определенные до этого вызова.

Так не должно быть. GraphQL имеет специальный интерфейс переменных, и это может легко сломаться, если ввод содержит кавычки.

WoLfulus 12.03.2021 17:54
Ответ принят как подходящий

Значение параметра query, передаваемое в запросе, должно быть строкой, а имена переменных, передаваемых в запросы GraphQL, должны иметь префикс $. Вместо этого вы использовали строковые литералы для переменных в запросе. Также переменные могут быть переданы в почтовом запросе с помощью ключа variables.

Если вы измените свой код на что-то вроде ниже, он должен заработать:

const data = await axios.post(API_URL, {
  query: `mutation updateUserCity($id: Int!, $city: String!) {
    updateUserCity(userID: $id, city: $city){
      id
      name
      age
      city
      knowledge{
        language
        frameworks
      }
    }
  }`,
  variables: {
    id: 2,
    city: 'Test'
  }
}, {
    headers: {
      'Content-Type': 'application/json'
    }
  })

Мне пришлось заключить фигурные скобки в переменные в обратные кавычки, чтобы он работал

ihossain 07.11.2019 21:08

Что делать, если аргументы имеют произвольный тип? тогда как это сделать?

Dev AKS 03.06.2021 20:28

@DevAKS: Я не понял, что вы имели в виду под нестандартным типом. Не могли бы вы поделиться примером?

Raeesaa 03.06.2021 21:15

@Raeesaa, вы принимаете аргумент в своей мутации как переменную Int и String, поэтому предположим, что у вас есть, например, определенный пользователем тип - Location {lat: Int, lng: Int}

Dev AKS 05.06.2021 17:21

я хотел бы поделиться с вами своим простым рабочим примером

            let id = "5c9beed4a34c1303f3371a39";
            let body =  { 
                query: `
                    query {
                        game(id:"${id}") {
                            _id
                            title
                        }
                    }
                `, 
                variables: {}
            }
            let options = {
                headers: {
                    'Content-Type': 'application/json'
                }
            }
            axios.post('http://localhost:3938/api/v1/graphql',body, options)
                .then((response)=>{
                    console.info(response);
                });

Так не должно быть. GraphQL имеет специальный интерфейс переменных, и это может легко сломаться, если ввод содержит кавычки.

WoLfulus 12.03.2021 17:54

Это сработало для меня с некоторыми изменениями. Спасибо!

cpit 05.04.2021 08:48

использование строковых литералов для переменных является злоупотреблением graphql, гораздо менее безопасным / читаемым / управляемым

xadm 30.04.2021 15:41

Мне нравится использовать следующий синтаксис, который похож на принятый ответ, но более явный.

Обратите внимание, что объект variables вложен внутри объекта data и является родственником объекта query.

const data = await axios({
  url: API_URL,
  method: 'post',
  headers: {
    'Content-Type': 'application/json',
    // any other headers you require go here
  },
  data: {
    query: `
      mutation updateUserCity($id: Int!, $city: String!) {
        updateUserCity(userID: $id, city: $city){
          id
          name
          age
          city
          knowledge{
            language
            frameworks
          }
        }
      }
    `,
    variables: {
      id: 2,
      city: 'Test'
    }
  }
});

для WordPress GQL https://docs.wpgraphql.com/getting-started/posts/ Кажется, сейчас это работает для меня с Nuxt

async asyncData() {
const data = {
  query: `query GET_POSTS($first: Int) {
    posts(first: $first) {
      edges {
        node {
          postId
          title
          excerpt
          date
          content
          author {
            node {
              username
            }
          }
        }
      }
    }
  }`,
  variables: {
    first: 5
  }
}

const options = {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  data: data,
  url: 'http://localhost/graphql'
};
    
try {
  const response = await axios(options);

  console.info(response.data.data.posts.edges);
  console.info(response.data.data.posts.edges.length);
} catch (error) {
  console.error(error);
}

},

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