¿Qué es el Error 'UnhandledPromiseRejection' en JavaScript?
El error UnhandledPromiseRejection ocurre en entornos de JavaScript, especialmente en Node.js, cuando una promesa es rechazada (rejected) mediante una función como reject() o al lanzar una excepción dentro de una función async, pero el código no incluye ningún mecanismo para capturar dicho rechazo, como un bloque catch() o un try/catch.
Causas Principales del Error de Promesas No Manejadas
Existen diversos motivos por los cuales este fallo interrumpe la ejecución de tus programas:
- Falta de un bloque
.catch()al final de una cadena de promesas. - Ausencia de una estructura
try...catchdentro de funciones declaradas comoasync. - Errores en llamadas a APIs externas o consultas a bases de datos que fallan silenciosamente sin un manejador de errores asignado.
Método 1: Implementar bloques try/catch en funciones async/await
La forma más limpia y moderna de solucionar este problema al trabajar con sintaxis async/await es envolver tu código en un bloque try...catch.
- Localiza la función asíncrona que está generando el rechazo de la promesa.
- Añade la palabra clave
tryantes del bloque principal de ejecución. - Implementa el bloque
catch(error)para gestionar la excepción de forma controlada.
async function consultarBaseDatos() { try { const resultado = await conectarDB(); console.log(resultado); } catch (error) { console.error('Error capturado con éxito:', error.message); } }Método 2: Añadir .catch() a cadenas de promesas tradicionales
Si tu código no utiliza la sintaxis async/await y prefieres trabajar con el patrón clásico de promesas, debes asegurarte de encadenar siempre un método .catch() al final.
- Identifica la llamada a la función que retorna una promesa.
- Agrega
.catch()al final de la cadena para interceptar cualquier fallo imprevisto.
function procesarDatos() { miFuncionAsincrona() .then(resultado => { console.log(resultado); }) .catch(error => { console.error('Promesa rechazada manejada correctamente:', error); }); }Método 3: Capturar rechazos globales en Node.js (Prevención)
Como medida de seguridad adicional en el servidor, puedes escuchar el evento global para evitar que la aplicación falle de manera abrupta.
- Abre el archivo principal de tu aplicación Node.js (por ejemplo,
app.jsoserver.js). - Añade el escuchador de eventos
unhandledRejectionpara registrar el fallo y cerrar el proceso de forma limpia si es necesario.
process.on('unhandledRejection', (reason, promise) => { console.error('Se ha detectado una promesa no manejada:', promise, 'razón:', reason); // Opcional: process.exit(1); });