Отправка данных на сервер graphql с запросом-обещанием

Я использую библиотеку request-promise для отправки http-запроса на сервер graphql. Чтобы получить запрос, я делаю это:

const query = `
    {
    user(id:"123173361311") {
      _id
      name
      email
    }
  }
`

const options = {
  uri: "http://localhost:5000/graphql",
  qs: { query },
  json: true
}

return await request(options)

Приведенный выше код работает нормально. Однако я не понимаю, как выполнить мутацию, поскольку мне нужно указать как фактическую мутацию, так и inputData следующим образом:

// Input
{
   name: "lomse"
   email: "[email protected]"
}

const mutation = `
   mutation addUser($input: AddUserInput!){
      addUser(input: $input) {
          _id
          name
          email
      }
   }
`

const option = {
    uri: "http://localhost:5000/graphql",
    formData: {mutation},
    json: true,
    // how to pass the actual data input
}

request.post(option)

Или библиотека request-promise не предназначена для этого варианта использования?


person lomse    schedule 26.01.2020    source источник
comment
запрос также может содержать переменные... проверьте сетевые запросы браузера для получения подробной информации на какой-либо игровой площадке graphiql   -  person xadm    schedule 26.01.2020
comment
Интересно, что вкладка сети не записывает никаких запросов на мутации.   -  person lomse    schedule 26.01.2020
comment
связь через сокет можно использовать   -  person xadm    schedule 26.01.2020
comment
найдите post mutation, т.е. stackoverflow.com/a/51636430/6124657   -  person xadm    schedule 26.01.2020
comment
Исследование показывает, как выполнить мутацию из внешнего интерфейса, а это не то, чего я пытаюсь достичь. В моем случае у меня есть два сервера, которым нужно общаться друг с другом.   -  person lomse    schedule 26.01.2020
comment
просто проверьте используемые структуры/параметры и адаптируйте их к вашим потребностям   -  person xadm    schedule 26.01.2020
comment
github.com/prisma-labs/graphql-request, кажется, делает то, что я искал за. Спасибо за время @xadm   -  person lomse    schedule 26.01.2020


Ответы (2)


Используйте body, а не formData. Ваше тело должно состоять из трех свойств:

  • query: Документ GraphQL, который вы отправляете. Даже если операция является мутацией, свойство по-прежнему называется запросом.
  • variables: карта значений ваших переменных, сериализованная как объект JSON. Требуется только в том случае, если в вашей операции используются переменные.
  • operationName: указывает, какую операцию выполнять. Требуется только в том случае, если ваш документ включает несколько операций.
request.post({
  uri : '...',
  json: true,
  body: {
    query: 'mutation { ... }',
    variables: {
      input: {
        name: '...',
        email: '...',
      },
    },
  },
})
person Daniel Rearden    schedule 26.01.2020
comment
Потрясающий! Именно то, что я искал. Упоминается ли это в их документации? Откуда вы взяли эту информацию? - person lomse; 27.01.2020
comment
Поскольку GraphQL не зависит от транспорта, сама спецификация не указывает, как должны обрабатываться HTTP-запросы. Вышеупомянутое в основном просто условность. Однако на официальном сайте это упоминается. - person Daniel Rearden; 27.01.2020
comment
Я, должно быть, пропустил это. Спасибо еще раз - person lomse; 27.01.2020

Библиотека graphql-request, кажется, делает то, что мне нужно, чтобы библиотека request-promise делала .

import { request } from 'graphql-request'

const variables = {
   name: "lomse",
   email: "[email protected]"
}

const mutation = `
   mutation addUser($input: AddUserInput!){
      addUser(input: $input) {
          _id
          name
          email
      }
   }
`

response = await request(uri, mutation, {input: variables})
person lomse    schedule 26.01.2020