Передача объектов в качестве аргумента для мутации 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: я просмотрел этот ответ, но я не понял/не поверил решение там может быть неполным.


person R. Kohlisch    schedule 20.12.2020    source источник
comment
Посмотрите в своей схеме, каковы типы аргументов editArticle. Скорее всего, это должно быть что-то вроде MetaInput. Это должен быть тип input, а не выходной.   -  person Bergi    schedule 20.12.2020
comment
Большое спасибо, кажется, теперь я понял. То есть тип MetaInput я определяю на сервере, а на клиенте я могу просто написать, что это тип MetaInput и нет необходимости определять это снова на клиенте, как я теперь понимаю?   -  person R. Kohlisch    schedule 20.12.2020
comment
Да, если вы используете express-graphql, хотя, конечно, серверная сторона зависит от реализации (и вам не обязательно создавать new GraphQLInputObjectType самостоятельно - вы можете просто проанализировать определение схемы или что-то в этом роде). Но во внешнем интерфейсе, где вы определяете запрос, вы просто обращаетесь к нему по имени, вам не нужно делать ничего дополнительно.   -  person Bergi    schedule 20.12.2020
comment
Хорошо, я думаю, что это было то, что меня смутило!! Большое спасибо. Если вы просто напишете это как ответ, я обязательно приму это :)   -  person R. Kohlisch    schedule 20.12.2020


Ответы (1)


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

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

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

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

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

person Bergi    schedule 20.12.2020
comment
Большое спасибо, это очень полезно! - person R. Kohlisch; 20.12.2020