‫- : Dans cette vidéo, créons
‫un type spécial de middleware appelé param middleware.
‫Ainsi, le middleware param est un middleware qui ne s'exécute
‫que pour certains paramètres, donc fondamentalement,
‫lorsque nous avons un certain paramètre dans notre URL.
‫Maintenant, dans notre exemple ici, le seul
‫paramètre que nous pourrions avoir dans notre URL de route est l'identifiant, n'est-ce pas ?
‫Et donc nous pouvons écrire un middleware
‫qui ne s'exécute que lorsque cet identifiant est présent
‫dans l'URL, d'accord, alors laissez-moi vous montrer comment le faire.
‫C'est assez simple en fait, donc c'est
‫sur notre routeur et ensuite la méthode param, d'accord.
‫Et donc ici, nous spécifions d'abord le
‫paramètre que nous voulons réellement rechercher, donc
‫fondamentalement le paramètre pour
‫lequel ce middleware va s'exécuter, et il s'appelle id,
‫puis bien sûr notre fonction middleware réelle.
‫Et comme d'habitude, nous avons accès à la requête
‫et à l'objet de
‫réponse, puis détecte une fonction middleware
‫également pour la fonction suivante, n'est-ce pas ?
‫Maintenant, dans une fonction
‫middleware param, nous avons en fait accès à un quatrième
‫argument et celui-ci est la valeur du paramètre en question.
‫Nous appelons donc généralement cela un val, qui représente la valeur.
‫Et maintenant, nous pouvons continuer et simplement
‫l'enregistrer sur la console,
‫juste pour voir si cela fonctionne réellement, alors disons que l'identifiant de la
‫tournée est, puis l'identifiant, n'est-ce pas ?
‫Ensuite, nous devons également appeler le prochain, n'est-ce pas ?
‫Parce que sinon, le cycle de réponse à
‫la demande restera bloqué dans cette
‫fonction middleware et il ne pourra pas passer
‫au middleware suivant de la pile, n'est-ce pas ?
‫Quelles seront ces routes ici.
‫Très bien, alors sauvegardons-le et vérifions-le maintenant.
‫Et nous voulons que ce ne soit
‫pas pour tous les utilisateurs, mais pour un seul Tour, n'est-ce pas ?
‫Eh bien, laissez-moi vous
‫montrer d'abord ce qui se passe si nous n'avons pas d'identifiant, d'accord, et
‫maintenant, nous ne voyons aucune connexion dans notre console.
‫Mais si j'envoie maintenant la même requête
‫sur cette route où nous avons l'identifiant, voyons ce qui se passe ensuite.
‫Oh, ça me dit que id n'est pas
‫défini, et en effet ce n'est pas id, donc c'était une erreur stupide.
‫Donc c'est val pour la valeur, non?
‫Alors rappelez-vous comment j'ai dit que ce paramètre de valeur
‫est celui qui contiendra
‫réellement la valeur du paramètre id, et donc bien
‫sûr, c'est celui que nous devons ensuite utiliser
‫ici pour avoir accès à cet id.
‫Essayons donc à nouveau, et maintenant nous avons
‫effectivement l'identifiant de tournée est deux, n'est-ce pas ?
‫Ce journal est donc venu directement de cette fonction ici.
‫Maintenant, ce que je
‫veux aussi vous montrer, c'est que cette
‫fonction middleware ne s'exécutera pour aucune des routes utilisateur.
‫Supposons donc que nous appelions un utilisateur avec un identifiant spécifique,
‫alors allons-y et copions celui-ci
‫ici, créons une nouvelle demande avec un identifiant et
‫permettez-moi de l'enregistrer également.
‫Donc, récupérez l'utilisateur et enregistrez-le dans l'utilisateur, et lorsque je l'envoie ici, nous obtenons bien sûr
‫notre réponse standard de cet
‫itinéraire n'est pas défini, mais vous voyez également que
‫nous n'avons pas de journal comme nous l'avions auparavant.
‫Et c'est bien sûr parce que cette fonction middleware n'est
‫spécifiée que dans notre routeur de tournée.
‫Donc dans ce genre de mini application
‫locale, encore une fois, c'est l'analogie que j'aime faire.
‫Donc, fondamentalement, chaque routeur
‫est une sorte de mini sous-application, une pour chaque ressource.
‫Et donc puisque ce middleware n'est spécifié que sur ce routeur,
‫eh bien bien sûr, ce
‫n'est qu'une partie de la pile
‫middleware si nous sommes réellement à l'intérieur de cette sous-application.
‫Logique?
‫Supposons donc que nous ayons une demande entrante sur tours/id.
‫Donc, cette demande passera ensuite par tous ces middleware, donc
‫d'abord ce middleware, puis celui-ci, puis ce
‫middleware, puis celui-ci, donc tout cela fait partie
‫de la pile de middleware et
‫ensuite il touchera finalement ce middleware et
‫puisque c'est en fait
‫l'itinéraire, il entrera ensuite dans le middleware tourRouter.
‫D'accord, et à partir de là, il va directement dans ce
‫middleware, et alors ce code sera exécuté.
‫Et encore une fois, c'est uniquement parce qu'il a un identifiant dans la route.
‫Sinon, eh bien, cela serait simplement ignoré et
‫passerait directement au middleware suivant
‫dans la pile, donc ceux-ci ici, n'est-ce pas ?
‫Cool, c'est ainsi que fonctionne le middleware param ; mais pour
‫l'instant ce n'est pas vraiment utile.
‫Mais nous pouvons en fait
‫l'utiliser pour un cas d'utilisation très pratique ici.
‫Passons donc à nos fonctions de gestionnaire ici et
‫vous voyez que dans toutes les fonctions
‫de gestionnaire qui utilisent réellement l'identifiant, nous vérifions si l'identifiant est valide.
‫Nous le faisons donc ici dans la tournée get, et nous le faisons
‫également dans la tournée de mise à jour, donc ici, et dans la tournée de suppression.
‫Donc, toutes ces trois fonctions ont ce code
‫très similaire où elles vérifient si
‫l'identifiant est valide et sinon, elles renvoient cette réponse d'identifiant invalide.
‫Nous avons donc tout ce code au même
‫endroit et comme vous le savez déjà, ce n'est
‫pas une bonne pratique de répéter le code et donc
‫ce que nous pouvons faire ici est d'utiliser le
‫concept de param middleware ; et effectuez cette vérification ici
‫dans un middleware externe qu'il exécutera
‫avant même que la demande n'atteigne ces fonctions de gestionnaire.
‫Alors allons de l'avant et copiez ou
‫coupez réellement le code à partir d'ici et créez
‫une nouvelle fonction middleware appelée checkID, et bien sûr, je dois également l'exporter.
‫Donc checkID et nous avons accès, demande, réponse, suivant, et encore
‫une fois, gardez à l'esprit qu'il s'agit d'un middleware
‫de paramètres et que le quatrième argument sera
‫donc la valeur du paramètre.
‫D'accord, collez-le ici, et n'oubliez pas
‫d'appeler ensuite à la fin du middleware, d'accord ?
‫Et ce qui est également très
‫important, c'est que nous ayons cette instruction return
‫ici, car si nous n'avions pas ce
‫retour ici, eh bien, express renverrait cette réponse mais continuerait
‫à exécuter le
‫code dans cette fonction.
‫Et donc après avoir
‫envoyé la réponse, il frappera toujours cette fonction
‫suivante et il passera au middleware suivant
‫et enverra ensuite une autre réponse au client.
‫Mais ce n'est vraiment pas autorisé,
‫alors rappelez-vous que nous avons rencontré cette erreur auparavant, où elle nous
‫a dit que nous n'étions pas autorisés
‫à envoyer des en-têtes après que la réponse avait déjà été envoyée.
‫Et c'est donc le
‫genre d'erreur que nous rencontrerions si
‫nous n'avions pas cette instruction return, d'accord.
‫Encore une fois, assurez-vous simplement qu'après avoir envoyé cette
‫réponse, la fonction reviendra pour qu'elle
‫se termine et qu'elle ne l'appellera plus jamais.
‫Alors n'oubliez jamais cela, mais bien sûr,
‫nous allons le faire
‫plusieurs fois pendant le reste du
‫cours et vous vous habituerez donc à ce genre de modèle.
‫Alors allons-y et supprimons ce code répété de toutes
‫ces autres fonctions, donc
‫nous l'avons à nouveau, et oui.
‫Je veux aussi ce code ici juste
‫pour m'assurer que la fonction est
‫réellement en cours d'exécution, et d'accord, alors maintenant nous pouvons nous en débarrasser
‫ici et le remplacer par notre fonction de contrôleur nouvellement créée.
‫Donc tourController,
‫checkID, alors vérifions ça
‫maintenant, et bien encore, juste pour nous assurer
‫qu'il ne s'exécute pas
‫là où nous n'avons pas d'identifiant, donc nous n'avons pas de
‫log ici, donc tout fonctionne toujours de ce côté.
‫Et maintenant, obtenez une visite avec un
‫identifiant normal, donc un identifiant valide, et voyons voir.
‫Eh bien, nous obtenons que l'identifiant de la tournée est
‫log, ce qui signifie que s'il
‫a réellement exécuté notre middleware checkID, n'est-ce pas ?
‫Et si nous essayons maintenant un
‫identifiant invalide, alors nous obtenons notre message d'identifiant
‫invalide, le code d'erreur 404 et bien sûr notre identifiant de tournée.
‫Faisons la même chose avec le patch,
‫nous avons déjà un identifiant
‫invalide ici et il fonctionne donc également sur celui-ci.
‫Alors, parfait, non ?
‫Nous n'avons donc plus le code checkID dans le
‫gestionnaire de mise à jour que nous venons d'appeler, mais
‫notre ID est toujours vérifié
‫car nous avons ce middleware, donc ici.
‫Nous avons ce middleware dans la
‫pile avant qu'il n'atteigne réellement le tourController de mise à jour.
‫Donc, ce middleware fait maintenant partie de notre pipeline comme
‫vous pouvez l'imaginer, maintenant vous pourriez affirmer
‫que nous pourrions simplement créer une fonction
‫simple qui pourrait également vérifier l'ID
‫et j'appelle cette fonction à l'intérieur de chacune
‫de ces fonctions de visite, puis appelle à l'intérieur de chacun
‫de ces contrôleurs de tournée pertinents ; mais cela irait vraiment
‫à l'encontre de
‫la philosophie d'express, où nous devrions toujours travailler avec la
‫pile middleware, donc avec ce pipeline autant que
‫nous le pouvons, d'accord, et donc ces fonctions ici, elles n'ont pas
‫du tout à se soucier de la validation.
‫Chacune de ces fonctions n'a qu'un seul but qui est
‫de faire ce qu'elles disent, donc
‫celle-ci obtient juste la visite,
‫celle-ci crée juste une visite, celle-ci met à jour, et
‫celle-ci supprime simplement, elle ne vérifie pas, elle
‫ne pas besoin de s'inquiéter de tout ça.
‫Et si nous ajoutions maintenant
‫un autre contrôleur ici également en fonction de l'identifiant, cela
‫vérifierait également automatiquement si l'identifiant n'est pas
‫valide sans que nous ayons à effectuer des étapes supplémentaires.
‫Donc, cela vérifiera automatiquement l'identifiant et c'est
‫donc vraiment pratique et aussi comment les applications
‫express devraient fonctionner, super.
‫Nous avons donc un autre outil dans notre boîte à outils express
‫que nous pouvons maintenant utiliser pour écrire nos applications express.