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 joiEjemplo 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 También en la biblioteca
Generación de informes PDF en PHP: revisión de bibliotecas y ejemplos de código
Cliente Elasticsearch para PHP: elasticsearch-php. Guía completa
Cliente Redis para C# (.NET): StackExchange.Redis — conexión y ejemplos
Pruebas en C++: revisión de frameworks y herramientas (Google Test, Catch2, doctest)
Trabajo con archivos ZIP en PHP: ZipArchive y bibliotecas de compresión