express-validator
express-validator es un wrapper de validator.js diseñado específicamente como middleware de Express — reglas de validación declaradas por campo, que corren como parte de la cadena de middlewares antes de que la request llegue al handler.
Instalación
Sección titulada «Instalación»pnpm add express-validatorbun add express-validatornpm install express-validatorUso básico
Sección titulada «Uso básico»import { body, validationResult } from "express-validator"
app.post( "/usuarios", body("email").isEmail().withMessage("Email no válido"), body("password").isLength({ min: 8 }).withMessage("Mínimo 8 caracteres"), body("edad").isInt({ min: 18 }).withMessage("Debes ser mayor de edad"), (req, res) => { const errores = validationResult(req) if (!errores.isEmpty()) { return res.status(400).json({ errors: errores.array() }) }
// req.body ya pasó las validaciones de arriba crearUsuario(req.body) res.status(201).json({ ok: true }) })Cada body('campo').regla() es un middleware que se agrega a la cadena — corren todos antes del handler final, acumulando errores en vez de cortar en el primero.
Validar distintas fuentes
Sección titulada «Validar distintas fuentes»import { body, param, query } from "express-validator"
app.get( "/posts/:id", param("id").isUUID().withMessage("Id inválido"), query("incluirComentarios").optional().isBoolean(), handler)body valida el body, param los parámetros de ruta (:id), query el query string — cada uno apunta a una parte distinta de la request.
Sanitización
Sección titulada «Sanitización»Además de validar, puede transformar el valor:
body('email').isEmail().normalizeEmail(), // baja a minúsculas, formato consistentebody('nombre').trim().escape(), // recorta espacios, escapa HTMLMiddleware reutilizable para el chequeo de errores
Sección titulada «Middleware reutilizable para el chequeo de errores»Repetir validationResult(req) en cada ruta es innecesario — un middleware lo centraliza:
import type { NextFunction, Request, Response } from "express"import { validationResult } from "express-validator"
export function validar(req: Request, res: Response, next: NextFunction) { const errores = validationResult(req) if (!errores.isEmpty()) { return res .status(400) .json({ error: { code: "VALIDATION_ERROR", fields: errores.array() } }) } next()}app.post( "/usuarios", body("email").isEmail(), body("password").isLength({ min: 8 }), validar, handler)Resumen
Sección titulada «Resumen»| API | Qué hace |
|---|---|
body() / param() / query() | Apuntan a qué parte de la request validar |
.isEmail(), .isLength(), .isInt(), etc. | Reglas encadenables |
.withMessage(msg) | Mensaje de error custom por regla |
validationResult(req) | Junta los errores acumulados de todas las reglas |
Consideraciones — express-validator vs Zod
Sección titulada «Consideraciones — express-validator vs Zod»- Si el proyecto ya usa Zod (por ejemplo, para validar
.envo compartir schemas con un frontend), duplicar reglas de validación en dos sistemas distintos (Zod en un lado, express-validator en otro) es trabajo repetido — un middleware genérico que validereq.bodycontra unz.object()cubre lo mismo sin una segunda API que aprender. express-validatorestá pensado específicamente para Express (las reglas son middlewares) — Zod es agnóstico de framework, útil si el mismo schema necesita reusarse fuera de rutas Express (un CLI, un worker, otro servicio).- Para proyectos que no usan Zod en ningún otro lado, express-validator es una opción válida y directa, sin traer una dependencia extra solo para validar bodies de request.