У меня есть очень простая мутация 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: я посмотрел этот ответ, но я не понял / не поверил, что решение там может быть неполным.
Большое спасибо, кажется, теперь я понял. То есть тип MetaInput я определяю на сервере, а на клиенте я могу просто написать, что он типа MetaInput
и на клиенте не нужно это заново определять, как я теперь понимаю?
Да, если вы используете express-graphql
, хотя, конечно, серверная часть зависит от реализации (и вам не обязательно создавать new GraphQLInputObjectType
самостоятельно — вы можете просто проанализировать определение схемы или что-то в этом роде). Но во внешнем интерфейсе, где вы определяете запрос, вы просто обращаетесь к нему по имени, вам не нужно делать ничего дополнительно.
Хорошо, я думаю, что это было то, что меня смутило!! Большое спасибо. Если вы просто напишете это как ответ, я обязательно приму это :)
Вам нужно определить тип входного объекта в вашей серверной схеме, как что-то вроде
input MetaInput {
name: String
author: String
release: Date
}
и используйте его в определении editArticle
extend type Mutation {
editArticle(id: ID!, title: String, meta: MetaInput): Article
}
Затем вы также можете обратиться к типу MetaInput
в определении вашего mutation EditArticle
на стороне клиента.
Большое спасибо, это очень полезно!
Посмотрите в своей схеме, каковы типы аргументов
editArticle
. Скорее всего, это должно быть что-то вродеMetaInput
. Это должен быть типinput
, а не выходной.