La deuxième partie de cet exercice traite
des différentes opérations get put post et delete sur des sous-documents à l'intérieur du document.
Comme nous l'avons vu dans l'exemple pour les plats,
nous avons vu que les commentaires sont inclus
dans le plat lui-même comme un sous-document, de la façon dont nous avons défini à la fois le schéma de commentaire et le schéma de plat,
puis définir le modèle de plat en incluant le schéma de commentaire
dans le schéma de plat comme un tableau de commentaires.
Et nous avons vu dans l'exercice précédent comment les commentaires sont enfermés
dans un tableau sous la forme d'un tableau de documents à l'intérieur de chaque document plat.
Alors, comment pouvons-nous apporter des modifications aux commentaires eux-mêmes ?
Comment obtenons-nous toute la liste des commentaires pour un plat ?
Comment modifier un commentaire spécifique dans le plat et ainsi de suite ?
Donc, c'est ce que nous allons voir sur
la façon de les soutenir en utilisant les différentes opérations get put post and delete sur
les plats plats barre oblique ID plat commentaires et les plats
slash dish ID slash commentaires slash commentaire ID API REST.
Pour commencer cet exercice,
encore une fois, en revenant au routeur plat,
ils ont déjà vu comment nous gérons le point de terminaison de la barre oblique et le point de terminaison de l'ID de la barre oblique.
Maintenant, une grande partie de ce travail que nous faisons ici est déjà utile pour nous,
donc ce que je vais faire est de copier ce code,
puis nous allons modifier ce code de manière appropriée pour gérer les commentaires et l'ID de commentaire.
Donc, je vais copier tout ce code que nous avons
ici à la fois pour la barre oblique et l'ID de plat d'or slash,
et ensuite nous allons le coller juste ci-dessous à nouveau.
Et puis nous entrerons et modifierons chacun d'entre eux.
Donc, nous avons vu que si vous regardez en arrière,
le premier est de manipuler la barre oblique qui sera montée sur le point de terminaison des plats slash.
Et le suivant s'occupe de l'ID de la barre oblique.
Donc, le troisième devrait être de gérer les commentaires barre oblique ID plat.
Donc, en descendant ici,
cette troisième route de routeur plat serait des commentaires slash dish ID slash.
Et puis le dernier, bien sûr,
serait slash dish ID
commentaires slash puis slash ID commentaire deux-points.
Donc, maintenant que nous avons mis à jour ces routes ici,
maintenant l'étape suivante est d'aller et de corriger
le code dans les opérations get put post and delete ici.
Donc, nous allons commencer avec le point de terminaison des commentaires Slash dish ID Slash.
Donc, dans le cas de la barre oblique ID commentaire point de terminaison,
donc nous allons faire des plats trouver mais au lieu de dire plats trouver,
nous allons faire des plats trouver par
ID et donc nous allons trouver le plat spécifique que nous recherchons.
Donc, ici, nous allons chercher cet ID plat req params,
donc nous allons d'abord chercher le plat,
et donc cela retournera un plat spécifique.
Donc, quand il retourne ce plat spécifique ici,
alors ce qu'ils vont vérifier à l'intérieur ici
est que si plat n'est pas égal à null.
Il est tout à fait possible que le plat n'existe pas,
donc si nous recherchons un plat spécifique avec une carte d'identité,
ce plat peut ne pas exister,
donc nous devons nous soucier de gérer cette situation particulière.
Donc, nous allons gérer cette partie à l'intérieur ici,
et donc si elle n'est pas nulle alors cela signifie que le plat existe.
Donc je vais découper ça et le coller là dedans.
Et puis dans ce cas,
puisque le plat n'est pas nul,
donc nous allons retourner le code d'état et l'en-tête de l'ensemble,
puis ceci ici, nous allons retourner les commentaires de plat,
parce que nous sommes invités à retourner uniquement les commentaires pour ce plat particulier, donc nous allons dire,
« Les plats trouvent par ID,
puis req paramètres plat ID, puis plat. »
Et donc nous allons retourner les commentaires de plat ici.
Sinon, c'est donc l'autre partie.
Donc, ce qui signifie que le plat n'existe pas.
Donc, dans ce cas,
nous construirons une erreur ici en disant de nouvelles erreurs et ensuite nous dirons
plat req params id introuvable.
Donc ce plat particulier n'a pas été trouvé,
donc évidemment nous ne serons pas en mesure de retourner les commentaires pour le plat non existant.
Donc, dans ce cas,
nous allons donc créer un nouvel objet d'erreur, puis nous allons
définir le statut dans l'objet d'erreur à 404.
Encore une fois, c'est 404 introuvable,
et puis nous reviendrons prochaine erreur.
Maintenant, pourquoi on fait ça ?
Parce que si vous renvoyez ceci comme une erreur, comme vous vous en souviendrez,
cela sera géré par votre fichier app.js,
donc dans le fichier app.js,
juste en bas ici,
nous avons le gestionnaire d'erreurs ici.
Donc, quand il arrive ici,
cela définira le reste ou le statut sur l'état du point d'erreur,
que nous avions défini sur 404, donc c'est ce qui sera retourné,
puis il prendra simplement cette erreur et rendra cette erreur ici.
Donc, cela prendra soin de rendre les erreurs.
Donc, cela retournera le message d'erreur à notre client.
C' est ce que nous invoquons ici,
donc si le plat n'existe pas,
nous allons juste renvoyer cette erreur ici à partir de l'opération get.
Maintenant, pour la poste en cas de poste,
nous nous attendons à ce qu'ils soient
retournés un ID plat, puis nous allons chercher le plat,
puis nous allons prendre l'ensemble des commentaires
du corps et ensuite le pousser dans le plat là-bas.
Donc, nous allons dire des plats, encore une fois, ici,
nous devrons faire la découverte par id parce que nous sommes à la recherche du plat spécifique ici.
Donc, pour le poste, nous allons dire plat trouver par ID puis plat,
et donc à l'intérieur ici,
si le plat existe,
alors nous allons manipuler le plat de manière appropriée.
Si ce n'est pas le cas, nous devrons envoyer le message d'erreur.
Alors laissez-moi copier cette partie du get et ensuite,
nous allons remplacer ceci ici.
Donc, évidemment, si le plat n'existe pas,
alors nous allons retourner cette erreur ici,
mais si le plat existe, dans ce cas,
nous allons retourner le code d'état 200 ensemble en-tête.
Mais avant de passer la valeur,
ce que je vais faire est de dire des commentaires plats,
donc nous postons un nouvel ensemble de commentaires pour le plat.
Donc, nous allons dire que les commentaires de plat poussent le corps req.
Parce que le corps du message contient tous les commentaires qui doivent être poussés ici,
puis, nous dirons, « Dish save ».
Et donc si la sauvegarde revient avec succès avec le plat ici,
nous allons donc envoyer le plat mis à jour à partir d'ici.
Donc, cette partie où nous construisons le code d'état,
nous allons le faire à l'intérieur ici et ensuite nous enverrons le dos le
RES.JSON et le plat que nous avons obtenu ici.
Donc, ce que nous faisons, c'est que nous gardons le plat ici.
Nous poussons d'abord les commentaires dans le plat là-bas,
le nouvel ensemble de commentaires dans le plat ici,
puis nous sauvegardons le plat mis à jour ici.
Ensuite, après la sauvegarde,
nous allons retourner le plat mis à jour à l'utilisateur ici.
Ensuite, s'il y a une erreur,
alors nous allons gérer l'erreur comme nous l'avons fait ici.
Si le plat n'existe pas, bien sûr,
nous allons retourner l'erreur en disant que le plat n'existe pas.
Donc, c'est pour le poste.
L' opération PUT, bien sûr,
n'est pas prise en charge sur les plats.
Donc, dans ce cas,
nous essayons d'effectuer l'opération PUT
sur les plats, req.params.dishid/Comments.
Donc, ce n'est pas autorisé.
Donc, c'est ce que nous disons pour l'opération PUT.
Pour l'opération de suppression,
ce que nous allons faire est d'abord trouver le plat.
Donc, nous allons dire « Dish.TroudByID ».
Donc, supprimer signifie que nous supprimons tous les commentaires du plat,
pas du plat lui-même,
mais nous supprimons tous les commentaires du plat.
Donc, dans ce cas,
ce que nous finirons par faire est comme suit : donc si le plat n'est pas nul,
rappelez-vous que nous devons le gérer en disant alors plat.
Si le plat n'est pas nul,
alors nous supprimerions tous les commentaires du plat.
Donc, je vais copier ce code, puis le coller ici,
puis nous allons éditer ce code, puis supprimer.
Nous verrons si le plat n'est pas nul,
alors ils retourneront le plat ici.
Donc, si le plat n'est pas nul,
le wat que nous gérerions ceci est comme suit.
Donc, nous devrons aller et supprimer chacun des commentaires.
Donc, nous allons dire pour (var i =
(dish.comments.length -1) i>= 0 ; i—).
Donc, nous allons littéralement dans et supprimer chaque commentaire.
Donc, nous allons dire
dish.comments.id (dish.comments [i]. _id).
On va dire supprimer.
Donc, nous allons enlever chacun des plats,
un sous chacun des commentaires un par un.
Donc, c'est ce que nous allons faire aux commentaires.
Ensuite, une fois que nous avons supprimé tous les commentaires pour le plat,
alors nous devrons enregistrer le plat, puis renvoyer.
Donc, plus tôt aussi quand nous modifions le plat,
c'est ce que nous avons fait ici.
Donc, je vais copier cette partie,
puis venir ici, puis
dire plat.save,
alors nous allons retourner le plat
ici pour indiquer le plat mis à jour étant retourné ici.
Donc, c'est ainsi que nous allons supprimer les commentaires.
Donc, ici nous allons dans,
maintenant il n'y a pas de moyen facile de tirer littéralement
tous les commentaires du tableau lorsque vous avez un sous-document.
Donc, vous devez entrer et supprimer chaque sous-document un par un.
Donc, c'est ce que je fais dans cette boucle ici.
Donc, je dis pour (var i = dish.comments.length).
Donc, je regarde le tableau de commentaires, puis à partir
du dernier commentaire dans ce tableau jusqu'au tout premier commentaire,
je vais dans et puis supprimer commentaire par commentaire ici en utilisant
l'opération de suppression sur le sous-document.
Donc, la façon dont nous allons accéder à un sous-document est en disant
plat et ensuite les commentaires est le nom du champ, puis je dis id ici.
Donc, c'est ainsi que vous accédez à un sous-document,
et à l'intérieur, vous spécifiez l'identifiant des sous-documents auxquels vous essayez d'accéder.
Donc, tout cela vous donnera accès au sous-document,
puis nous appelons la méthode remove sur le sous-document,
et donc ce sous-document sera supprimé du tableau de sous-documents.
Ensuite, après que nous avons supprimé tous les commentaires,
je vais enregistrer les modifications et c'est tout.
Donc, tous mes commentaires seront supprimés de puis plat.
Maintenant, nous allons traiter du prochain point final qui est DisHidComments/:CommentID.
Donc, dans ce cas,
nous allons commencer par localiser d'abord le plat, puis après avoir localisé le plat,
puis nous devons nous assurer que le plat existe,
puis traiter le plat.
Donc, je vais supprimer cette partie,
et puis nous allons dire que nous allons copier cette partie du git que nous avions plus tôt
parce que nous devons être capables de faire face à la situation
où le plat n'existe pas ou le plat existe mais les commentaires n'existent pas,
ou le plat lui-même n'existe pas.
Donc, il y a trois conditions que je dois tester.
Donc, nous allons dire si (plat ! =
null && dish.comments.id (req.params.commentID) ! =
null, ce qui signifie que le plat lui-même existe et aussi les commentaires existent dans le plat,
seulement alors nous pouvons renvoyer un commentaire spécifique qui a été demandé.
Donc, dans ce cas,
nous dirons que StatusCode est 200, application setHeader json,
puis ici nous enverrons dish.comments,
et nous renvoyons ce commentaire particulier.
Donc, c'est le commentaire spécifique que nous envoyons max.
Donc, cela nous permettra de récupérer un commentaire spécifique de l'ensemble des commentaires.
Maintenant, nous allons dire autre si plat égal à null.
Donc, les plats nuls,
alors bien sûr, nous devrons indiquer que le plat n'existe pas et
la dernière condition est si le commentaire lui-même est nul.
Donc, dans ce cas aussi, je dois indiquer que le commentaire lui-même n'existe pas,
cet ID de commentaire particulier n'existe pas donc dans ce cas,
je dirai que le nouveau
commentaire d'erreur req.params.commentId n'existe pas.
Donc, trois conditions. Tout d'
abord, vous devez vous assurer que le plat existe et que les commentaires de plat existent,
s'ils le font, je peux renvoyer le commentaire spécifique,
sinon, si le plat lui-même n'existe pas du côté serveur dans la base de données,
alors je vais indiquer que le plat n'existe pas mais si
le plat n'existe pas existe mais le commentaire n'existe pas,
alors je vais renvoyer le message disant que le commentaire n'existe pas.
Donc, notez qu'ils doivent gérer toutes les conditions possibles ici pour le GET.
Pour le POST bien sûr,
la post-opération n'est pas prise en charge sur ce point de terminaison,
donc nous dirons
commentaires slash req.params.commentId.
Ainsi, l'opération POST n'est pas prise en charge sur cet ID de commentaire. Maintenant, qu'en est-il de PUT ?
PUT est un cas plus intéressant ici.
Donc, encore une fois, même pour la mise,
je dois gérer toutes ces conditions possibles,
donc je vais regarder cela et dire, ok pour cela,
laissez-moi copier tout ce code parce que nous devons gérer
toutes ces possibilités et ensuite je vais vous dire exactement comment nous gérons le cas PUT ici.
Donc, en cas de PUT,
bien sûr, nous devons d'abord localiser le carnage.
Donc, ils diront que les plats trouvent par Id req param Id,
alors si le plat existe et le commentaire lui-même existe,
alors je sais que je peux mettre à jour le commentaire.
Sinon, ces deux conditions doivent évidemment être prises en compte,
ce commentaire n'existe pas ou le plat n'existe pas.
Ces deux-là sont déjà traités par cette affaire.
Maintenant, voici la situation particulière que nous connaissons.
Donc, si le plat existe et que le commentaire spécifique que je cherche existe également,
alors ce que je sais est que dans le corps du message,
la mise à jour du commentaire est spécifiée.
J' ai donc besoin de mettre à jour ça.
Donc, quelque part ici, je fais des modifications,
je fais un plat sauver ici,
donc je vais aller et copier un peu de ce code à partir d'ici,
bien sûr, ce n'est pas la bonne chose mais j'ai juste besoin d'une partie du code à partir de là,
donc je vais entrer dans le PUT.
Laisse-moi le coller ici et
je te dirai exactement comment ils vont gérer ça.
Parce que j'ai besoin de la partie de sauvegarde de la vaisselle.
Alors, comment traitons-nous la mise à jour d'un commentaire spécifique ?
Donc, pour la mise à jour d'un commentaire spécifique, que
savons-nous est que ce commentaire doit être mis à jour,
donc nous savons que le plat existe et le commentaire lui-même existe.
Je veux mettre à jour les champs du courant.
Maintenant, si un commentaire existe déjà, je ne veux pas
permettre à l'utilisateur de changer l'auteur du commentaire,
l'auteur devrait conserver.
Les deux seuls champs que j'autoriserais la mise à jour de l'utilisateur est la note.
Donc, dans le corps du message PUT entrant,
je peux soit inclure
la note mise à jour
ou le commentaire mis à jour.
Ce sont les deux seules choses que je vais permettre à l'utilisateur de changer.
Donc, si le si la propriété de notation est corps indirect pour appeler que le corps
contiendra la mise à jour que nous essayons de le faire dans ce cas, nous dirons plat.
Donc nous allons dire des commentaires plats,
alors laissez-moi juste copier cette partie.
Commentaire Dish Id.
Maintenant, c'est un moyen simple de gérer ce problème ici.
Comme il n'y a pas de moyen spécifique de mettre à jour
un commentaire spécifique qui se trouve dans un sous-document,
il n'y a pas de méthode spécifique pour le faire.
Donc, c'est la solution de contournement que j'ai trouvée qui semble fonctionner pour nous,
donc nous dirons les commentaires plats req paramètre commentaire Id rating égal à req body.rating.
Je vais donc mettre à jour la note.
De même, si le commentaire existe là,
alors je dirai req commentaire Id commentaire req body commentaire.
Donc, c'est comme ça que je vais mettre à jour la note et le commentaire,
et je dis une fois sur la mise à jour de la note et le commentaire,
et ils vont enregistrer le plat,
puis une fois que j'ai enregistré le plat, puis je vais renvoyer la réponse.
Donc, notez que c'est la seule façon que j'ai trouvée qui est assez facile de
mettre à jour un sous-document incorporé dans un document de Mongoose.
Mongoose ne prend pas en charge explicitement la mise à jour d'un document incorporé.
C' est donc la solution de contournement que j'ai trouvée qui nous permet d'effectuer cette opération.
Maintenant pour l'opération de suppression.
Pour l'opération de suppression, nous supprimons seulement un
commentaire spécifique, donc je vais prendre cette information
du deleter pour tous les commentaires
et au lieu de supprimer tous les commentaires,
je vais seulement supprimer un commentaire spécifique.
Donc, laissez-moi copier cela à partir de la suppression.
Laissez-moi le coller ici et ensuite nous mettrons à jour ceci.
Donc, si je supprime un commentaire spécifique donc je vais d'abord trouver le plat.
Si le plat n'est pas nul,
rappelez-vous que dans cette situation, je dois gérer à la fois le plat
n'étant pas nul et aussi le commentaire n'étant pas nul.
Donc, je dirai que si le
paramètre dish n'est pas égal à null et dish comments id pas égal à null,
alors je sais que j'ai un commentaire spécifique que je veux supprimer.
Je ne supprime pas tous les commentaires,
je ne supprime qu'un commentaire spécifique ici.
Donc, je vais dire les commentaires de plat id et puis je supprime le commentaire spécifique ici qui
est req.params.commentId et supprimer
ce commentaire particulier, puis je vais enregistrer le plat mis à jour et ensuite passer à cela.
Maintenant, l'autre partie que j'ai besoin de gérer les deux situations.
Donc, laissez-moi copier cette partie sinon si plat n'est pas égal à null et
ainsi de suite, puis remplacer ceci ici.
Donc, si le plat est nul alors je vais renvoyer l'erreur disant que le plat n'existe pas.
Si le commentaire est nul, je vais renvoyer l'erreur en disant que le commentaire n'existe pas.
Donc, c'est ça,
c'est la mise à jour que je fais ici.
Pour supprimer un commentaire spécifique,
je vais d'abord m'assurer que le plat et le commentaire
existent, puis je vais supprimer le commentaire spécifique et ensuite je vais enregistrer
les changements dans le plat, puis continuer
à gérer le reste des cas, c'est tout.
Sauvegardons les changements, puis regardons comment cela fonctionne.
Aller au terminal,
je vois que le serveur MongoDB n'est pas en marche et fonctionne donc commençons là.
Assurez-vous, bien sûr,
que le serveur MongoDB est opérationnel, nous
allons également démarrer notre serveur express.
Une fois que votre serveur express est opérationnel,
ce que nous allons faire, c'est maintenant que nous examinons spécifiquement
les commentaires, puis effectuons des opérations sur les commentaires.
Alors, allons au Facteur,
puis vérifier ce que nous avons dans la base de données, puis essayer de modifier les commentaires.
Donc, je suis ici à Postman,
alors laissez-moi d'abord chercher la vaisselle et maintenant je vois que les plats sont tous vides.
Alors laissez-moi poster un plat à la liste des plats alors laissez-moi poster un plat.
Rappelons que nous avons ce plat elle,
donc dans mon facteur, je l'avais déjà fait pour l'exercice précédent.
Je vais juste sélectionner cela, puis poster ce plat et puis vous
voyez que ce plat particulier a été posté ici, en bas ici.
Vous pouvez voir que le plat a été créé juste là.
Laisse-moi copier cet identifiant de plat et je vais
maintenant chercher ce plat ici.
Donc, vous voyez que ce plat particulier existe ici.
Tout d'abord, obtenons tous les commentaires.
Donc, si je fais un obtenir sur les commentaires que vous remarquez que
tous les commentaires pour ce plat particulier ont été retournés.
Nous pouvons faire le post et la suppression aussi.
Faisons une mise sur cela et évidemment, vous ne pouvez pas faire une mise en
arrière donc vous remarquez que l'opération de mise ne fonctionne pas là-dessus.
Envoyez-nous un nouveau commentaire.
Donc, pour poster un nouveau commentaire, nous allons aller dans le corps,
puis laissez-moi découper tous ces et ensuite nous allons éditer
l'un des commentaires, puis
essayer de poster ce commentaire.
Donc, nous allons dire note trois et ensuite nous
dirons commentaire de test, utilisateur de test.
Envoyez-nous ce commentaire.
Lorsque vous publiez ce commentaire,
vous voyez que le plat de mise à jour a été retourné ici et vous voyez que dans
ce plat vous voyez que le nouveau commentaire a été inclus dedans.
Alors, copions tout ça.
Maintenant, nous allons essayer d'obtenir ce commentaire particulier que nous venons d'insérer.
Pour ce commentaire particulier, c'est l'identifiant de ce commentaire.
Alors laissez-moi copier l'identifiant pour ce commentaire spécifique.
Pour revenir à Postman,
laissez-moi essayer de récupérer ce commentaire spécifique en faisant une opération get.
Là, vous voyez que ce commentaire particulier a été récupéré ici.
Maintenant, si vous essayez de faire un post à ce sujet, cela ne fonctionnera pas
si évidemment vous voyez que la post-opération n'est pas autorisée sur cela.
Faisons une opération de mise,
sur ce commentaire particulier.
Donc, si je devais mettre l'opération dans le corps,
je vais dire un commentaire de test mis à jour.
Donc, je vais mettre à jour le champ de commentaire de ce commentaire.
Si vous dites de mettre cela, vous verrez que pour le commentaire spécifique,
le commentaire a maintenant été mis à jour pour refléter le commentaire de test mis à jour.
Ainsi, vous voyez que l'opération de mise sur le champ des commentaires fonctionne également correctement.
Supprimons ce commentaire,
donc je peux supprimer le commentaire, puis quand je supprime le commentaire, vous
verrez que ce commentaire a disparu de la liste des commentaires.
Ainsi, vous voyez que l'opération de suppression fonctionne également.
Supprimons tous les commentaires.
Donc, je vais entrer et supprimer tous les commentaires.
Ensuite, vous voyez que tous les commentaires ont été supprimés,
et vous voyez donc que la zone des commentaires est maintenant vide.
Donc, maintenant vous pouvez les voir toutes les
opérations get, put, post et delete sur
les plats/dishid/commentaires
et les plats/dishid/commentaires/commentID,
REST API fonctionnent comme prévu.
Donc, avec cela, nous complétons cet exercice.
Donc, dans cet exercice, nous avons terminé la mise en œuvre des plats slash,
point de terminaison de l'API REST et pris en charge jusqu'
à nous permettre de manipuler un seul plat,
la collection de plats,
un seul commentaire et aussi la collection de commentaires.
C' est le bon moment pour vous de faire un commit git avec le message,
express, API REST avec Mongoose partie deux.