Validación de datos en JavaScript (Node.js) con Joi y Yup

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 joi


Ejemplo 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 yup


Ejemplo 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

Recommendations