Validación de datos en Node.js: Joi, Yup y Zod — elegimos la herramienta correcta
En el desarrollo web moderno con Node.js, la validación de datos no es solo una buena práctica, sino una necesidad. Sin ella, tu servidor corre el riesgo de recibir datos incorrectos, maliciosos o simplemente inesperados del cliente. Esto puede provocar errores en la lógica de la aplicación, vulnerabilidades (inyecciones SQL, XSS) y un funcionamiento inestable. En este artículo, analizaremos las tres bibliotecas más populares para la validación de datos en el entorno Node.js: Joi, Yup y Zod. Conocerás sus características, ventajas y aprenderás a aplicarlas en la práctica.
¿Por qué es necesaria la validación en el servidor?
Muchos desarrolladores confían solo en la validación del frontend (por ejemplo, usando atributos HTML5). Esto es un error. La validación del cliente es fácil de eludir (desactivando JavaScript o enviando una solicitud a través de Postman/curl). La validación del servidor es la última línea de defensa. Garantiza que solo lleguen a tu lógica de negocio y base de datos datos que cumplan con requisitos estrictos: tipo correcto, longitud, formato (email, URL), obligatoriedad de campos, etc.
1. Joi — el veterano probado
Joi (a menudo se usa con el framework Hapi.js, pero también funciona muy bien con Express/Koa) es una de las bibliotecas más potentes y flexibles. Proporciona una API rica para describir esquemas y mensajes de error.
Instalación:
npm install joiEjemplo de uso de Joi para la validación del registro de usuario:
const Joi = require('joi');
const schema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required() .messages({ 'string.min': 'El nombre de usuario debe tener al menos {#limit} caracteres', 'string.max': 'El nombre de usuario debe tener como máximo {#limit} caracteres' }), password: Joi.string() .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')) .required(), email: Joi.string() .email({ minDomainSegments: 2, tlds: { allow: ['com', 'net', 'ru'] } }) .required(), birth_year: Joi.number() .integer() .min(1900) .max(2023)});
const validateUser = (data) => { const { error, value } = schema.validate(data, { abortEarly: false }); if (error) { // Devolvemos todos los errores return { valid: false, errors: error.details.map(d => d.message) }; } return { valid: true, data: value };};
// Ejemplo de llamadaconst result = validateUser({ username: 'jo', password: '123', email: 'test@test', birth_year: 1800});console.log(result.errors);// Salida: ['El nombre de usuario debe tener al menos 3 caracteres', '"password" length must be at least 3 characters long', '"email" must be a valid email', '"birth_year" must be less than or equal to 2023']Ventajas de Joi:
- Gran cantidad de validadores integrados (email, URL, UUID, tarjeta de crédito, teléfono, etc.).
- Soporte para validación condicional (when, switch).
- Excelentes mensajes de error con posibilidad de traducción y personalización.
- Documentación detallada.
Desventajas:
- Tamaño de la biblioteca (alrededor de 60 KB comprimido).
- La API puede parecer voluminosa para esquemas simples.
- Integración compleja con TypeScript (requiere tipos adicionales).
2. Yup — simplicidad y composición
Yup fue creado originalmente para la validación de formularios en React (en conjunto con Formik), pero también funciona muy bien en el servidor. Su principal ventaja es una sintaxis concisa y legible, que recuerda a los esquemas de mongoose.
Instalación:
npm install yupEjemplo de validación de un array de objetos con Yup:
const yup = require('yup');
cons También en la biblioteca
Contenedor de Inyección de Dependencias Swift: Swinject para iOS/macOS
nock para TypeScript: guía completa con ejemplos prácticos
Generación de PDF en C# (.NET): mejores bibliotecas y ejemplos de código
kotlinx-datetime en Kotlin: guía completa con ejemplos prácticos