Передача объектов в качестве аргумента для мутации 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
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
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

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