Validación de datos en Node.js con Joi: guía completa

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 Node.js con Joi

En las aplicaciones web modernas con Node.js, la validación de datos es una etapa críticamente importante en el procesamiento de solicitudes. Los errores en los datos pueden provocar vulnerabilidades, funcionamiento incorrecto o caídas del servidor. Una de las bibliotecas más potentes y populares para esta tarea es Joi (se pronuncia «yoy»). Permite describir esquemas de datos y verificar que cumplan con las reglas establecidas.



¿Qué es Joi?

Joi es una biblioteca para describir esquemas y validar objetos de JavaScript. Es especialmente popular en el ecosistema de Node.js, donde se usa a menudo junto con Express, Hapi o Fastify. Joi proporciona una API simple y expresiva para definir tipos, campos obligatorios, rangos, expresiones regulares y validaciones personalizadas.



Instalación

Instalación de Joi mediante npm:

npm install joi


Ejemplo básico

Creemos un esquema para validar los datos de un usuario:

const Joi = require('joi');

const schema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required(), password: Joi.string() .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')), email: Joi.string() .email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })});

const data = { username: 'user123', password: 'pass123', email: 'user@example.com'};

const { error, value } = schema.validate(data);

if (error) { console.log('Error de validación:', error.details);} else { console.log('Datos correctos:', value);}


Métodos y reglas principales

Joi admite múltiples tipos y modificadores:

  • Tipos de datos: Joi.string(), Joi.number(), Joi.boolean(), Joi.date(), Joi.array(), Joi.object().
  • Obligatoriedad: .required() — campo obligatorio.
  • Restricciones: .min(), .max(), .length() — para cadenas y arreglos.
  • Expresiones regulares: .pattern(regex) — verificación según patrón.
  • Email y URL: .email(), .uri() — validadores integrados.
  • Mensajes personalizados: .messages() — reemplazo de errores estándar.


Validación de objetos y arreglos anidados

Joi maneja muy bien estructuras complejas:

const addressSchema = Joi.object({    street: Joi.string().required(),    city: Joi.string().required(),    zip: Joi.string().pattern(/^\\d{5}$/)});

const userSchema = Joi.object({ name: Joi.string().required(), age: Joi.number().integer().min(18).max(120), addresses: Joi.array().items(addressSchema).min(1)});

const userData = { name: 'Ana', age: 25, addresses: [ { street: 'Av. Nevsky', city: 'SPb', zip: '191011' } ]};

const result = userSchema.validate(userData);console.log(result.error ? result.error.details : 'OK');


Manejo de errores

Ante un error de validación, Joi devuelve el objeto error.details — un arreglo con la descripción detallada de cada error:

if (result.error) {    result.error.details.forEach(detail => {        console.log(`Campo: ${detail.path.join('.')}, mensaje: ${detail.message}`);    });}


Uso con Express

Joi se usa a menudo en middleware para verificar solicitudes:

const express = require('express');const Joi = require('joi');const app = express();

app.use(express.json());

const validateUser = (req, res, next) => { const schema = Joi.object({ name: Joi.string().required(), email: Joi.string().email().required() }); const { e

Recommendations