Как создать мутацию Graqhql с существующими переменными

#node.js #graphql

#node.js #graphql

Вопрос:

Это может показаться странным вопросом или чем-то действительно простым, но, честно говоря, я изо всех сил пытаюсь понять, как это сделать. Я работаю в Node.js и я хочу установить данные, которые я сохранил на объекте node, в мою мутацию GraphQL.

Я работаю с API GraqhQL поставщика, так что это не то, что я создал сам, и у меня нет файла схемы для этого. Я создаю мутацию, которая вставит запись в их приложение, и я могу выписать все вручную и использовать такой инструмент, как Postman, для ручного создания новой записи … структура мутации — не моя проблема.

Что я изо всех сил пытаюсь выяснить, так это то, как создать мутацию с переменными из моего объекта node, не просто объединяя кучу строк вместе.

Например, это то, чего я пытаюсь избежать:

 class MyClass {
  constructor() {
    this.username = "my_username"
    this.title = "Some Title"
  }
}

const obj = new MyClass()

let query = "mutation {
  createEntry( input: {
    author: { username: ""   obj.username   "" } 
    title: ""   obj.title   ""
  })
}"

  

Я заметил, что существует несколько различных пакетов узлов для работы с Graphql, но ни одна из их документации, которую я видел, действительно не затрагивает вышеуказанную ситуацию. Я потерпел полную неудачу в своих попытках поиска в Google, может кто-нибудь, пожалуйста, указать мне правильное направление? Есть ли пакет, который полезен для простого построения запросов, не требуя схемы или пытаясь отправить их одновременно?

Комментарии:

1. @xadm да, спасибо, вот почему я прямо сказал, что пытаюсь ИЗБЕЖАТЬ этого.

2. Использование Apollo на стороне сервера является излишним и может привести к неожиданному поведению из-за политик кэша по умолчанию. Вам не нужен Apollo просто для использования переменных с вашим запросом. Использование обычной библиотеки HTTP отлично подходит.

Ответ №1:

Службы GraphQL обычно реализуют эту спецификацию при использовании HTTP в качестве транспорта. Это означает, что вы можете создать POST-запрос с четырьмя параметрами:

  • запрос — документ, содержащий операции GraphQL и фрагменты для выполнения.
  • OperationName — (необязательно): название операции в документе для выполнения.
  • переменные — (необязательно): значения для любых переменных, определенных операцией.
  • расширения — (необязательно): эта запись зарезервирована для разработчиков, чтобы расширять протокол так, как они считают нужным.

Вы можете использовать удобную для узла версию выборки, такую как перекрестная выборка, axios , request или любую другую библиотеку по вашему выбору, чтобы выполнить фактический HTTP-запрос.

Если у вас есть динамические значения, которые вы хотите заменить внутри запроса, вы должны использовать переменные для этого. Переменные определены как часть вашего определения операции в верхней части документа:

 const query = `
mutation ($input: SomeInputObjectType!) {
  createEntry(input: $input) {
    # whatever other fields assuming the createEntry
    # returns an object and not a scalar
  }
}
`
  

Обратите внимание, что используемый вами тип будет зависеть от типа, указанного в input аргументе — замените SomeInputObjectType на соответствующее имя типа. Если поставщик не предоставил адекватную документацию для своего сервиса, у вас должен быть, по крайней мере, доступ к экземпляру GraphiQL или GraphQL Playground, где вы можете посмотреть тип аргумента. В противном случае вы можете использовать любой общий клиент GraphQL, такой как Altair, и просмотреть схему таким образом.

После того, как вы создали свой запрос, сделайте запрос следующим образом:

 const variables = {
  input: {
    title: obj.title,
    ...
  }
}
 
const response = await fetch(YOUR_GRAPHQL_ENDPOINT, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ query, variables }),
})
const { data, errors } = await response.json()