En GraphQL, los tipos de entrada (Input Types) son una característica esencial que permite a los desarrolladores definir estructuras de datos que pueden ser utilizadas como argumentos en las consultas y mutaciones. A diferencia de los tipos de salida, que definen cómo se estructuran los datos que se devuelven al cliente, los tipos de entrada definen cómo se estructuran los datos que se envían al servidor.
Conceptos Clave
- Definición de Tipos de Entrada: Los tipos de entrada se definen utilizando la palabra clave
input
en el esquema de GraphQL. - Uso en Mutaciones: Los tipos de entrada son especialmente útiles en mutaciones, donde se necesita enviar datos complejos al servidor.
- Validación de Datos: Los tipos de entrada permiten validar la estructura de los datos antes de que lleguen a los resolvers.
Definición de un Tipo de Entrada
Para definir un tipo de entrada en GraphQL, se utiliza la palabra clave input
seguida del nombre del tipo y las propiedades que contiene. A continuación, se muestra un ejemplo básico:
En este ejemplo, UserInput
es un tipo de entrada que contiene tres campos: name
, email
y age
. Los campos name
y email
son obligatorios (indicados por !
), mientras que age
es opcional.
Uso de Tipos de Entrada en Mutaciones
Los tipos de entrada son particularmente útiles en mutaciones, donde se necesita enviar datos complejos al servidor. A continuación, se muestra cómo se puede utilizar el tipo de entrada UserInput
en una mutación:
En este ejemplo, la mutación createUser
acepta un argumento input
de tipo UserInput
. El argumento es obligatorio, como se indica con !
.
Ejemplo Completo
A continuación, se muestra un ejemplo completo que incluye la definición del tipo de entrada, la mutación y el resolver correspondiente:
Definición del Esquema
# Definición del tipo de entrada input UserInput { name: String! email: String! age: Int } # Definición del tipo de salida type User { id: ID! name: String! email: String! age: Int } # Definición de la mutación type Mutation { createUser(input: UserInput!): User }
Implementación del Resolver
const { v4: uuidv4 } = require('uuid'); const resolvers = { Mutation: { createUser: (parent, args, context, info) => { const { input } = args; const newUser = { id: uuidv4(), ...input }; // Aquí se puede agregar lógica para guardar el usuario en una base de datos return newUser; } } }; module.exports = resolvers;
En este ejemplo, el resolver createUser
recibe el argumento input
, crea un nuevo usuario con un ID único y devuelve el usuario creado.
Ejercicio Práctico
Ejercicio
-
Define un tipo de entrada
ProductInput
con los siguientes campos:name
(String, obligatorio)price
(Float, obligatorio)description
(String, opcional)
-
Crea una mutación
createProduct
que acepte un argumentoinput
de tipoProductInput
y devuelva un tipoProduct
con los siguientes campos:id
(ID, obligatorio)name
(String, obligatorio)price
(Float, obligatorio)description
(String, opcional)
-
Implementa el resolver para la mutación
createProduct
.
Solución
Definición del Esquema
# Definición del tipo de entrada input ProductInput { name: String! price: Float! description: String } # Definición del tipo de salida type Product { id: ID! name: String! price: Float! description: String } # Definición de la mutación type Mutation { createProduct(input: ProductInput!): Product }
Implementación del Resolver
const { v4: uuidv4 } = require('uuid'); const resolvers = { Mutation: { createProduct: (parent, args, context, info) => { const { input } = args; const newProduct = { id: uuidv4(), ...input }; // Aquí se puede agregar lógica para guardar el producto en una base de datos return newProduct; } } }; module.exports = resolvers;
Conclusión
Los tipos de entrada en GraphQL son una herramienta poderosa para estructurar y validar los datos que se envían al servidor. Son especialmente útiles en mutaciones, donde se necesita enviar datos complejos. Al definir tipos de entrada, puedes asegurarte de que los datos recibidos por el servidor tengan la estructura correcta, lo que facilita la implementación de lógica de negocio y la integración con bases de datos.
En el siguiente módulo, exploraremos cómo trabajar con datos en GraphQL, incluyendo la conexión a bases de datos y estrategias de obtención de datos.
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