‫Intervenant : Continuons maintenant à travailler sur notre API.
‫Au cours des prochaines
‫vidéos, nous allons implémenter quelques fonctionnalités
‫API communes qui rendent une API plus facile et plus
‫agréable à utiliser pour quiconque va l'utiliser.
‫Et dans cette
‫conférence, nous allons commencer par le filtrage.
‫Encore une fois, la première fonctionnalité que nous allons implémenter est
‫de permettre à l'utilisateur de filtrer les données à l'aide
‫d'une chaîne de requête.
‫Permettez-moi de vous dire quelle chaîne de requête utilise Postman.
‫Alors, fermons tous ces gars.
‫Bien.
‫En fait, là où le filtrage aura du sens, c'est
‫ici sur cet itinéraire d'obtention de toutes les visites.
‫Car, c'est celui qui, comme
‫son nom l'indique, reçoit toutes les tournées.
‫Et donc ici, nous voulons permettre à l'utilisateur de filtrer les données,
‫de sorte qu'au lieu d'obtenir toutes les
‫données, il n'obtienne que les données qui correspondent au filtre.
‫Ainsi, nous pouvons permettre à l'utilisateur d'interroger les
‫données de manière très simple.
‫Encore une fois, en utilisant la chaîne de requête.
‫Et la chaîne de requête ressemble un peu à ceci.
‫Et je suis sûr que vous l'avez vu.
‫Nous commençons donc par un point d'interrogation,
‫puis nous pouvons simplement spécifier des paires de valeurs de champ.
‫Disons donc que nous
‫voulions filtrer pour une durée égale à cinq
‫et en même temps, une difficulté de facile.
‫Nous pouvons donc très simplement construire une chaîne de requête comme celle-ci.
‫Encore une fois, cela commence par ce
‫point d'interrogation, puis nous pouvons
‫spécifier autant de paires clé-valeur en utilisant ce format.
‫Et maintenant, notre
‫application Postman reconnaît cela et analyse
‫essentiellement cette chaîne ici et place la
‫clé et les valeurs ici dans cet onglet Paramètres.
‫Nous pourrions donc également spécifier la clé et les valeurs ici.
‫Alors disons test, définissez-le sur vingt-trois, et vous voyez ici
‫qu'il l'a réellement ajouté
‫à la chaîne de requête.
‫C'est donc une très belle façon pour Postman de nous aider ici.
‫Parce que maintenant nous pouvons, par exemple, pendant que
‫nous effectuons des tests, nous pouvons les activer et les désactiver et
‫vous voyez que la
‫chaîne de requête ici réagit en conséquence.
‫Quoi qu'il en soit, nous avons maintenant besoin d'un moyen d'accéder à ces données qui
‫se trouvent dans une chaîne de requête, dans notre application Express.
‫Mais, heureusement pour nous, c'est
‫très facile, car Express s'en est déjà occupé.
‫Ce n'est donc qu'une des
‫nombreuses choses qu'Express fait pour nous afin d'accélérer
‫le développement de NodeJS.
‫Alors laissez-moi vous le montrer ici, en fait dans la console.
‫Donc, ces données sont sur une requête, ce qui est logique, puis
‫elles se trouvent dans un champ appelé requête.
‫Ainsi, la requête de point de requête devrait alors
‫nous donner un objet bien formaté avec les données de la
‫chaîne de requête.
‫Donnez-lui une sauvegarde.
‫Et notez comment je l'ai
‫ajouté à la fonction de gestionnaire d'obtention de toutes les visites.
‫Encore une fois, nous effectuons ce genre de filtrage dans
‫l'itinéraire où nous voulons obtenir toutes les visites.
‫Testons-le maintenant avec cette chaîne de requête exacte.
‫Envoyé la demande.
‫Et en revenant, nous avons ici l'objet.
‫Agrandissons cela ici pour que vous
‫puissiez voir.
‫Cela ne fonctionne pas vraiment.
‫Alors parfois, je sais que certaines personnes ne peuvent
‫pas voir le bas de l'écran.
‫Permettez-moi de le refaire ici.
‫Et donc, on y va.
‫Nous avons l'objet, dont la durée est définie sur cinq
‫et la difficulté définie sur facile.
‫Et donc vous voyez qu'Express a
‫très bien analysé cette chaîne dans cet objet facile à utiliser.
‫Maintenant, une chose que j'ai remarquée ici, c'est qu'il
‫nous manque en fait le journal que
‫nous avions plus facilement ici dans la console.
‫Voyons pourquoi cela se produit.
‫Donc, pour une raison quelconque, nous avons maintenant
‫l'application avant de lire la variable d'environnement.
‫De cette façon, l'application n'y a pas accès.
‫Je pensais avoir résolu ce problème auparavant, mais pour une raison
‫quelconque, il est de retour maintenant.
‫Donnez-lui une autre sauvegarde ici.
‫Et je vais réessayer.
‫Maintenant, nous récupérons notre connexion.
‫Une demande d'obtention à cette URL, puis avec ce
‫reste des données ici.
‫Quoi qu'il en soit, utilisons maintenant
‫ces données pour mettre en œuvre notre filtrage.
‫Mais avant de pouvoir le faire, je dois vous dire
‫que dans Mongoose, il existe en fait deux manières d'écrire
‫des requêtes de base de données.
‫La première consiste simplement à utiliser l'objet filtre
‫comme nous l'avons fait dans la section d'introduction de MongoDB.
‫Droit? Vous vous en souvenez ?
‫La deuxième façon consiste à utiliser des méthodes spéciales de Mongoose.
‫Permettez-moi juste, très rapidement, de vous montrer cela.
‫Avec l'objet filtre, nous le ferions comme ceci.
‫Nous commençons par la recherche ici, puis nous pouvons
‫y passer un objet de filtre.
‫Et je l'ai déjà mentionné auparavant.
‫Encore une fois, cela fonctionne exactement de la
‫même manière qu'avec une requête MongoDB normale.
‫Nous pourrions maintenant dire, la durée l'a
‫fixé à cinq.
‫Et
‫puis, difficulté, réglez-le sur facile.
‫C'est exactement la chaîne de requête que nous avions auparavant, et
‫maintenant je la code ici juste
‫pour vous montrer les deux manières différentes
‫d'écrire des requêtes dans Mongoose.
‫Testons celui-ci.
‫Vous voyez que maintenant, nous n'obtenons que deux résultats.
‫Laissons-nous un peu d'espace ici.
‫Bien.
‫Nous voyons les deux résultats et en effet ils
‫ont tous les deux une
‫durée de cinq, donc ici et ici, et ils sont tous les deux faciles.
‫Facile et facile.
‫Notre filtre a donc très bien fonctionné.
‫C'est la première façon d'écrire une requête.
‫Juste la manière normale à laquelle nous sommes déjà habitués, mais il
‫y a une autre manière.
‫Permettez-moi de vous montrer cela aussi.
‫Encore une fois, nous commençons exactement de la
‫même manière, mais la différence
‫est que nous commençons à enchaîner une méthode
‫spéciale Mongoose pour créer une requête similaire à celle que nous avons.
‫Nous disons donc,
‫où
‫la durée
‫est égale à cinq.
‫Alors aussi, où la
‫difficulté, qui doit
‫être entre guillemets, est
‫égale à
‫facile.
‫Cette requête ici va être exactement la
‫même que celle-ci, mais encore une fois, écrite à
‫l'aide de méthodes spéciales Mongoose.
‫Et il existe bien sûr des tonnes d'autres méthodes.
‫Par exemple, au lieu d'égal à égal, nous pouvons avoir moins que,
‫ou égal, ou juste moins que, ou vous pouvez également
‫trier les résultats ou limiter le nombre de résultats, et vraiment
‫toutes sortes de choses.
‫Bien sûr, nous allons en utiliser certains
‫dans les prochaines vidéos.
‫Cela peut vous sembler un peu étrange
‫ici, mais c'est en fait très, très utile dans certains cas.
‫Juste pour tester, réessayez celui-ci.
‫Et en effet, nous obtenons nos deux mêmes résultats.
‫Maintenant, permettez-moi de commenter celui-ci ici.
‫Je vais le laisser ici juste comme
‫référence, car pour le moment, nous allons utiliser cette méthode ici.
‫Et nous allons l'utiliser, car en
‫fait, nous avons déjà un objet qui ressemble
‫beaucoup à ça.
‫Et c'est la requête de point de requête.
‫Si vous le comparez, cet objet,
‫à cet objet que vous voyez
‫ici-bas, ressemble exactement à celui-ci.
‫Pour implémenter un filtre très simple,
‫tout ce que nous avons à faire dans ce cas est de dire req dot query.
‫Essayons encore une fois.
‫Débarrassez-vous de ça ici.
‫Et en effet, nous obtenons exactement les mêmes deux résultats.
‫Essayons maintenant uniquement avec une difficulté définie sur facile.
‫Maintenant, nous obtenons quatre résultats.
‫Tous auront bien sûr
‫la difficulté définie sur facile.
‫Notre filtre, notre filtre très basique,
‫fonctionne maintenant réellement.
‫Maintenant, le problème avec cette
‫implémentation, c'est qu'elle est en fait beaucoup trop simple.
‫C'est parce que, plus tard, nous aurons
‫d'autres paramètres de requête.
‫Par exemple, sort, pour la fonctionnalité de tri, ou
‫page, pour la pagination.
‫Nous devons nous assurer
‫que nous ne les interrogeons pas dans notre base de données.
‫Par exemple, si
‫nous ajoutions ici, page, égal à
‫deux, nous n'obtiendrions bien sûr aucun résultat.
‫Laisse-moi te montrer ça.
‫Et effectivement nous n'obtenons aucun résultat,
‫car il n'y a pas de document dans cette
‫collection où la page est mise à deux.
‫Nous voulons uniquement utiliser ce paramètre ici, ou
‫ce champ, page, pour implémenter la pagination et non
‫pour interroger réellement la base de données.
‫Donc, ce que nous
‫devrons faire, c'est exclure ces noms de champs spéciaux
‫de notre chaîne de requête avant de procéder au filtrage.
‫Allons de l'avant et mettons cela en œuvre.
‫Ce que nous allons faire, c'est d'abord
‫créer une copie superficielle de l'objet de requête de point de requête.
‫Appelons-le objet de requête.
‫Ici, nous avons vraiment besoin d'une copie papier.
‫Nous ne pouvons pas simplement faire, demander une requête de point,
‫car alors, si vous supprimez
‫quelque chose de cet objet, nous le supprimerons
‫également de l'objet de requête de point req.
‫Et c'est parce que
‫dans JavaScript, lorsque nous définissons une variable sur un
‫autre objet, cette nouvelle variable sera essentiellement
‫une référence à cet objet d'origine.
‫Nous avons donc vraiment besoin d'une copie papier ici.
‫En JavaScript, il n'y a pas vraiment de
‫moyen intégré de faire cela, mais une astuce très
‫intéressante que nous pouvons utiliser, depuis ES6, consiste à utiliser, d'abord, la structuration que nous
‫utilisons en utilisant dot dot dot.
‫Et puis nous pouvons simplement créer un nouvel objet
‫à partir de cela.
‫Juste comme ça.
‫Cette structuration ici, ces trois
‫points, va fondamentalement retirer tous les champs de l'objet.
‫Ici avec les accolades, eh
‫bien, nous créons simplement un nouvel objet.
‫Nous avons donc un nouvel objet
‫qui contiendra essentiellement toutes les paires clé-valeur
‫qui se trouvaient dans notre objet de requête req dot.
‫C'est donc une copie.
‫Créons maintenant un tableau de
‫tous les champs que nous voulons exclure.
‫J'appelle ça des champs exclus.
‫Et puis nous voulons exclure la page, c'est donc celle
‫que je viens
‫de vous dire auparavant dans Postman.
‫Ensuite, nous voulons également exclure
‫le tri,
‫nous voulons exclure la
‫limite et nous voulons exclure les champs.
‫Nous mettrons en œuvre toutes les fonctionnalités de
‫pagination, de tri, de limitation et de sélection de certains
‫champs spécifiques uniquement, plus tard au cours des
‫deux prochaines vidéos.
‫Ensuite, ce que nous devons faire
‫est de supprimer essentiellement tous ces champs de
‫notre objet de requête.
‫Et pour ce faire,
‫nous allons boucler sur ces champs.
‫Donc, champs
‫exclus pour chacun.
‫Et nous utilisons pour chacun
‫parce que nous ne voulons pas enregistrer un nouveau tableau.
‫Ensuite, chacun de ces éléments,
‫nous pouvons utiliser l'opérateur de suppression.
‫Et puis à partir
‫de l'objet de requête, nous voulons supprimer
‫le champ portant le nom d'élément,
‫donc l'élément actuel dans le tableau.
‫Comme ça, on supprimera d'abord le champ de page, puis
‫le tri, puis la limite, puis les champs.
‫Bien sûr, seulement au cas où il serait là.
‫S'il n'y a, par exemple, aucun champ de
‫limite, alors, bien sûr, cela ne sera pas supprimé, car il
‫n'y est pas.
‫Voyons maintenant si cela fonctionne réellement.
‫Je vais enregistrer la requête de
‫point req et en même temps notre objet de requête.
‫Donner une sauvegarde.
‫Ne vous inquiétez pas pour nos résultats maintenant.
‫Tout ce que je veux regarder,
‫c'est notre objet de requête, juste pour m'assurer que
‫cette logique que nous avons ici fonctionne réellement.
‫Ajoutons ici une sorte de un et une limite de 10.
‫Ceux-ci auront plus de sens plus tard.
‫Pour l'instant, je ne fais que
‫les ajouter, afin de pouvoir les exclure plus tard.
‫Les résultats n'ont pas d'importance, tout ce qui
‫compte, c'est que notre requête d'origine est celle-ci ici, puis notre objet
‫de requête, qui est celui que nous
‫allons utiliser, n'a
‫que des difficultés à régler sur facile.
‫C'est parce que nous avons exclu, paginé, trié et limité.
‫Cela fonctionne maintenant, donc au lieu
‫d'utiliser req dot query, nous allons utiliser notre objet de requête.
‫Débarrassons-nous de cela et réessayez.
‫Nous devrions maintenant revenir à
‫la recherche de tous les documents dont
‫la difficulté est définie sur facile et en ignorant tous ces autres champs.
‫Envoyez ça.
‫Et effectivement, nous revenons
‫à nos quatre résultats que nous avions auparavant.
‫On peut aussi activer la durée, et effectivement,
‫on aura maintenant deux résultats.
‫Vous vous en souvenez ?
‫Et si nous les désactivons,
‫eh bien, bien sûr, cela fonctionnera de la même manière.
‫Supprimons simplement cette ligne vide ici.
‫Et donc, en effet, avec notre chaîne de requête d'origine, les choses
‫fonctionnaient évidemment toujours de la même manière.
‫Nous avons préparé notre fonction de filtre pour qu'elle
‫ignore les champs de page, de tri et de limite.
‫Mais il y a en fait
‫quelque chose de plus que nous devons faire dans
‫notre code, afin de pouvoir implémenter ces fonctionnalités dans les futures vidéos.
‫Revenons ici à notre code.
‫Voyons maintenant comment
‫fonctionnent réellement les requêtes dans Mongoose.
‫Je pense l'avoir
‫déjà mentionné, mais il est très important d'en reparler.
‫Cette méthode de recherche ici va renvoyer une requête.
‫Tout cela ici renverra une requête.
‫Et c'est la raison pour laquelle
‫on peut ensuite enchaîner d'autres méthodes comme celle-ci.
‫Comme where, equals, et toutes ces autres méthodes dont
‫je vous ai déjà parlé.
‫Permettez-moi de vous montrer à nouveau cela dans la documentation.
‫Ici, nous avons l'objet de requête,
‫et encore une fois, lorsque nous utilisons
‫la méthode find, elle renverra un objet qui est une requête.
‫Donc, dans le prototype de point
‫de requête, nous avons alors toutes ces méthodes.
‫Par exemple, ici, nous avons où, que je
‫viens de mentionner.
‫Nous avons sort qui est celui
‫qui allait être utilisé plus tard pour trier.
‫Nous avons, voyons, nous avons
‫moins ou moins qu'égal, nous avons plus.
‫Nous avons...
‫Qu'avons-nous utilisé d'autre ?
‫Nous avons utilisé des égaux.
‫Tous ces éléments font partie du prototype de point de requête.
‫Ce qui, encore une fois, fait référence aux objets
‫que nous créons à l'aide de la classe de requête.
‫Encore une fois, c'est la raison
‫pour laquelle nous pouvons faire ce genre de chaînage.
‫Vient maintenant la partie importante.
‫Dès qu'on attend effectivement
‫le résultat de la requête, donc dès
‫qu'on utilise wait here ou here, par exemple.
‫Dès que nous utilisons ce
‫wait, la requête s'exécutera et
‫reviendra avec les
‫documents qui correspondent réellement à notre requête.
‫Si nous le faisons comme ceci, comme nous l'avons ici,
‫alors il y a maintenant moyen,
‫plus tard, d'implémenter le tri, ou la pagination,
‫ou toutes ces autres fonctionnalités.
‫Au lieu de cela, ce que
‫nous devrons faire, c'est enregistrer cette partie ici dans une requête, puis à
‫la fin, dès que nous changeons toutes les méthodes de la
‫requête dont nous avons besoin, alors seulement à
‫la fin, nous pouvons attendre que mettre en doute.
‫Par exemple, nous allons utiliser la méthode sort.
‫Nous allons utiliser la méthode
‫predict, nous allons utiliser la méthode limit, et
‫nous allons utiliser, vraiment, un tas de
‫méthodes, et les enchaîner à cette requête.
‫Ce serait impossible à
‫faire, encore une fois, si l'on attend le résultat de
‫cette première interrogation ici, tout de suite.
‫J'espère que cela avait du sens.
‫La façon dont nous procéderons,
‫c'est que
‫nous aurons nos tournées ici.
‫Et cela attendra la requête.
‫La requête est, eh bien, simplement
‫la requête sans attendre.
‫Juste pour que cela soit cohérent avec
‫cette partie
‫ici, procédons comme ceci.
‫Disons que,
‫d'abord, nous construisons la
‫requête, puis nous exécutons la requête.
‫Ce n'est pas correct.
‫Puisque nous faisons des
‫commentaires ici, disons
‫également envoyer une réponse.
‫Juste pour rendre notre code un peu plus facile à scanner.
‫J'espère que tout
‫cela avait du sens, cela s'est avéré être
‫une vidéo assez longue, mais il
‫était important de terminer cette partie ici en
‫vous expliquant cette logique ici, pour que dans
‫les prochaines vidéos, nous puissions ensuite mettre
‫en œuvre le reste des fonctionnalités.
‫Parce que, encore une fois, sans
‫l'avoir comme ça, ça ne fonctionnerait pas.