GraphQL Mutations (Мутации)
Что такое Mutation?
Mutation — это операция для изменения данных. Эквивалент POST/PUT/DELETE в REST API.
Синтаксис базовой мутации
graphql
mutation {
createUser(name: "John", email: "john@example.com") {
id
name
email
}
}Именованная мутация
graphql
mutation CreateNewUser {
createUser(name: "John", email: "john@example.com") {
id
name
}
}Аргументы и Input типы
graphql
input CreateUserInput {
name: String!
email: String!
password: String!
}
type Mutation {
createUser(input: CreateUserInput!): User!
}Использование:
graphql
mutation {
createUser(input: {
name: "John"
email: "john@example.com"
password: "secret123"
}) {
id
name
email
}
}Переменные в мутациях
graphql
mutation CreateUser($input: CreateUserInput!) {
createUser(input: $input) {
id
name
email
}
}Переменные:
json
{
"input": {
"name": "John",
"email": "john@example.com",
"password": "secret123"
}
}Частые паттерны мутаций
Создание (Create)
graphql
mutation {
createPost(title: "GraphQL Guide", content: "...") {
id
title
createdAt
}
}Обновление (Update)
graphql
mutation {
updateUser(id: "123", name: "Jane Doe") {
id
name
email
}
}Удаление (Delete)
graphql
mutation {
deletePost(id: "456") {
success
message
}
}Возвращаемые данные
Всегда возвращайте изменённые данные — клиент может их использовать для обновления UI.
graphql
mutation {
updateUser(id: "123", status: "active") {
id
name
status
updatedAt
}
}Обработка ошибок
graphql
mutation CreateUser($input: CreateUserInput!) {
createUser(input: $input) {
user {
id
name
}
errors {
field
message
}
}
}Пакетные мутации
graphql
mutation BatchOperations {
updateUser1: updateUser(id: "1", name: "User One") {
id
name
}
updateUser2: updateUser(id: "2", name: "User Two") {
id
name
}
}Мутации с вложенными данными
graphql
mutation CreatePostWithComments {
createPost(
title: "New Post"
content: "Content..."
comments: [
{ text: "Great post!" }
{ text: "Thanks for sharing" }
]
) {
id
title
comments {
id
text
}
}
}Практические примеры
Регистрация пользователя
graphql
mutation Register($email: String!, $password: String!, $name: String!) {
register(email: $email, password: $password, name: $name) {
token
user {
id
name
email
}
}
}Обновление профиля
graphql
mutation UpdateProfile($input: UpdateProfileInput!) {
updateProfile(input: $input) {
id
name
bio
avatar
updatedAt
}
}Добавить комментарий
graphql
mutation AddComment($postId: ID!, $text: String!) {
addComment(postId: $postId, text: $text) {
id
text
author {
name
}
createdAt
}
}Лучшие практики
✅ Рекомендации
- Используйте Input типы — логичнее и понятнее
- Возвращайте изменённые данные — для обновления UI
- Включите информацию об ошибках — помощь клиентам
- Используйте понятные имена — createUser вместо addUser
- Валидируйте на сервере — никогда не доверяйте клиентам
❌ Избегайте
- ❌ Множество аргументов вместо Input типа
- ❌ Молчаливое игнорирование ошибок
- ❌ Возврат только ID без данных
- ❌ Побочные эффекты без явного обозначения
Идемпотентность
graphql
mutation CreateUserIdempotent($idempotencyKey: String!, $input: CreateUserInput!) {
createUser(idempotencyKey: $idempotencyKey, input: $input) {
user {
id
}
idempotencyKey
}
}Это предотвращает дублирование при повторных запросах.
Дальше
Изучите Subscriptions для обновлений в реальном времени.