web-dev-qa-db-fra.com

UnhandledPromiseRejectionWarning: Cette erreur provient soit du lancement à l'intérieur d'une fonction asynchrone sans bloc catch

Je reçois l'erreur suivante dans mon application Node-Express

UnhandledPromiseRejectionWarning: Rejet de promesse non géré. Cette erreur est due soit au lancement d'une fonction asynchrone sans bloc catch, soit au rejet d'une promesse qui n'a pas été gérée avec .catch (). (identifiant de rejet: 4)

Pour dire le moins, j'ai créé une fonction d'aide qui ressemble à ceci

const getEmails = (userID, targettedEndpoint, headerAccessToken) => {
    return axios.get(base_url + userID + targettedEndpoint,  { headers: {"Authorization" : `Bearer ${headerAccessToken}`} })
    .catch(error => { throw error})
}

puis j'importe cette fonction d'aide

const gmaiLHelper = require("./../helper/gmail_helper")

et l'appeler à l'intérieur de mon itinéraire api comme celui-ci

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)
})

De mon côté, je pense que je gère l'erreur en utilisant catch block.

Question: Quelqu'un peut-il m'expliquer pourquoi j'obtiens l'erreur et comment puis-je la corriger?

24
anny123

.catch(error => { throw error}) est un no-op. Il en résulte un rejet non géré dans le gestionnaire d'itinéraire.

Comme expliqué dans cette réponse , Express ne prend pas en charge les promesses, tous les rejets doivent être traités manuellement:

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);
  }
})
17
Estus Flask

Je suggère de supprimer le code ci-dessous de getMails

 .catch(error => { throw error})

Dans votre fonction principale, vous devez mettre en attente et le code associé dans le bloc Try et également ajouter un bloc catch où vous code d'échec.


vous fonction gmaiLHelper.getEmails devrait retourner une promesse qui a rejeté et résolu en elle.

Maintenant, lors de l'appel et de l'utilisation de l'attente, mettez-le dans le bloc try catch (supprimez le .catch) comme ci-dessous.

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
})
4
Sumer

Vous attrapez l'erreur mais vous la relancez. Vous devriez essayer de le gérer plus gracieusement, sinon votre utilisateur verra 500 erreurs sur le serveur interne.

Vous voudrez peut-être renvoyer une réponse indiquant à l'utilisateur ce qui ne va pas ainsi que l'enregistrement de l'erreur sur votre serveur.

Je ne sais pas exactement quelles erreurs la demande pourrait renvoyer, vous voudrez peut-être retourner quelque chose comme.

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);
    })

})

Ce code devra être adapté pour correspondre aux erreurs que vous obtenez de l'appel axios.

J'ai également converti le code pour utiliser la syntaxe try and catch puisque vous utilisez déjà async.

2
tmcnicol