Manejo de errores en Express
En Express, un middleware de error se distingue de los demás por tener
cuatro parámetros: (err, req, res, next). Express inspecciona la
aridad (número de argumentos) de la función para reconocerlo, así que
los cuatro deben declararse, aunque no uses next.
function manejarErrores(err, req, res, next) {
const status = err.statusCode || 500;
res.status(status).json({ error: err.message });
}
Pasar el error con next(err)
Un handler no captura ni responde el error él mismo: lo delega llamando
a next(err). Cuando se pasa un argumento a next, Express salta todos
los middleware y handlers normales y va directo al middleware de error.
function obtenerUsuario(req, res, next) {
const usuario = buscar(req.params.id);
if (!usuario) {
return next(new Error("Usuario no encontrado")); // delega
}
res.json(usuario);
}
Por qué centralizar
Centralizar el manejo de errores en un solo middleware (registrado al final,
con app.use(manejarErrores)) evita repetir try/catch y respuestas de error
en cada handler. Ventajas:
- Formato uniforme de las respuestas de error en toda la API.
- Un único lugar para registrar (log) los fallos.
- Los handlers quedan limpios: solo expresan el camino feliz y delegan lo demás.
Ejemplos
El middleware de error responde con el estado adecuado
function manejarErrores(err, req, res, next) {
const status = err.statusCode || 500;
return { status, body: { error: err.message } };
}
console.log(manejarErrores({ message: "Roto" }, {}, {}, () => {}));
console.log(manejarErrores({ message: "No existe", statusCode: 404 }, {}, {}, () => {}));