Validación de datos en JavaScript (Node.js): Joi y Yup
En cualquier aplicación web, especialmente en Node.js, una de las tareas clave es verificar los datos entrantes. Sin validación, corre el riesgo de obtener errores en la base de datos, vulnerabilidades (inyección SQL, XSS) o un comportamiento incorrecto del servidor. En este artículo, analizaremos las dos bibliotecas de validación más populares: Joi y Yup. Aprenderá cómo instalarlas, crear esquemas e integrarlas con Express.
¿Por qué es necesaria la validación en el servidor?
La validación del lado del cliente (HTML5 o JavaScript en el navegador) es conveniente, pero se puede omitir fácilmente. Por lo tanto, la verificación del lado del servidor es obligatoria. Garantiza que:
- Los tipos de datos coincidan con los esperados (cadena, número, arreglo).
- Los campos obligatorios no estén vacíos.
- Los datos no excedan los tamaños permitidos.
- Los formatos (email, URL, teléfono) sean correctos.
Biblioteca Joi
Joi es un potente validador de los creadores de Hapi.js. Admite esquemas complejos, mensajes de error personalizados y verificaciones asíncronas.
Instalación
npm install joiEjemplo de esquema para registro de usuario
const Joi = require('joi');
const userSchema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required() .messages({ 'string.min': 'El nombre de usuario debe tener al menos 3 caracteres', 'string.max': 'El nombre de usuario no debe exceder los 30 caracteres' }), email: Joi.string() .email({ tlds: { allow: false } }) .required(), password: Joi.string() .pattern(new RegExp('^[a-zA-Z0-9]{8,30}$')) .required(), birth_year: Joi.number() .integer() .min(1900) .max(2024)});
// Validaciónapp.post('/register', (req, res) => { const { error, value } = userSchema.validate(req.body, { abortEarly: false }); if (error) { return res.status(400).json({ status: 'error', message: error.details.map(d => d.message).join(', ') }); } res.json({ status: 'success', data: value });});Funcionalidades avanzadas de Joi
- Validación de arreglos:
Joi.array().items(Joi.string()) - Reglas condicionales:
.when('role', { is: 'admin', then: Joi.required() }) - Funciones personalizadas:
.custom((value, helpers) => { ... })
Biblioteca Yup
Yup es una biblioteca ligera e intuitiva, popular en el ecosistema de React (Formik). Pero también funciona muy bien en el servidor.
Instalación
npm install yupEjemplo de esquema para inicio de sesión
const yup = require('yup');
const loginSchema = yup.object().shape({ email: yup.string() .email('Ingrese un email válido') .required('El email es obligatorio'), password: yup.string() .min(8, 'La contraseña debe tener al menos 8 caracteres') .max(50) .required('La contraseña es obligatoria')});
// Middleware para Expressasync function validateLogin(req, res, next) { try { const validatedData = await loginSchema.validate(req.body, { abortEarly: false }); req.validatedData = validatedData; next(); } catch (err) { res.status(400).json({ status: 'error', errors: err.errors // arreglo de mensajes de error }); }}
app.post('/login', validateLogin, (req, res) => { res.json({ status: 'success', data: req.validatedData });});Características de Yup
- Validación asíncrona por defecto (devuelve una Promise).
- Transformación de datos:
.transform((value) => value.tr
También en la biblioteca
Trabajo con archivos ZIP en Java: guía completa de java.util.zip
Cliente OAuth para Go (Golang): guía completa de la biblioteca
Cliente OAuth para Go (Golang): Conexión a proveedores OAuth 2.0
Biblioteca estándar de JavaScript (Node.js): revisión completa
Trabajo con fechas en Java: revisión de bibliotecas y herramientas