Saltar al contenido principal

Validación

La validación en Express.js es esencial para garantizar que los datos recibidos en las solicitudes HTTP cumplan con las reglas definidas antes de ser procesados o almacenados. Esto ayuda a mantener la integridad de los datos y a prevenir errores o vulnerabilidades de seguridad.

Validación con middleware

Express no incluye un sistema de validación por defecto, pero se pueden usar librerías como express-validator para manejar validaciones de forma estructurada:

npm install express-validator

Ejemplo de uso en rutas:

import { body, validationResult } from 'express-validator';

app.post('/usuarios', [
body('nombre').notEmpty().withMessage('El nombre es obligatorio'),
body('email').isEmail().withMessage('Debe ser un correo válido'),
body('edad').optional().isInt({ min: 18 }).withMessage('La edad debe ser un número mayor o igual a 18')
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(422).json({ errores: errors.array() });
}
res.json({ mensaje: 'Datos válidos' });
});

Validación en controladores o servicios

También es posible centralizar la validación en funciones o servicios específicos para mantener los controladores limpios:

function validarUsuario(data) {
const errores = [];
if (!data.nombre) errores.push('El nombre es obligatorio');
if (data.edad && data.edad < 18) errores.push('La edad debe ser mayor o igual a 18');
return errores;
}

Y usar esta función dentro del controlador:

app.post('/usuarios', (req, res) => {
const errores = validarUsuario(req.body);
if (errores.length) return res.status(422).json({ errores });
res.json({ mensaje: 'Datos válidos' });
});

Buenas prácticas y convenciones

  • Validar siempre los datos recibidos, tanto en APIs como en formularios web.
  • Usar middleware de validación para mantener los controladores delgados y claros.
  • Devolver errores en formato estructurado, preferiblemente JSON, con códigos HTTP adecuados (422 Unprocessable Entity).
  • Reutilizar reglas de validación comunes para mantener consistencia entre distintas rutas o controladores.
  • Evitar lógica compleja de validación directamente en rutas; delegar a funciones o servicios especializados.