Saltar al contenidoPedro Farbo
Lección 6 / 2545 min

Validación de Datos con Zod

Validación de Datos con Zod

Zod es una biblioteca de validación TypeScript-first.

Instalación

bash
npm install zod

Schemas 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! 🚀

¿Te gustó el contenido? ¡Tu contribución ayuda a mantener todo online y gratuito!

PIX:0737160d-e98f-4a65-8392-5dba70e7ff3e