Manejo de Errores con Boom en Express

Manejo de Errores con Boom en Express

Introducción

Manejo de errores con Boom - Platzi

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

VentajaDescripción
Estándar y ConsistenciaUniformiza los errores HTTP en la aplicación.
PersonalizaciónPermite añadir detalles adicionales a los errores.
CompatibilidadFácil integración con Express y otros frameworks de Node.js.
Depuración SimplificadaIdentifica 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:

Facebook
X
LinkedIn
Reddit
Pinterest
Threads

Post relacionados

Post recientes

Search