Il est temps de commencer la quatrième et dernière affectation de ce cours.
J' ai conçu cette mission pour être une consolidation
de tout ce que vous avez appris dans ce cours.
Donc, cette affectation impliquera le routage en utilisant le routeur express.
Cela impliquera la conception de schémas dans le modèle,
pour notre MongoDB et Mongoose,
puis aussi il examinera brièvement l'authentification de l'utilisateur.
Que faisons-nous exactement dans cette mission ?
Cette affectation est basée sur la possibilité pour un utilisateur d'
enregistrer et de récupérer une liste de plats comme plats préférés côté serveur.
Si vous aviez suivi les cours précédents de cette spécialisation, en
particulier les cours de développement d'applications mobiles hybrides,
qu'il s'agisse d'un script ionique ou natif,
vous avez vu que nous avons conçu les applications pour avoir la possibilité de permettre à l'utilisateur d'
enregistrer des plats dans la liste de leurs favoris plats
et aussi récupérer des plats de cette liste de leurs plats préférés.
Lorsque nous avons implémenté cela dans les cours précédents,
nous l'avions implémenté en utilisant le stockage local sur l'appareil spécifique.
Dans cette affectation, vous allez étendre
le côté serveur pour être en mesure de prendre en charge exactement cela.
De cette façon, l'utilisateur peut enregistrer sa liste de plats favoris
côté serveur et accéder à cette liste à partir de
n'importe quel appareil à partir duquel il se connectera à son serveur.
Ce que cela signifie, c'est que nous devons concevoir une nouvelle route pour notre serveur,
que nous appellerons comme itinéraire /favoris.
Sur cette route, nous devrons concevoir le routeur express pour soutenir les
opérations get, post et delete sur cette route et
aussi concevoir le schéma pour stocker les plats préférés
et le modèle Mongoose correspondant et
connecter les deux ensemble afin que les informations puissent être sauvegardées et récupéré à partir de MongoDB.
Nous utiliserons également la population mongoose afin de puiser dans les informations
du modèle utilisateur et du modèle de plats lorsque nous
établirons cette liste de plats préférés pour notre utilisateur.
Les informations sur les plats préférés que vous stockez ne
contiendront en fait ni les informations sur l'utilisateur ni les informations sur le plat.
Au lieu de cela, il contiendra des pointeurs vers les documents pour
le document plat et pour le document utilisateur, puis nous publierons ces informations
lorsque nous renvoyons ces informations en réponse à une demande get.
Regardons comment nous mettons en œuvre
cette mission finale ainsi que les différentes tâches de cette mission finale.
Pour vous aider à comprendre ce qui est requis dans
l'affectation finale ou ce que vous allez implémenter dans l'affectation finale,
permettez-moi de démontrer ce que votre serveur est censé faire à la fin de cette affectation,
puis je vais énumérer les trois tâches que vous devez effectuer dans cette affectation.
Pour commencer, nous avons besoin d'un ensemble de plats déjà
côté serveur afin que l'utilisateur puisse marquer certains d'entre eux comme leurs plats préférés.
Je suis allé de l'avant et ajouté en quatre plats à ma liste de plats côté serveur.
Tu sais déjà comment faire ça.
Vous devez vous connecter en tant qu'administrateur, puis poster
ces informations sur le serveur un par un.
Pour vous permettre d'obtenir les informations pour chacun de ces plats,
je vous ai déjà fourni le fichier db.json qui contient
les documents JSON correspondant à chacun de ces plats dans les ressources d'affectation.
Vous pouvez l'ouvrir, couper et coller des informations à partir de là, puis
créer une liste de plats côté serveur.
Ici, vous verrez que j'ai déjà effectué l'opération get sur le
localhost : 3000/plats et puis vous
voyez que j'ai déjà obtenu la liste des plats ici.
Ce qui est important pour nous de noter, c'est que chaque plat aura son propre ID de plat ici.
Lorsque vous devez marquer n'importe quel plat comme votre favori,
vous devez accéder à l'ID du plat pour chacun de ces plats.
Vous pouvez copier ces quatre ID de plat, puis les enregistrer afin que lorsque vous
effectuez les opérations pour ajouter ces plats à la liste des plats,
vous puissiez utiliser cet ID de plat.
Je vais donc copier ces quatre ID de plat, puis
les enregistrer dans un document texte afin que je puisse les utiliser.
Avant de pouvoir ajouter des plats à ma liste de plats,
j'ai évidemment besoin de me connecter en tant qu'utilisateur.
Permettez-moi d'aller de l'avant et de me connecter en tant que l'un des utilisateurs.
Pour ce faire, laissez-moi faire un post sur le localhost : 3000/users/login.
Et dans le corps du message,
laissez-moi taper l'un des utilisateurs enregistrés.
Je ne veux pas me connecter en tant qu'administrateur, mais comme l'un des autres utilisateurs normaux.
Alors laissez-moi faire ce post à https://localhost:3443.
Maintenant, toutes ces opérations,
il est préférable de le faire sur le point de terminaison HTTPS plutôt que sur le point de terminaison HTTP.
Nous ferons un post sur ce point de terminaison et nous nous connecterons à notre service,
et en réponse, vous devriez être en mesure de mettre la main sur le jeton web JSON.
Donc, faisons une copie de ce jeton web JSON parce que nous en aurons besoin pour
effectuer l'une des opérations pour ajouter des plats à notre liste de favoris.
Permettez-moi de copier ce jeton et de l'enregistrer dans mon document texte.
Maintenant, comment puis-je ajouter un plat à ma liste de favoris ?
Pour ce faire, la première étape est que nous devons
accéder au point de terminaison /favorites.
Si vous voulez ajouter un plat spécifique à la liste des favoris,
nous disons simplement /favoris, puis ajoutons l'ID du plat dans l'URL ici.
Permettez-moi de coller dans un ID plat que je veux ajouter à ma liste de favoris.
Ici, j'ai collé dans mon ID plat à la liste des favoris.
Le corps de ce message hôte
ne contiendra rien parce que tout ce dont j'ai besoin est déjà dans l'URL.
Et pour l'en-tête,
j'ai besoin de configurer l'en-tête d'autorisation,
et dans l'en-tête d'autorisation,
j'ai besoin du jeton.
Donc, laissez-moi copier le jeton ici, puis dans l'en-tête d'autorisation,
disons porteur, et coller dans l'en-tête d'autorisation.
Vous pouvez également faire la même chose pour obtenir le jeton.
Vous pouvez également vous connecter via Facebook, puis obtenir le jeton web JSON.
J' ai illustré pour obtenir le jeton Web JSON en utilisant
l'authentification locale standard en utilisant le nom d'utilisateur et le mot de passe,
mais peu importe la façon dont vous avez obtenu le jeton Web JSON.
Tant que vous avez le jeton Web JSON,
vous devriez être en mesure d'effectuer toutes ces opérations.
Laissez-moi effectuer la post-opération sur ce point de terminaison et rappelez-vous que
c'est l'ID de plat pour le plat spécifique que je veux ajouter à ma liste de favoris.
Lorsque je poste dans la liste des favoris,
vous verrez que mon serveur répondra avec ce document ici dans le corps de la réponse.
Maintenant, examinons ce document pour voir ce qu'il contient exactement.
Ce document, comme vous pouvez le voir, contient un ID,
mais évidemment parce qu'il s'agit d'un document JSON,
en plus il contient un
champ ici appelé utilisateur.
Maintenant, qu'est-ce que ce champ utilisateur stocke ?
Ce champ utilisateur est l'ID d'objet de l'utilisateur
correspondant à qui est cette liste particulière de favoris.
Et regarde la vaisselle.
Les plats sont un tableau et c'est un tableau d'ID de plat.
Et dans ce cas, je viens d'ajouter le premier plat à ma liste de favoris.
Donc, c'est pourquoi je n'ai qu'un plat dans la gamme de plats dans ma liste de favoris.
Donc, cela devrait immédiatement vous suggérer comment concevoir le schéma pour vos favoris.
Ainsi, plats contient les ID d'objet de chacun des plats,
et l'utilisateur contient l'ID d'objet correspondant à l'utilisateur.
Vous avez déjà vu comment j'utilise
les informations pour faire population de l'information lorsque je fais une opération get.
Nous l'avons déjà fait avec des commentaires.
Donc, cela devrait vous donner un grand indice sur la façon dont vous conceviez le schéma qui contient
l'utilisateur et le tableau de plats dans ma liste de plats ici.
Maintenant, nous avons fait le post à ce sujet.
Prenons la liste des favoris.
Donc, pour obtenir la liste des favoris,
j'ai besoin d'effectuer une opération get.
Maintenant, pour l'opération get,
j'ai évidemment besoin d'avoir aussi les informations d'autorisation ici parce que
vous voulez qu'un utilisateur puisse récupérer uniquement sa liste de favoris,
et aucun autre utilisateur ne peut récupérer la liste des favoris pour un autre utilisateur.
Donc, c'est très important.
Donc, cela vous suggère que vous devez
vérifier l'authenticité de l'utilisateur même pour l'opération get.
Maintenant, comment la post-opération
obtient-elle automatiquement cet ID d'objet correspondant à l'utilisateur ?
Rappelons que lorsque vous incluez l'en-tête d'autorisation ici,
à partir de l'en-tête d'autorisation,
par la façon dont vous effectuez l'autorisation de l'utilisateur,
diriger les propriétés utilisateur déjà chargées sur l'objet de requête.
Et c'est là que vous aurez accès à l'ID d'objet de l'utilisateur.
Donc, un autre indice sur la façon dont vous allez remplir ces informations.
Donc, c'est pourquoi remarquer que lorsque j'ai effectué le post,
je n'ai jamais spécifié l'utilisateur car
les informations de l'utilisateur doivent automatiquement être
dérivées de ce que nous avons fourni ici dans l'en-tête d'autorisation.
Donc, un indice de plus sur la façon dont vous allez procéder à l'implémentation de ceci.
Donc, c'est pourquoi j'ai dit que cette mission est une consolidation
de tous les sujets que vous avez explorés dans ce cours.
Maintenant, je ne supporte pas une opération get sur un ID plat spécifique.
Cela n'a pas de sens pour soutenir cela sur les favoris,
dans un ID plat spécifique.
Au lieu de cela, nous pouvons effectuer une opération get sur l'hôte local 3443/favoris.
Et puis nous effectuons l'opération get.
Vous remarquerez immédiatement que le document qui vous est renvoyé contient
les informations de l'utilisateur déjà renseignées par l'opération get ici.
Donc, les informations de l'utilisateur.
Donc, au lieu de l'ID utilisateur là,
les informations de l'utilisateur sont déjà présentes dedans.
Cela se fait par la population de Mongo.
Donc, c'est un autre grand indice sur la façon dont vous êtes censé implémenter l'opération get.
Non seulement les informations de l'utilisateur sont renseignées.
Maintenant, pourquoi voudrais-je que les informations de l'utilisateur soient renseignées ?
Parce que cela peut être utile lorsque j'affiche des informations.
Cela peut ne pas être nécessaire,
mais je fais juste cela par souci d'exhaustivité
parce que si vous récupérez la liste des favoris pour un utilisateur particulier,
vous savez automatiquement qui est l'utilisateur,
et cet utilisateur particulier se connecte de toute façon.
Mais si vous voulez les informations de l'utilisateur,
vous pouvez effectuer cette opération pour obtenir les informations de cet utilisateur.
Donc, juste pour vous illustrer que la population de Mongo peut être utilisée,
j'ai illustré non seulement que dans la liste des plats ici,
l'information sur chaque plat est déjà peuplée dans ce tableau.
Donc, si vous avez un tas de plats,
les informations de chacun de ces plats devraient être remplies dans ce tableau.
Donc, c'est l'utilisation de la population d'un autre Mongo
que vous voyez pour remplir les informations sur les plats.
Juste par la façon dont vous configurez le schéma pour vos favoris,
cela devrait être automatiquement possible pour vous en utilisant
juste le point rempli sur la liste des plats ici.
Donc, c'est la deuxième partie.
Maintenant que nous sommes en mesure de récupérer la méthode get plats,
laissez-moi vous montrer comment vous pouvez effectuer une post-opération où vous pouvez
ajouter un tas de plats dans votre liste de favoris.
Maintenant, pour revenir à ce post,
si vous avez besoin d'ajouter non seulement un mais un ensemble de plats à votre liste de favoris,
maintenant pourquoi voudriez-vous cela ?
Peut-être que du côté du client, vous pourriez avoir un bouton qui, lorsqu'il est
cliqué, vous permettra de cocher un ensemble de plats de la liste des plats,
puis de les ajouter à un seul coup dans votre liste de favoris.
Donc, pour prendre en charge ce genre d'opération,
vous pouvez autoriser une publication à effectuer sur les favoris barre oblique ici.
Maintenant, lorsque la publication est effectuée sur les favoris barre oblique, encore une fois,
vous aurez toujours besoin de l'en-tête d'autorisation.
Mais dans le corps du message,
nous allons stocker la liste des plats comme un tableau de ce format.
Donc, c'est un document JSON ici,
alors laissez-moi m'assurer que dans mon en-tête,
le type de contenu est déjà présent là.
Maintenant, ce document
contiendra un tableau de plats comme celui-ci.
Donc, chaque plat sera identifié en
disant l'ID de soulignement deux-points,
puis ici ils auront l'ID du plat,
et donc ce ne serait rien d'autre qu'un tableau de plats.
Donc, permettez-moi d'ajouter deux plats à ma liste de favoris ici juste pour illustrer le point.
Donc, laissez-moi coller les identifiants de quelques plats dans ce.
Donc, lorsque vous effectuez un post sur l'hôte local 3443/favoris,
voici comment vous composez le corps du message de publication ici.
Ainsi, chaque plat que vous souhaitez ajouter sera inclus dans ce format ici.
Maintenant, lorsque vous les incluez dans ce format,
puis publiez sur ce côté serveur,
le serveur en retour renvoie la liste mise à jour des favoris pour vous.
Ainsi, lorsque vous recevez la liste mise à jour des favoris du côté serveur,
vous verrez que les informations de l'utilisateur sont déjà là,
mais remarquez comment les plats préférés sont stockés dans ce tableau d'ID d'objet plat.
Donc, le premier que nous avions déjà ajouté dans l'opération précédente.
Donc, les deux restants,
nous venons d'ajouter à la liste de nos favoris.
Donc, ces deux ID d'objet sont également ajoutés dans
mon tableau de plats dans mon document favoris ici.
Alors, voilà. Donc, c'est ainsi que vous êtes censé effectuer
la publication des favoris sur le point de terminaison comme ceci.
Maintenant, nous allons à nouveau effectuer une opération get sur
les favoris juste pour voir ce que les fonctionnalités d'opération get pour nous.
Donc, lorsque nous effectuons l'opération GET,
vous remarquerez immédiatement que dans le document des favoris de retour,
vous avez les informations de l'utilisateur là-bas,
puis ci-dessous,
la vaisselle n'est rien d'autre qu'un tableau de documents Json ici,
chacun correspondant à un plat.
Maintenant, cela est automatiquement pris en charge par le
peuplement mongoose que nous avons fait sur le côté serveur.
Donc, toutes ces informations doivent être automatiquement renseignées sur le côté serveur. C'
est donc ainsi que fonctionnent vos opérations de post sur les deux points de terminaison.
Maintenant, laissez-moi vous montrer comment vous allez effectuer une opération DELETE.
Maintenant, pour supprimer un plat spécifique.
Laissez-moi donc effectuer une opération de suppression sur un point de terminaison spécifique.
Donc, nous allons revenir à ce point de terminaison,
puis laissez-moi simplement copier l'un de ceux-ci,
et puis je vais supprimer l'un des plats.
Donc, pour effectuer l'opération de suppression sur l'un des plats,
bien sûr, comme vous le voyez,
nous n'avons pas encore besoin du corps,
et nous n'avons pas besoin du contenu ici.
Tout ce que nous devons faire est d'effectuer une opération de suppression sur ce point de terminaison.
Donc, ici, vous voyez que je fais localhost : 3443/favorites/ et puis l'ID du plat.
Et puis laissez-moi poster ceci.
Donc, quand je supprime un plat spécifique de ma liste de favoris,
vous remarquez immédiatement que
ma liste mise à jour de favoris est renvoyée au côté client par le serveur.
Donc, vous avez l'utilisateur ici,
mais notez que dans le tableau de plats je n'ai que deux plats maintenant.
Celui que je viens de supprimer est parti de cette liste de plats.
Donc, si vous effectuez un GET maintenant,
votre gamme de plats sera continuellement à plats là-bas.
Maintenant, supposons que j'effectue une DELETE sur les favoris ici.
Donc, si j'effectue DELETE sur le point de terminaison des favoris lui-même,
alors ce qu'il va faire est de supprimer tous mes favoris et
aussi supprimer mon document favoris complètement du côté serveur.
Donc, laissez-moi effectuer cette opération de suppression du côté serveur,
puis il retournera le fait qu'il a supprimé ce document particulier,
donc il retourne juste ce document de toute façon.
Mais maintenant, si j'effectue une opération GET sur ma liste de favoris,
je vais récupérer un null là. Ce
qui signifie que je n'ai pas ce document côté serveur.
Donc, le document des favoris est complètement disparu,
lorsque j'effectue l'opération DELETE sur la colonne hôte locale trois à partir des favoris précédemment barre oblique.
Maintenant encore, lorsque j'ajoute un nouveau plat à ma liste de favoris,
mon document de favoris sera configuré à nouveau.
C' est parfaitement bien pour nous d'opérer.
Donc, avec cette démonstration, je vous ai montré
toutes les différentes opérations que vous devez effectuer sur votre serveur.
Toutes les différentes opérations sur les différents points de terminaison d'itinéraire
que vous devez effectuer ou implémenter côté serveur.
Maintenant que vous avez vu
toutes les différentes opérations que le côté serveur devrait prendre en charge sur les favoris barre oblique,
et les favoris barre
oblique, les points de terminaison ID plat,
laissez-moi énumérer les trois tâches que vous devez effectuer dans cette affectation.
La première tâche bien sûr est d'implémenter le schéma et le modèle préférés.
Ceci, vous allez implémenter dans le dossier des modèles dans un fichier appelé NodeJS favori.
Là, vous allez implémenter le schéma favori.
Rappelez-vous que le schéma favori stockera
la référence à l'ID d'objet document de l'utilisateur
et un tableau d'ID d'objet de document plats.
C' est le gros indice sur la façon dont vous êtes censé
concevoir le schéma et le modèle pour vos favoris.
La deuxième tâche de votre affectation consiste à implémenter les
opérations GET, POST et DELETE sur le point de terminaison des favoris de barre oblique.
GET vous obtiendra toute la liste des favoris,
remplis automatiquement par le remplissage de Mongo,
le POST devrait contenir une liste de plats comme spécifié
dans le format que je viens de vous montrer dans le corps du message POST.
Et donc un tas de plats seront ajoutés dans votre liste de favoris,
et l'opération DELETE sur le point de terminaison des favoris barre oblique
supprimera votre document favoris complètement du côté serveur.
Maintenant, si vous effectuez une opération POST sur barre oblique préférée ID plat,
alors le plat particulier sera ajouté dans votre liste de favoris.
Si votre document favori n'existe pas,
vous devez évidemment créer ce document favori.
Cela fait aussi partie de cette opération POST.
Donc, si à un moment quelconque vous trouvez que le document favori n'existe pas,
vous devez d'abord créer le document favori
, puis ajouter ce plat dans le document favori.
C' est donc un point important à noter.
Lorsque vous effectuez un POST sur le point de terminaison des favoris de barre oblique,
si le document favori n'existe pas,
vous devez créer un document favori, puis ajouter les plats à votre document favori.
S' il existe déjà,
vous ne mettez à jour que ce document favori.
C' est donc un indice de plus sur la façon dont vous êtes censé implémenter les opérations POST.
Si vous effectuez une opération DELETE sur l'ID de la barre oblique des favoris
, ce plat spécifique sera supprimé de la liste des favoris.
Maintenant, lors de l'exécution des opérations POST et DELETE,
vous devez vous assurer que vous n'ajouterez pas de doublons à l'ID plat.
Donc, avant d'ajouter un ID d'objet plat à la liste des plats,
vérifiez toujours si l'ID de plat existe déjà dans la liste des plats.
Maintenant, c'est là que vous pouvez utiliser la méthode indexOf tableau pour vérifier
si un ID de document existe déjà dans un tableau de documents.
C' est donc un autre indice important sur la façon dont vous allez implémenter cette partie.
Et la troisième tâche bien sûr est de monter
le routeur préféré sur les points de terminaison favoris slash en mettant à jour le fichier app.js.
Le routeur favori lui-même sera implémenté dans
le dossier routes dans le fichier favoriterouter.js.
Donc, avec cela, j'ai décrit ce que vous êtes
censé implémenter dans la quatrième et dernière affectation.
Et j'espère que cette affectation vous aidera
à consolider tout ce que vous avez appris dans le cours,
de la conception d'un routeur express,
à faire MongoDB et aussi le schéma et les modèles de Mongo,
et également effectuer l'authentification utilisateur appropriée.
Et comme je l'ai mentionné à nouveau,
seul un utilisateur authentifié aura accès à sa liste de favoris.
Même l'opération GET ne peut être effectuée que par
un utilisateur authentifié sur le point de terminaison des favoris de barre oblique.
Et vous ne feriez que chercher les favoris pour cet utilisateur particulier.
Vous ne pouvez pas autoriser un autre utilisateur à accéder aux favoris d'un autre utilisateur.
Encore une fois, cela vous indique également comment vous êtes censé effectuer
l'authentification sur les différents points de terminaison de route.
Avec cela, je complète la description des tâches dans la quatrième affectation.
Amusez-vous à remplir cette mission.