#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()