Manejo de Errores con Boom en Express
Introducción
Manejar errores de manera adecuada en aplicaciones backend es fundamental para ofrecer respuestas consistentes y facilitar la depuración. Boom, una biblioteca diseñada específicamente para manejar errores HTTP, se integra perfectamente con Express.js y permite crear respuestas de error estándar y claras.
En este artículo, aprenderás qué es Boom, cómo implementarlo en un proyecto Express y cómo manejar diferentes tipos de errores con ejemplos prácticos.
¿Qué es Boom?
Boom es una biblioteca de JavaScript que simplifica la creación de errores HTTP en aplicaciones Node.js. Proporciona una forma uniforme de generar respuestas de error con códigos de estado HTTP, mensajes y datos personalizados.
Características principales de Boom:
- Generación de errores HTTP estándar (400, 404, 500, etc.).
- Personalización de mensajes y datos en los errores.
- Mejora la consistencia en las respuestas de error.
Instalación de Boom:
Para usar Boom en tu proyecto, primero instálalo con npm:
npm install @hapi/boom
Importancia del Manejo de Errores en Express
El manejo de errores en Express es esencial para:
- Garantizar respuestas coherentes al cliente.
- Evitar fugas de información sensible en entornos de producción.
- Mejorar la depuración en el desarrollo.
Implementación de Boom en Express
Crear Errores con Boom
Boom permite crear errores HTTP fácilmente:
const Boom = require('@hapi/boom');
// Crear un error 404 (No Encontrado)
const error404 = Boom.notFound('El recurso solicitado no existe');
// Crear un error 400 (Solicitud Incorrecta)
const error400 = Boom.badRequest('Datos de entrada no válidos');
// Crear un error genérico 500 (Error Interno del Servidor)
const error500 = Boom.internal('Ocurrió un error en el servidor');
Ejemplo Práctico: API con Manejo de Errores
Estructura del Proyecto
src/
│
├── routes/
│ └── usuarios.routes.js
│
├── middlewares/
│ └── manejoErrores.middleware.js
│
└── app.js
Archivo usuarios.routes.js
Define las rutas y lanza errores en caso necesario.
const express = require('express');
const Boom = require('@hapi/boom');
const router = express.Router();
const usuarios = [{ id: 1, nombre: 'Juan' }];
// Obtener un usuario por ID
router.get('/:id', (req, res, next) => {
const usuario = usuarios.find(u => u.id === parseInt(req.params.id));
if (!usuario) {
return next(Boom.notFound('Usuario no encontrado'));
}
res.status(200).json(usuario);
});
// Crear un nuevo usuario
router.post('/', (req, res, next) => {
const { nombre } = req.body;
if (!nombre) {
return next(Boom.badRequest('El campo "nombre" es obligatorio'));
}
const nuevoUsuario = { id: usuarios.length + 1, nombre };
usuarios.push(nuevoUsuario);
res.status(201).json(nuevoUsuario);
});
module.exports = router;
Middleware de Manejo de Errores (manejoErrores.middleware.js
)
Intercepta errores generados con Boom y devuelve una respuesta uniforme.
const Boom = require('@hapi/boom');
const manejoErrores = (err, req, res, next) => {
if (Boom.isBoom(err)) {
const { output } = err;
return res.status(output.statusCode).json(output.payload);
}
// Error genérico si no es un error Boom
res.status(500).json({
statusCode: 500,
error: 'Internal Server Error',
message: 'Ocurrió un error inesperado',
});
};
module.exports = manejoErrores;
Archivo app.js
Configura la aplicación Express con rutas y el middleware de manejo de errores.
const express = require('express');
const usuariosRoutes = require('./routes/usuarios.routes');
const manejoErrores = require('./middlewares/manejoErrores.middleware');
const app = express();
app.use(express.json());
// Rutas
app.use('/usuarios', usuariosRoutes);
// Middleware de manejo de errores
app.use(manejoErrores);
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Servidor corriendo en http://localhost:${PORT}`);
});
Casos de Uso Reales
Validaciones de Entrada
Si el cliente envía datos incorrectos, puedes devolver un error 400 personalizado:
router.post('/', (req, res, next) => {
const { email } = req.body;
if (!email || !email.includes('@')) {
return next(Boom.badRequest('El campo "email" debe ser válido'));
}
res.status(201).json({ mensaje: 'Usuario creado con éxito' });
});
Gestión de Permisos
Si un usuario intenta acceder a un recurso sin autorización:
router.get('/admin', (req, res, next) => {
const { esAdmin } = req.user;
if (!esAdmin) {
return next(Boom.forbidden('No tienes permiso para acceder a este recurso'));
}
res.status(200).json({ mensaje: 'Bienvenido al panel de administrador' });
});
6. Ventajas de Usar Boom
Ventaja | Descripción |
---|---|
Estándar y Consistencia | Uniformiza los errores HTTP en la aplicación. |
Personalización | Permite añadir detalles adicionales a los errores. |
Compatibilidad | Fácil integración con Express y otros frameworks de Node.js. |
Depuración Simplificada | Identifica rápidamente la causa de los errores gracias a su estructura. |
Conclusión
Manejar errores correctamente es fundamental para el desarrollo de aplicaciones web robustas. Boom ofrece una solución sencilla y poderosa para generar y gestionar errores HTTP de manera uniforme. Implementarlo en tus proyectos Express mejora tanto la experiencia del usuario como la eficiencia en el desarrollo.
Links de referencia: