NodeJS : comment résoudre l'erreur UnhandledPromiseRejectionWarning ?

Les applications développées à destination de la plateforme NodeJS utilisent le langage Javacript. Elles font beaucoup appel aux promesses. Il s'agit d'un objet qui représente le résultat d'une opération. Le langage JavaScript étant asynchrone, de nombreuses actions vont s'effectuer simultanément. Les promesses permettent à une action de s'effectuer après le résultat d'une autre. On peut ainsi lier des éléments dans le code. Le message d'erreur "UnhandledPromiseRejectionWarning" est lié à l'utilisation de ces promesses.

Ce message d'erreur est appelé lorsque le cas d'erreur d'une promesse n'a pas été traité par votre application. Pour traiter une erreur, vous devez implémenter la méthode "catch()" dans le code appelant la promesse. Voici un exemple de promesse correctement implémentée avec le framework de test mocha.

it("Transition correctement implémentée", () => {
    ...
     //On crée la promesse
    return new Promise((resolve, reject) => {
    //Code de la fonction qui à la fin terminera la promesse
        }).then((state) => {
             //Code si la promesse s'est bien exécutée
        })
        .catch((error) => {
          //Code si la promesse a échoué
        });
});

Il est donc bien important d'implémenter la fonction "catch()" pour gérer les erreurs.

Cette erreur peut survenir dans un autre cas : le code présent dans la fonction appelée par la directive "catch()" provoque lui aussi une erreur. Voici un exemple :

.catch((error) => {
    console.error(error,'Promise error');
    done();
});

Ici, l'erreur est d'appeler la fonction "done()" liée à la promesse. En effet, lorsque l'on arrive dans la méthode "catch()", la promesse s'est arrêtée car une erreur est survenue. On ne peut appeler la méthode "done()" car la promesse est interrompue. La méthode ne sera donc jamais appelée et vous allez créer une erreur due au temps maximum d'exécution de la promesse qui est dépassé. L'erreur sera de type "UnhandledPromiseRejectionWarning". Il ne faut donc pas utiliser de code basé sur la gestion des promesses dans la fonction appelée en cas d'échec. Utilisez plutôt des fonctions simples comme une fonction de log.

JavaScript