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