Recibo el siguiente error en mi aplicación Node-Express
UnhandledPromiseRejectionWarning: Rechazo de promesa no controlado. Este error se originó al lanzar dentro de una función asíncrona sin un bloque catch o al rechazar una promesa que no se manejó con .catch(). (id de rechazo: 4)
Por decir lo menos, he creado una función de ayuda que se parece a esto
const getEmails = (userID, targettedEndpoint, headerAccessToken) => { return axios.get(base_url + userID + targettedEndpoint, { headers: {"Authorization" : `Bearer ${headerAccessToken}`} }) .catch(error => { throw error}) }y luego estoy importando esta función auxiliar
const gmaiLHelper = require("./../helper/gmail_helper")y llamándolo dentro de mi ruta api así
router.get("/emailfetch", authCheck, async (req, res) => { //listing messages in users mailbox let emailFetch = await gmaiLHelper.getEmails(req.user._doc.profile_id , '/messages', req.user.accessToken) .catch(error => { throw error}) emailFetch = emailFetch.data res.send(emailFetch) })Por mi parte, creo que estoy manejando el error usando el bloque catch.
Pregunta: ¿Puede alguien explicarme por qué recibo el error y cómo puedo solucionarlo?
.catch(error => { throw error}) no es operativo. Da como resultado un rechazo no controlado en el controlador de ruta.
Como se explica en esta respuesta , Express no admite promesas, todos los rechazos deben manejarse manualmente:
router.get("/emailfetch", authCheck, async (req, res, next) => { try { //listing messages in users mailbox let emailFetch = await gmaiLHelper.getEmails(req.user._doc.profile_id , '/messages', req.user.accessToken) emailFetch = emailFetch.data res.send(emailFetch) } catch (err) { next(err); } })Sugiero eliminar el siguiente código de getMails
.catch(error => { throw error})En su función principal, debe poner espera y el código relacionado en el bloque Try y también agregar un bloque catch donde falla el código.
su función gmailLHelper.getEmails debe devolver una promesa que tiene rechazo y resolución en ella.
Ahora, mientras llama y usa await, coloque eso en el bloque try catch (elimine el .catch) como se muestra a continuación.
router.get("/emailfetch", authCheck, async (req, res) => { //listing messages in users mailbox try{ let emailFetch = await gmaiLHelper.getEmails(req.user._doc.profile_id , '/messages', req.user.accessToken) } catch (error) { // your catch block code goes here })Está detectando el error, pero luego lo vuelve a lanzar. Debe intentar manejarlo con más gracia, de lo contrario, su usuario verá 500, servidor interno, errores.
Es posible que desee enviar una respuesta que le diga al usuario qué salió mal y registrar el error en su servidor.
No estoy seguro exactamente de qué errores podría devolver la solicitud, es posible que desee devolver algo como.
router.get("/emailfetch", authCheck, async (req, res) => { try { let emailFetch = await gmaiLHelper.getEmails(req.user._doc.profile_id , '/messages', req.user.accessToken) emailFetch = emailFetch.data res.send(emailFetch) } catch(error) { res.status(error.response.status) return res.send(error.message); }) })Este código deberá adaptarse para que coincida con los errores que obtiene de la llamada axios.
También convertí el código para usar la sintaxis de prueba y captura ya que ya está usando async.