Передача объектов в качестве аргумента для мутации GraphQL (graphql-запрос)

У меня есть очень простая мутация graphql во внешнем интерфейсе, которую я отправляю в свой бэкэнд. Я использую этот код на сайте graphql-request в качестве руководства.

С примитивами это работает:

const mutation = gql`
    mutation EditArticle($id: ID!, $title: String) {
      editArticle(id: $id, title: $title) {
        id
      }
    }
  `

Теперь я также хотел бы иметь возможность изменять некоторые метаданные о статье, хранящиеся в объекте meta внутри статьи:

...,
title: "Hello World",
meta: {
 author: "John",
 age: 32,
 ...
}

Итак, мой вопрос: как мне передать непримитивные типы объектов в качестве аргументов для мутаций при выполнении запроса из внешнего интерфейса, используя graphql-запрос?

Я уже пробовал что-то вроде этого:

const Meta = new GraphQLObjectType({
    name: "Meta",
    fields: () => ({
      id: { type: GraphQLID },
      name: { type: GraphQLString },
      age ....
    }),
  })
   
const mutation = gql`
    mutation EditArticle($id: ID!, $title: String, $meta: Meta) { //??? I don't seem to get what goes here? 
      editArticle(id: $id, title: $title, meta: $meta) {
        id
      }
    }
  `

Я также пробовал это с GraphQLObjectType, но я думаю, что здесь я ошибаюсь (так как это интерфейс).

PS: я посмотрел этот ответ, но я не понял / не поверил, что решение там может быть неполным.

Посмотрите в своей схеме, каковы типы аргументов editArticle. Скорее всего, это должно быть что-то вроде MetaInput. Это должен быть тип input, а не выходной.

Bergi 20.12.2020 18:30

Большое спасибо, кажется, теперь я понял. То есть тип MetaInput я определяю на сервере, а на клиенте я могу просто написать, что он типа MetaInput и на клиенте не нужно это заново определять, как я теперь понимаю?

R. Kohlisch 20.12.2020 18:39

Да, если вы используете express-graphql, хотя, конечно, серверная часть зависит от реализации (и вам не обязательно создавать new GraphQLInputObjectType самостоятельно — вы можете просто проанализировать определение схемы или что-то в этом роде). Но во внешнем интерфейсе, где вы определяете запрос, вы просто обращаетесь к нему по имени, вам не нужно делать ничего дополнительно.

Bergi 20.12.2020 18:43

Хорошо, я думаю, что это было то, что меня смутило!! Большое спасибо. Если вы просто напишете это как ответ, я обязательно приму это :)

R. Kohlisch 20.12.2020 18:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
4
5 301
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно определить тип входного объекта в вашей серверной схеме, как что-то вроде

input MetaInput {
  name: String
  author: String
  release: Date
}

и используйте его в определении editArticle

extend type Mutation {
  editArticle(id: ID!, title: String, meta: MetaInput): Article
}

Затем вы также можете обратиться к типу MetaInput в определении вашего mutation EditArticle на стороне клиента.

Большое спасибо, это очень полезно!

R. Kohlisch 20.12.2020 21:01

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