Scénario : considérez que ce qui suit est la partie du code d'une application Web de nœud.
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next(); //or return next();
}
});
Problème : je suis en train de vérifier lequel utiliser juste next()
ou return next()
. L'exemple de code ci-dessus fonctionne exactement de la même manière pour les deux et n'a montré aucune différence d'exécution.
Question : Quelqu'un peut-il faire la lumière là-dessus, quand utiliser next()
et quand utiliser return next()
et une différence importante?
res.redirect('/')
vsreturn res.redirect('/')
dans ce type de situation? Il est peut-être préférable de toujours écrire return devant les instructions res pour éviter les erreurs de définition des en-têtes après leur envoi?Comme la réponse de @Laurent Perrin:
Je donne un exemple ici si vous écrivez un middleware comme celui-ci:
Vous découvrirez que la sortie dans la console est:
Autrement dit, il exécute le code ci-dessous next () une fois toutes les fonctions middleware terminées.
Cependant, si vous utilisez
return next()
, il sautera immédiatement le rappel et le code ci-dessousreturn next()
dans le rappel sera inaccessible.la source
express
cette réponse m'a rendu les choses plus claires que les autres réponses. Pouces vers le haut!res.redirect('/')
vsreturn res.redirect('/')
dans ce type de situation? Il est peut-être préférable de toujours écrirereturn
devant lesres
instructions pour éviter les erreurs de définition des en-têtes après leur envoi?next()
fait partie du middleware connect . Les rappels pour le flux du routeur ne se soucient pas de savoir si vous retournez quelque chose de vos fonctions, doncreturn next()
etnext(); return;
c'est fondamentalement le même.Si vous souhaitez arrêter le flux de fonctions, vous pouvez utiliser
next(err)
comme suitPretty much
next()
est utilisé pour étendre le middleware de vos requêtes.la source
next('No ID')
:?next('No ID')
envoie en fait une erreur, ce qui interrompra le flux.Il vaut mieux ne pas l'utiliser du tout! J'explique, et c'est ce que je fais aussi l'expliquer.
La fonction next () qui peut avoir n'importe quel nom et par convention a été définie sur next. Il est indirectement lié aux opérations (PUT, GET, DELETE, ...) qui sont généralement effectuées sur la même ressource URI par exemple
/ user /: id
Maintenant, si vous regardez app.get, app.put et app.delete utilisent le même uri (/ user /: id), la seule chose qui les différencie est leur implémentation. Lorsque la demande est faite (req) express place la req en premier dans app.get, si une validation que vous avez créée parce que cette demande n'est pas pour ce contrôleur échoue, elle transmet la demande à app.put qui est la prochaine route dans le fichier et ainsi sur. Comme vu dans l'exemple ci-dessous.
Le problème, c'est qu'à la fin vous finissez par passer la req à tous les contrôleurs en espérant qu'il y en a un qui fait ce que vous voulez, via la validation de la req. À la fin, tous les contrôleurs finissent par recevoir quelque chose qui n'est pas pour eux :(.
Alors, comment éviter le problème de next () ?
La réponse est vraiment simple.
1- il ne devrait y avoir qu'un seul uri pour identifier une ressource
http: // IpServidor / colection /: resource / colection /: resource si votre URI est plus long que cela, vous devriez envisager de créer un nouvel uri
Exemple http: // IpServidor / users / pepe / contacts / contacto1
2-Toutes les opérations sur cette ressource doivent être effectuées en respectant l'idempotence des verbes http (get, post, put, delete, ...) donc l'appel à un URI n'a vraiment qu'une seule façon d'appeler
Plus d'infos [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources[1]
Voyons le code! L'implémentation concrète qui nous fait éviter l'utilisation de next ()!
Dans le fichier index.js
Dans le fichier usersRoute.js
Maintenant, le fichier usersRoute.js fait ce qu'un fichier appelé usersRoute est censé faire, c'est-à-dire gérer les routes de l'URI / users /
// fichier getUsersController.js
De cette façon, vous évitez l'utilisation du suivant, vous découplez le code, vous gagnez en performance, vous développez SOLID, vous laissez la porte ouverte à une éventuelle migration vers des microservices et surtout, il est facile à lire par un programmeur.
la source
Suivant() :
la source