Comment utiliser les middleware avec express en utilisant next()<span class="wtr-time-wrap after-title"><span class="wtr-time-number">3</span> min read</span>

Comment utiliser les middleware avec express en utilisant next()3 min read

Parfois, vous avez besoin d’enchaîner plusieurs fonctions dans une seule route express. Par exemple, si vous avez besoin d’exécuter du code après un callback.

Dans la grande majorité des cas, une architecture async await classique fonctionne. Mais si vous êtes ici, vous êtes probablement bloqués.

Utiliser next() avec express

le mot clé next qui est passé dans les paramètre de la fonction est une fonction qui va appeler la prochaine fonction dans les arguments. Voici un exemple :


router.get('/maroute', function(req, res, next){
    console.log('effectue des actions');
    next()
}, function(req, res, next){
    console.log('effectue encore des actions')
    res.send('terminé')
})

Ici, on enchaîne deux fonctions. Dans la première, on effectue des actions, on appelle ensuite next. La seconde fonction est exécutée. Dans celle-ci, on effectue encore des actions et on envoi la réponse

Utiliser next() avec des callbacks

Une des grande utilité de next, c’est de l’utiliser dans des callbacks. Dans le cas ou vous devez utiliser un callback pour récupérer des données, vous pouvez écrire la suite de votre route comme ceci :

router.get('/maroute', function(req, res){
    maFonction('paramètres', function(error, result){
        console.log(result)
        // effectue des actions
        res.send('terminé')
    })
})

Dans ce genre de cas, c’est gérable. Mais si vous enchaînez les callbacks, votre code devient vite illisible :

router.get('/maroute', function(req, res){
    maFonction('paramètres', function(error, result){
        console.log(result)
        // effectue des actions
        secondeCallback(result, function(error, result){
            console.log(result)
            // effectue des actions dans la seconde callback
            dernièrecallback(result, function(error, result){
                console.log(result)
                // effectue les dernières actions
                res.send('terminé')
            })
        }) 
    })
})

Comme vous le voyez, ça devient déjà plus compliqué. Il est possible de simplifier les choses en utilisant next() :

router.get('/maroute', function(req, res, next) {
    maFonction('data', function(err, result){
        // effectue des traitements
        next();
    })
}, function(req, res){
    // effectue des opérations
    res.send('terminé')
})

Cette méthode permets d’évité l’empilement de callbacks, aussi appelé callback hell. Sauf qu’on ne peux pas sauvegarder les données d’une callback d’une fonction à l’autre.

Conserver des données entre les fonctions

Voyons maintenant comment régler le problème de conservation des données. Pour se faire, on va modifier l’objet req qui est conservé entre les fonctions :

router.get('/maroute', function(req, res, next) {
    maFonction('data', function(err, result){
        // effectue des traitements
        req.result = result
        next();
    })
}, function(req, res){
    // effectue des opérations
    console.log(req.result) // on récupère le résultat du callback de la fonction précédente
    res.send('terminé')
})

Il vous suffit tout simplement de modifier l’objet req afin de stocker les données. Vous pouvez ensuite y accéder dans les fonctions qui suivent.

Il est possible de stocker autant de données que vous voulez et sur une infinité de fonctions. Ne modifiez pas les objets qui existent à la base comme req.body, req.params etc…

En conclusion

next() permets d’exécuter plusieurs fonctions dans une seule route afin de rendre notre code plus propre. Vous pouvez enchaîner des callbacks sans soucis, passer à la prochaine fonction si celle actuelle est inutile etc… C’est une fonctionnalité très pratique que j’utilise beaucoup.

Vous pouvez aussi stocker des valeurs d’une fonction à l’autre en modifiant l’objet req-

Laisser un commentaire

Fermer le menu
×
×

Panier