¿Qué es el Error 'UnhandledPromiseRejection' en JavaScript?
El error UnhandledPromiseRejection ocurre en JavaScript (especialmente en entornos de Node.js) cuando una promesa es rechazada mediante una llamada a reject() o lanzando una excepción dentro de una función asíncrona, pero no existe un bloque .catch() o un bloque try/catch para capturar dicho fallo.
Este problema puede causar comportamientos inesperados en tus aplicaciones y, en versiones recientes de Node.js, termina por finalizar el proceso de la aplicación de manera abrupta, comprometiendo la estabilidad del servidor.
Causas Principales de las Promesas No Manejadas
- Falta de encadenamiento del método
.catch()al consumir una promesa. - Omisión del bloque
try/catchdentro de funciones declaradas con la palabra claveasync. - Peticiones HTTP o consultas a bases de datos que fallan y cuya respuesta de error no es interceptada.
Método 1: Implementar bloques try/catch en funciones Async/Await
La forma más limpia y moderna de solucionar este error en código asíncrono es envolviendo la lógica propensa a fallos dentro de una estructura try/catch.
Ejemplo incorrecto que genera el error:
async function obtenerDatos() {
const datos = await api.falla();
console.log(datos);
}
obtenerDatos();Ejemplo corregido aplicando el método:
async function obtenerDatos() {
try {
const datos = await api.falla();
console.log(datos);
} catch (error) {
console.error('Error capturado correctamente:', error.message);
}
}
obtenerDatos();Método 2: Agregar el método .catch() a las promesas tradicionales
Si estás trabajando con promesas basadas en callbacks o encadenamiento clásico en lugar de async/await, asegúrate de finalizar siempre tu cadena de ejecución con un manejador de errores.
Ejemplo de solución:
fetch('https://api.ejemplo.com/datos')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => {
console.error('Se produjo un error en la solicitud:', error);
});Método 3: Capturar rechazos globales en Node.js (Red de seguridad)
Como medida preventiva global en el entorno de backend con Node.js, puedes escuchar el evento a nivel de proceso para evitar que la aplicación se ciera inesperadamente:
process.on('unhandledRejection', (reason, promise) => {
console.error('Promesa no manejada detectada:', promise, 'Motivo:', reason);
// Opcional: realizar limpieza y cerrar el proceso de forma controlada
});