En GraphQL, las mutaciones son operaciones que permiten modificar datos en el servidor. A diferencia de las consultas (queries), que solo leen datos, las mutaciones pueden crear, actualizar o eliminar datos. Este módulo te enseñará cómo definir y utilizar mutaciones en GraphQL.
Contenido
Definición de Mutaciones
Las mutaciones en GraphQL se definen en el esquema de la misma manera que las consultas, pero se agrupan bajo el tipo Mutation
. Cada campo en el tipo Mutation
representa una operación que puede modificar el estado del servidor.
Ejemplo de Definición de Mutación
En este ejemplo, createUser
es una mutación que toma dos argumentos (name
y email
) y devuelve un objeto de tipo User
.
Sintaxis de Mutaciones
La sintaxis para ejecutar una mutación es similar a la de una consulta, pero se utiliza la palabra clave mutation
en lugar de query
.
Ejemplo de Sintaxis de Mutación
mutation { createUser(name: "John Doe", email: "[email protected]") { id name email } }
En este ejemplo, estamos ejecutando la mutación createUser
y solicitando los campos id
, name
y email
del usuario creado.
Ejemplo Práctico: Crear un Usuario
Vamos a implementar una mutación para crear un usuario en un servidor GraphQL.
Paso 1: Definir el Esquema
type User { id: ID! name: String! email: String! } type Mutation { createUser(name: String!, email: String!): User }
Paso 2: Implementar el Resolver
const { v4: uuidv4 } = require('uuid'); const resolvers = { Mutation: { createUser: (parent, args, context, info) => { const newUser = { id: uuidv4(), name: args.name, email: args.email, }; // Aquí se puede agregar el nuevo usuario a una base de datos o a una lista en memoria return newUser; }, }, };
Paso 3: Ejecutar la Mutación
Utiliza una herramienta como GraphiQL o Apollo Playground para ejecutar la siguiente mutación:
mutation { createUser(name: "Jane Doe", email: "[email protected]") { id name email } }
Ejercicio Práctico
Ejercicio: Implementar una Mutación para Actualizar un Usuario
-
Definir el Esquema: Añade una mutación
updateUser
que tomeid
,name
yemail
como argumentos y devuelva un objetoUser
. -
Implementar el Resolver: Escribe el resolver para
updateUser
que actualice un usuario existente. -
Probar la Mutación: Utiliza GraphiQL o Apollo Playground para probar la mutación
updateUser
.
Solución
Paso 1: Definir el Esquema
type Mutation { createUser(name: String!, email: String!): User updateUser(id: ID!, name: String, email: String): User }
Paso 2: Implementar el Resolver
const users = []; // Lista en memoria para almacenar usuarios const resolvers = { Mutation: { createUser: (parent, args, context, info) => { const newUser = { id: uuidv4(), name: args.name, email: args.email, }; users.push(newUser); return newUser; }, updateUser: (parent, args, context, info) => { const user = users.find(user => user.id === args.id); if (!user) { throw new Error('User not found'); } if (args.name) { user.name = args.name; } if (args.email) { user.email = args.email; } return user; }, }, };
Paso 3: Probar la Mutación
mutation { updateUser(id: "some-uuid", name: "John Smith", email: "[email protected]") { id name email } }
Errores Comunes y Consejos
- No manejar errores: Asegúrate de manejar errores adecuadamente en tus resolvers.
- No validar entradas: Valida los datos de entrada para evitar inconsistencias en la base de datos.
- No actualizar el estado del cliente: Si estás utilizando un cliente como Apollo, asegúrate de actualizar el estado del cliente después de una mutación.
Conclusión
En esta sección, hemos aprendido qué son las mutaciones en GraphQL, cómo definirlas y cómo implementarlas en un servidor GraphQL. También hemos visto un ejemplo práctico y un ejercicio para reforzar los conceptos aprendidos. En el siguiente módulo, exploraremos los resolvers en mayor detalle.
Curso de GraphQL
Módulo 1: Introducción a GraphQL
- ¿Qué es GraphQL?
- GraphQL vs REST
- Configuración de un Servidor GraphQL
- Conceptos Básicos del Esquema de GraphQL
Módulo 2: Conceptos Fundamentales
Módulo 3: Diseño Avanzado de Esquemas
Módulo 4: Trabajando con Datos
Módulo 5: Rendimiento y Seguridad
Módulo 6: Herramientas y Ecosistema
Módulo 7: Pruebas y Despliegue
- Pruebas Unitarias de Resolvers
- Pruebas de Integración
- Integración Continua
- Despliegue de Servidores GraphQL