Supposons que vous ayez un simple bloc de code comme celui-ci:
app.get('/', function(req, res){
res.send('Hello World');
});
Cette fonction a deux paramètres, req
et res
, qui représentent respectivement les objets de demande et de réponse.
D'autre part, il existe d'autres fonctions avec un troisième paramètre appelé next
. Par exemple, jetons un œil au code suivant:
app.get('/users/:id?', function(req, res, next){ // Why do we need next?
var id = req.params.id;
if (id) {
// do something
} else {
next(); // What is this doing?
}
});
Je ne comprends pas à quoi ça next()
sert ni pourquoi il est utilisé. Dans cet exemple, si id n'existe pas, que fait-il next
réellement?
res.send
pour terminer la demande. S'il n'existe pas, il existe probablement un autre gestionnaire qui émettra une erreur et terminera la demande.app.post('/login',function(req,res))
aprèsapp.get('/users',function(req,res))
qu'il appellera la connexion comme la prochaine route dans le fichier app.js en appelant next ()?app.get("/users")
, il sera exécuté si le gestionnaire ci-dessus appelle ensuite.Réponses:
Il passe le contrôle à la prochaine route correspondante . Dans l'exemple que vous donnez, par exemple, vous pouvez rechercher l'utilisateur dans la base de données si un a
id
été donné et l'affecter àreq.user
.Ci-dessous, vous pourriez avoir un itinéraire comme:
Puisque / users / 123 correspondra d'abord à l'itinéraire dans votre exemple, cela vérifiera et trouvera d'abord l'utilisateur
123
;/users
peut alors faire quelque chose avec le résultat de cela.Le middleware de route est un outil plus flexible et plus puissant, à mon avis, car il ne dépend pas d'un schéma d'URI ou d'un ordre de routage particulier. Je serais enclin à modéliser l'exemple montré comme ceci, en supposant un
Users
modèle avec une asyncfindOne()
:Être capable de contrôler le flux comme celui-ci est assez pratique. Vous souhaiterez peut-être que certaines pages ne soient accessibles qu'aux utilisateurs disposant d'un indicateur d'administrateur:
J'espère que cela vous a donné de l'inspiration!
la source
next()
. Ce serait la même chose si je viens de l'utilisernext(new Error(…)); return;
.next(new Error(…)); return;
. Si nous transmettons une valeur ànext
, elle est considérée unilatéralement comme une erreur . Je n'ai pas trop étudié le code express, mais fouillez et vous trouverez ce dont vous avez besoin :)return next(…);
pournext(…); return;
donc c'est moins déroutant.)J'ai également eu du mal à comprendre ensuite (), mais cela a aidé
la source
.get
est appelé et non le 2e?Avant de comprendre
next
, vous devez avoir une petite idée du cycle demande-réponse dans le nœud, mais pas beaucoup en détail. Cela commence lorsque vous faites une requête HTTP pour une ressource particulière et se termine lorsque vous renvoyez une réponse à l'utilisateur, c'est-à-dire lorsque vous rencontrez quelque chose comme res.send ('Hello World');regardons un exemple très simple.
Ici, nous n'avons pas besoin de next (), car resp.send mettra fin au cycle et remettra le contrôle au middleware de route.
Voyons maintenant un autre exemple.
Ici, nous avons 2 fonctions middleware pour le même chemin. Mais vous obtiendrez toujours la réponse du premier. Parce qu'il est monté en premier dans la pile du middleware et que res.send mettra fin au cycle.
Mais que se passe-t-il si nous ne voulons pas toujours le "Hello World !!!!" réponse en retour. Pour certaines conditions, nous pouvons vouloir le "Hello Planet !!!!" réponse. Modifions le code ci-dessus et voyons ce qui se passe.
Que
next
fait-on ici. Et oui, vous pourriez avoir des bus. Cela va sauter la première fonction middleware si la condition est vraie et appeler la prochaine fonction middleware et vous aurez la"Hello Planet !!!!"
réponse.Donc, passez ensuite le contrôle à la fonction suivante dans la pile du middleware.
Que se passe-t-il si la première fonction middleware ne renvoie aucune réponse mais exécute un morceau de logique et que vous obtenez ensuite la réponse de la deuxième fonction middleware.
Quelque chose comme ci-dessous: -
Dans ce cas, vous devez appeler les deux fonctions middleware. Ainsi, la seule façon d'atteindre la deuxième fonction middleware est d'appeler next ();
la source
next()
comporte donc comme ungoto
avec une étiquette câblée? Autrement dit, dans votre troisième extrait, une fois que vous appeleznext()
,res.send("Hello World !!!!");
ne serait jamais exécuté? J'ai remarqué que @Ashe avait toujours unreturn;
après-next
appel qui avait du code dans la même arborescence d'exécution ... Je suppose que je pouvais toujours m'enregistrer express, hein? / court vers son éditeur de texte;)next()
appel est appelé . Dans ce cas,past the next() call
est écrit sur la console, puis j'obtiens uneError: Can't set headers after they are sent.
erreur, car la seconderes.send
est appelée, mais sans succès. Le flux de code revient après l'next()
appel, ce qui rend important @ Ashereturns
(ou toute autre gestion logique).next()
pour ignorer l'exécution des instructions restantes. merci de l'avoir signalé.Next est utilisé pour passer le contrôle à la prochaine fonction middleware. Sinon, la demande sera suspendue ou ouverte.
la source
L'appel de cette fonction appelle la prochaine fonction middleware de l'application. La fonction next () ne fait pas partie de Node.js ou de l'API Express, mais est le troisième argument transmis à la fonction middleware. La fonction next () peut être nommée n'importe quoi, mais par convention, elle est toujours nommée «next».
la source
L'exécution de la
next
fonction informe le serveur que vous avez terminé cette étape de middleware et peut exécuter l'étape suivante de la chaîne.la source