Validación de Datos con Zod
Zod es una biblioteca de validación TypeScript-first.
Instalación
bash
npm install zodSchemas Básicos
typescript
import { z } from 'zod'; // Stringsconst nameSchema = z.string().min(2).max(100); // Númerosconst priceSchema = z.number().positive(); // Objetosconst productSchema = z.object({ name: z.string().min(2), price: z.number().positive(), description: z.string().optional(),}); // Inferir tipo TypeScripttype Product = z.infer<typeof productSchema>;Middleware de Validación
typescript
// src/middlewares/validate.middleware.tsimport { Request, Response, NextFunction } from 'express';import { AnyZodObject, ZodError } from 'zod'; export const validate = (schema: AnyZodObject) => { return async (req: Request, res: Response, next: NextFunction) => { try { await schema.parseAsync({ body: req.body, query: req.query, params: req.params, }); next(); } catch (error) { if (error instanceof ZodError) { return res.status(400).json({ error: 'Error de validación', details: error.errors.map(e => ({ field: e.path.join('.'), message: e.message, })), }); } next(error); } };};Schemas de Validación
typescript
// src/schemas/product.schema.tsimport { z } from 'zod'; export const createProductSchema = z.object({ body: z.object({ name: z.string() .min(2, 'El nombre debe tener al menos 2 caracteres') .max(200, 'Nombre muy largo'), price: z.number() .positive('El precio debe ser positivo'), description: z.string().optional(), categoryId: z.string().uuid('Categoría inválida'), }),}); export const updateProductSchema = z.object({ params: z.object({ id: z.string().uuid(), }), body: z.object({ name: z.string().min(2).max(200).optional(), price: z.number().positive().optional(), }),}); export type CreateProductInput = z.infer<typeof createProductSchema>['body'];Uso en Rutas
typescript
import { validate } from '../middlewares/validate.middleware';import { createProductSchema, updateProductSchema } from '../schemas/product.schema'; router.post('/', validate(createProductSchema), controller.store); router.put('/:id', validate(updateProductSchema), controller.update);Validaciones Comunes
typescript
// Emailz.string().email() // URLz.string().url() // UUIDz.string().uuid() // Enumz.enum(['ADMIN', 'USER']) // Arraysz.array(z.string()).min(1) // Fechasz.coerce.date() // Transformacionesz.string().transform(val => val.toLowerCase())Resumen
- ✅ Zod para validación declarativa
- ✅ Inferencia automática de tipos TypeScript
- ✅ Middleware de validación reutilizable
- ✅ Mensajes de error formateados
Próxima clase: Tratamiento de Errores! 🚀