Si estás escribiendo código en nodejs y prefieres usar async/await para el manejo de promesas te habrás dado cuenta que siempre que quieres controlar un error tienes que agregar un try/catch a tu función.
Veamos el siguiente código:
asyncfunctionfakeHttp(value) {
if (value === 1) {
return"Todo Bien";
} else {
throwError("Problemas técnicos, intente más tarde");
}
}
Una función que retorna una promesa gracias al keyword async, si el valor de value es 1 va a retornar el stringTodo Bien, pero en caso value tenga otro valor la función lanzará una excepción.
Ahora llamamos la función usando un IIFE:
(async () => {
const result = await fakeHttp(1);
console.log(result);
})();
Al ejecutar esto nos retornará en nuestra terminal el mensaje:
'Todo Bien'
Pero ahora nos piden que en caso se lance la excepción mostremos un mensaje en la terminal con el mensaje “Problemas técnicos, intente más tarde”.
Simple, nuestro amigo try/catch al rescate:
(async () => {
try {
const result = await fakeHttp(2);
console.log(result);
} catch (error) {
console.log(error);
}
})();
Listo. Problema resuelto piensas, pero imagina que tu aplicación crece y ya no solo tienes esta función sino 100 más, todas asíncronas y en todas tienes que manejar los errores y mostrar un mensaje similar. Puedes ponerle un try/catch a todas, pero existe una alternativa que te puede evitar eso.
En nodejs puedes escuchar al evento unhandledRejection y ahorrarte esos try/catch de más, tan simple como agregar las siguientes líneas de código:
(async () => {
const result = await fakeHttp(2);
console.log(result);
})();
process.on("unhandledRejection", (error) => {
console.log(error);
});
Esto generará un error ya que la función recibe un parámetro distinto a 1, pero ahora el evento unhandledRejection será el encargado de procesar esos errores.
La ventaja de esto es que tenemos centralizado el manejo de errores en un solo lugar.
¡Saludos! 🚀
A ver si entendí… Dices que puedo tener 1000 funciones asíncronas y en ninguna es necesario incluir el manejo de los errores, siempre que tenga en cualquier otra parte del programa:
process.on(“unhandledRejection”, (error) => { … });
Es así? Funciona sólo en node?