Transcription
1. Introduction du cours: Bienvenue dans le cours NoJS
ultime. Dans ce cours, vous
apprendrez tout sur nodejs, de base à la version avancée, dans
un langage simple et facile à
comprendre À la fin de ce cours, vous commencerez à créer des applications de paiement rapides, évolutives
et sécurisées sans vous y perdre Permettez-moi de vous présenter
certaines des principales fonctionnalités abordées dans ce cours. Vous allez donc apprendre à vous connecter à une
base de données. Pagination et
infinance, authentification des
utilisateurs, connexion avec Google et connexion
avec les fonctionnalités de Facebook, envoi d'e-mails depuis notre backend, téléchargement de plusieurs images,
gestion et journalisation des erreurs, téléchargement de plusieurs images application de l'
intégration complète des paiements sur papier,
et également fonctionnalités de
chat en temps réel utilisant également fonctionnalités de
chat en temps réel socket pour envoyer
des messages
individuels le socket pour envoyer
des messages
individuels, montrer la saisie
indicateurs,
gestion de l'état du message, s'il
est envoyé, livré ou vu, et également des fonctionnalités de discussion de groupe. Maintenant, pour apprendre ces concepts
avancés, nous avons besoin d'une base solide. Nous allons donc d'abord
commencer par apprendre les bases de
nodejs, comme les concepts de
base de node, modules
intégrés, Express, qui est le framework nod Js le plus populaire et le
plus utilisé, certains concepts de
répression JavaScript tels que les
rappels, les promesses, Nous verrons également
Mongo DB et mangos,
et si vous comprenez clairement les concepts
de base, vous pouvez implémenter très facilement
tous les sujets avancés de node jazz Je tiens également à clarifier une chose. Dans ce cours, nous
n'allons pas créer front-end car cela n'entre pas dans
le cadre de ce cours, mais nous allons essayer certaines fonctionnalités front-end afin que vous ayez compréhension claire du flux de travail
complet lié à ces fonctionnalités. Je vais vous donner du code
prêt à être dégusté Vous n'avez
donc qu'à
exécuter ce fichier et vous pourrez découvrir certaines fonctionnalités.
C'est vraiment amusant. Donc, si vous connaissez un
peu le Node Jazz, ou si vous êtes confus dans les concepts, si vous ne savez
rien du Node Jazz, alors ce cours est fait pour vous. Au cours de ce cours, nous allons créer le back-end de trois
applications. abord, pour faire une application pour
apprendre des concepts de base, puis deux
projets majeurs :
application de commerce électronique et application de
réseaux sociaux back-end, pour apprendre les concepts avancés de jazz des
nœuds. Maintenant, vous pourriez me demander qui je suis ? Je suis
ingénieur logiciel et j'enseigne également la
programmation dans un langage facile à
expliquer à l'aide de
ma chaîne YouTube, Dieu vous bénisse, et de
mes cours en ligne. Dans l'ensemble, dans ce cours, vous recevrez plus de 200 leçons vidéo
SD, des mises en œuvre dans le monde
réel
, de nombreux exercices,
afin que vous puissiez apprendre non J grâce à une
mise en œuvre pratique, quelques conseils et astuces,
et bien plus encore. Après avoir terminé ce cours, vous allez écrire du code No JS en toute confiance et en utilisant les
meilleures techniques Alors inscrivez-vous rapidement et devenez un héros de
No JS o to No Jazz CU dans ce cours.
2. Section 01 - Qu'est-ce que NodeJS: NodeJS est le plus
populaire auprès des développeurs, mais il ne s'agit pas d'un langage de
programmation ou d'un framework Alors, qu'est-ce que Nod
Js ? Voyons voir ça. Nojs est simplement un
environnement d'exécution permettant d'exécuter du code
JavaScript en dehors
du navigateur. Qu'
est-ce que je veux dire par là ? Comme nous le savons, nous utilisons du code
JavaScript pour modifier les données de
la page Web ou
implémenter une certaine logique, mais nous ne pouvons pas exécuter Ja Script
en dehors du navigateur. devons lier notre
fichier JavaScript à notre fichier SDML, puis nous pouvons l'
exécuter sur notre navigateur Mais avec nodejs, nous pouvons exécuter du code
JavaScript en dehors
du navigateur Nodejs fournit un environnement
d'exécution pour exécuter du code JavaScript. Les développeurs utilisent principalement Nojz
pour créer des services de backend appelés API ou nous pouvons dire interface d'
applications Maintenant, vous pouvez vous demander
ce qu'est une API ? En gros, c'est un moyen pour deux programmes de
communiquer entre eux. Je vous
l'explique par un exemple. Voici donc un restaurant. Nous sommes assis sur la table n et nous voulons commander de la nourriture. Dans ce cas, que ferons-nous ? Nous ne pouvons pas aller directement à la cuisine et commander
nos plats au chef. Au lieu de cela, nous
appellerons un serveur. Serveur, il prendra notre commande et la remettra à la cuisine Après cela, la cuisine
commence à
préparer notre commande et donne à
manger au serveur, puis le serveur livrera
la nourriture à notre table Ici, l'eau est comme
un messager qui prend notre demande et la transmet à destination. Ensuite, le serveur
recevra un message
de réponse de cette destination
et nous le ramènera Donc, dans le monde réel, cette
table sur laquelle nous
sommes assis est notre
application client ou notre interface client. Nous voulons obtenir des données sur les aliments qui sont disponibles
sur le back-end. Nous appellerons Waiter, qui est une API, et nous lui enverrons des demandes Maintenant, l'API transférera cette demande vers le
serveur ou la base de données, qui est notre cuisine, et ce serveur ou base de données
partagera la réponse, c'
est-à-dire les données que nous voulons. Et l'API fournit les
données de réponse à notre client. Vous savez maintenant
ce qu'est une API. L'API permet à deux programmes de
communiquer entre eux. Avec NodeJS, nous pouvons
créer des API réelles. Nous pouvons également créer des applications en temps réel
ultrarapides avec node JS Ces services fournissent de l'énergie à nos applications clientes comme les applications
Web et
les applications mobiles très utiles. Savez-vous que Netflix,
Paper, Uber, Lin DIN et bien d'autres
entreprises célèbres utilisent No Jazz ? Oui, car Noe Jaz rend ses services ultra
rapides et efficaces De plus, P a fait une excellente
recherche sur Noe Jaz. Je vais vous le dire
dans une minute. En résumé, Node Jazz
est un environnement d'exécution, et c'est le
choix idéal pour créer des applications
hautement évolutives liées aux données
et en temps réel. Vous vous demandez peut-être s'il
existe de nombreux frameworks et langages tels que Java et asp.net, qui peuvent également créer des services
wegen Quelle est la particularité de Node Jazz ? Pourquoi devrions-nous apprendre le node jazz ? Pourquoi est-ce si populaire ? Tout d'abord, sans jazz, nous pouvons créer des
services de backend ultra
rapides et hautement évolutifs à faible coût De plus, les gens ont fait une belle
expérience sans jazz. Dans cette expérience, les utilisateurs créent le
backend de leur application en utilisant No Jazz et construisent également la même application
avec Java et Spring. Et connaissez-vous le résultat
de cette expérience ? C'est vraiment choquant. Ils ont découvert que
l'application node était créée deux fois plus
rapidement que l'application Java plus Spring et qu'elle
nécessitait moins de personnel. Dans Java et Spring, ils ont cinq
développeurs, puis dans node, ils n'ont besoin que de deux développeurs, et ces deux développeurs
créent toujours des applications
plus rapidement dans nodejs De plus, l'application du nœud
prend 40 % de fichiers en moins. De plus, en Java, ils ont
5 000 lignes de code, mais dans nodejs, ils
n'en ont que 1 500, soit trois fois moins L'application de nœud
est donc très rapide, temps de réponse est
35 % plus rapide
que l'application Java, et l'application de nœud peut traiter près de deux requêtes X par
seconde par rapport à une application Java. Ce résultat choque
tout le monde et les gens ont
immédiatement migré de nombreux
services de Java vers le nœud Jz C'est vraiment cool, non ? Ensuite, avec node jazz, nous obtenons une base de code plus propre et plus
cohérente car avec moins de code, nous pouvons faire de nombreuses choses complexes. Il est également idéal
pour le prototypage, ce qui signifie que node Jazz
est rapide et facile à utiliser lors de la création de la première
version d'une application La première version est
appelée prototype. De plus, comme nous le savons, dans node jazz, nous utiliserons JavaScript. Donc, si vous êtes un
ami développeur, vous pouvez facilement apprendre node Jazz sans apprendre un nouveau langage
de programmation. Et si vous apprenez à la fois le
frontend et le backend, vous pouvez changer
de rôle en tant que développeur
full stack,
améliorer votre carrière
et obtenir un salaire plus élevé Et un autre avantage de Nojs est que
Nojz possède un vaste écosystème
de bibliothèques open source, ce qui signifie qu'il
existe un code prédéfini pour faire des choses particulières Nous pouvons donc utiliser le code de
quelqu'un d'autre et implémenter ses fonctionnalités
dans notre application. Donc, dans l'ensemble, l'apprentissage de
nodejs en 2025 ou à l'avenir sera certainement bénéfique pour vous et votre carrière de
programmeur
3. Histoire de NodeJS: Dans la leçon précédente,
nous avons vu que No Jazz est un environnement d'exécution
permettant d'exécuter du code
JavaScript en dehors
du navigateur. Mais voyons comment Noe Jazz a inventé une histoire intéressante. Avant 2009, JavaScript était comme un super héros piégé dans
un navigateur comme Chrome, Firefox et bien d'autres navigateurs Dans tous ces navigateurs, il existe un moteur JavaScript. Lorsque nous exécutons notre
code JavaScript dans le navigateur, navigateur transmet ce code
au moteur JavaScript. Le moteur JavaScript
traite ce code et le
convertit en code machine, que notre ordinateur
peut comprendre. Par exemple, Microsoft Taj
utilise Chakra Engine, Firefox, moteur Spider Monkey,
et Google Chrome, utilise Fiat Engine, qui est le
moteur JavaScript le plus puissant de tous les navigateurs. En raison de ces différents moteurs
JavaScript, code JavaScript fonctionne
parfois différemment selon les
navigateurs. Lorsque nous utilisons JavaScript uniquement
dans les navigateurs, il existe de nombreuses limitations. Nous ne pouvons pas créer de serveurs ou effectuer tâches
Bend telles que la
gestion de la base de données, l'authentification des utilisateurs ou les API. Maintenant, à l'époque développeur, Yandll entre en scène Il pense : et si nous
prenions le moteur Vat et que nous
laissions JavaScript fonctionner sur des serveurs
plutôt que sur des navigateurs. Il prend le moteur Vet, qui est le moteur
Js le plus rapide, et enregistre ce moteur
dans le code CPlusPlus pouvons exécuter du code Jascip sur
notre machine et appeler ce logiciel nodejs et
c'est SOO nodejs Nod Js est un
environnement d'exécution pour exécuter du code
JavaScript car il
possède le moteur V JA Script. Cet environnement est légèrement différent de celui que nous
avons dans notre navigateur. Comme dans le script Ja du navigateur, nous avons un objet de document pour
traiter un document SDML Nous avons également un objet Window. Nous n'entrons pas
dans Node Jazz et nous
ne voulons pas non plus accéder aux objets
Document et Window car dans Node Jazz, nous créons des
services principaux, et les objets Document et Window
sont destinés aux tâches frontales. Alors pourquoi avons-nous besoin d'un document et d'
une fenêtre dans le back-end ? Avec le node js, nous pouvons faire
bien d'autres choses, comme accéder au système de fichiers
pour lire et écrire des fichiers. Nous pouvons nous connecter à une base de données
et stocker des données dans une base de données, et nous pouvons également créer
des API rapides et bien d'autres choses encore. Maintenant, vous pourriez vous
demander comment nodejs est super rapide, comment fonctionne no Jz, et nous verrons cela
dans la
4. Comment fonctionne NodeJS: Nous avons donc vu que
nodejs est utilisé pour backend
ultra rapides et hautement évolutives Mais How Nod Js est super rapide. Donc, si aucun Js n'est
super rapide, c'est parce qu'il ne bloque pas ou parce que nous pouvons dire que nœud js est
asynchrone Maintenant, vous pouvez vous demander
ce qu'est l'asynchrone ? Laissez-moi vous expliquer par
un exemple simple. Imaginez qu'il s'agit d'un restaurant. Nous avons une cuisine ici et
plusieurs tables. Maintenant, le premier client
veut passer commande. Alors voilà, notre serveur, va à la première table, passe commande Disons une pizza. Ensuite, notre serveur donne cet ordre au
chef de cuisine Maintenant, pendant que nous préparons la pizza, notre serveur va
regarder d'autres tables Supposons que la table 2 veuille
donner une autre commande, puis que le serveur prenne cette commande et la donne également dans la cuisine Notre serveur unique peut
gérer de nombreuses tables. Il n'a pas besoin d'attendre que le
chef termine une commande, puis il peut servir une autre commande. Il
n'a pas besoin de faire ça. C'est ce qu'on appelle une méthode non
bloquante ou asynchrone,
et c'est ainsi que fonctionne
l'application du nœud Ce weiter unique fonctionne comme un thread unique du nœud JS, dont la tâche est de traiter les demandes Ce thread unique peut donc être utilisé pour traiter plusieurs demandes
sans blocage. Maintenant, de l'autre côté de
cette méthode asynchrone,
nous avons également une méthode synchrone
ou Comprenons cela également
avec le même exemple. Ici, le client Vn
veut passer commande. Notre serveur prend la commande de la
première table et la donne à la cuisine et nous
commençons à préparer
cette commande, comme une pizza Maintenant, comme nous le savons, la préparation d'une pizza
peut prendre du temps. À ce moment-là, au lieu de
s'occuper d'autres tables, notre serveur attend dans la cuisine pour
terminer cette commande Supposons que cela prenne 10 minutes, alors notre serveur
attendra 10 minutes
dans la cuisine Ensuite, livrez cette
pizza à la première table. Maintenant, à ce moment-là, les clients assis
sur d'autres tables doivent s' asseoir parce que notre serveur est
bloqué pendant 10 minutes. C'est ce qu'on appelle le blocage
ou le mode synchrone. La plupart des anciens frameworks
dorsaux tels que w.net ou Rails fonctionnent de manière
synchrone ou bloquante Ainsi, lorsque quelqu'un envoie des
demandes sur le serveur, serveur alloue un thread
pour traiter cette demande. Notre exemple, c'est Weiter. Imaginez maintenant que nous ayons une demande pour obtenir
la liste des utilisateurs. Cette tâche nécessite le
fonctionnement de la base de données, ce qui peut prendre du temps. Maintenant, si à ce moment-là nous
recevons une autre demande, alors pour traiter cette nouvelle demande, nous devons également leur donner
un nouveau fil de discussion ou un nouveau rédacteur Imaginez maintenant que sur notre serveur, il y ait 1 000 requêtes. Devrions-nous créer un fil
de discussion pour toutes ces demandes ? affirmative, nous devons
augmenter le nombre
de matériels de serveur, ce qui est très coûteux et lent C'est
pourquoi les applications basées sur asp.net ou Rails nécessitent plus grand nombre de serveurs
et une maintenance accrue Maintenant, à ce moment-là, le nœud
entre en scène,
et comme nous l' avons vu, nœud utilise une méthode asynchrone
ou non bloquante Bien sûr, nous pouvons
faire en sorte que l'application asp.net ou Rails fonctionne comme
une application non bloquante ou
asynchrone Mais pour cela, nous devons
faire un travail supplémentaire. autre côté,
les applications de nœuds fonctionnent par défaut de manière asynchrone
ou non bloquante C'est donc vraiment rapide
et facile à gérer. Lorsque nous recevons plusieurs
demandes sur le serveur de nœuds, le nœud a un seul thread. Ce thread unique peut
traiter une seule demande. Maintenant, si cette tâche prend du temps, trouvez quelque chose dans la base de données, puis notre thread unique ajoute
cette tâche dans la liste appelée événement Q, passe à une autre demande et commence à
traiter cette demande. Cet événement Que informera nœud lorsqu'il obtiendra des données
de la base de données, puis notre nœud enverra
ces données à la demande. Ainsi,
notre thread unique peut servir plusieurs utilisateurs, et c'est pourquoi nodejs
est une excellente option pour les applications gourmandes en données ou
liées au réseau Elles peuvent servir un plus grand nombre de clients
sans ajouter de serveurs supplémentaires C'est pourquoi les applications de nœuds sont également hautement évolutives. La question
est maintenant de savoir si nous devons utiliser le nœud Jazz pour tous les
types d'applications ? Et la réponse est non. Nous ne devons pas utiliser le nœud pour les applications gourmandes en ressources
processeur. Maintenant, qu'est-ce que le CIPi intensif ? gourmandes en CPU
désignent les applications dont les tâches sont liées au processeur, comme applications de montage
vidéo ou de
retouche photo. Dans ce type d'application, nous avons beaucoup de
calculs qui peuvent utiliser quelques options du processeur, ce qui concerne le
système de fichiers ou le réseau. Et comme nous le savons, le nœud est une
application à thread unique lorsqu'il effectue opérations liées au
CPI lorsque d'autres clients doivent attendre
pour terminer cette tâche Ici, le nœud perdra son
avantage d'être asynchrone, et c'est pourquoi nous ne devrions pas utiliser nœud pour les applications
SIPE Peut utiliser le nœud pour les applications d'entrée-sortie, liées au
réseau ou liées aux
données en temps réel. N'oubliez pas que nous ne devons pas utiliser nœud pour les
applications intensives en CIPI Sinon, le nœud peut être utilisé pour presque tous les types
d'applications. Nous comprenons donc en quoi Nod Jazz est plus rapide que les autres frameworks de
back-end. Ne vous inquiétez pas pour les théories. Au fur et à mesure que vous créez des projets
dans node Jaz, vous
les comprendrez très facilement. Commençons donc à apprendre le
nœud Jaz de manière pratique.
5. Installer de Node JS dans le système: Voyons comment installer
NodeJS dans notre système. Tout d'abord, nous allons vérifier si Nojs est déjà dans
notre système ou non Ouvrez donc l'
invite de commande sous Windows, et si vous
utilisez Mac ou Linux, ouvrez votre
terminal et écrivez node, version
Dash Dash,
puis appuyez sur Entrée. Vous voyez ici que je reçois ce
type de message d'erreur, nœud n'est pas reconnu comme une commande interne ou
externe. Cela signifie que le nœud n'est pas
installé sur mon système. Si vous obtenez ici la version nodejs, cela
signifie que node est déjà
installé sur votre système, mais je
vous recommande vivement d'installer la dernière
version de table de node Rendez-vous donc sur le navigateur
et sur opennjs.org. Sur ce site Web, nous obtenons une version
téléchargeable de Nodjs LTS, c'
est-à-dire la dernière version de table que le nœud
recommande officiellement d'utiliser Au moment où j'
enregistre ce cours, dernière version est 22.14 Mais à l'avenir, version mise à jour
pourrait être disponible. Il vous suffit donc de cliquer sur cette version et le téléchargement commencera. Une question que vous pourriez vous poser est la suivante : ce cours est-il pertinent pour
les futures versions de nœuds ? Et la réponse est oui. Ce cours
restera pertinent pour n'importe quelle version de nœud JS,
car dans ce cours, nous allons nous concentrer
sur les principes fondamentaux du nœud JS, et vous pouvez utiliser ces principes fondamentaux
dans n'importe quelle version de nœud JS. Vous n'avez donc pas à vous
soucier de l'absence de mises à jour de JS. Si des mises à jour majeures se produisent, je mettrai à jour ce
cours en conséquence. Notre installation est maintenant
prête à être installée. Ouvrons-le donc. Permettez-moi de le mettre ici Cliquez sur Suivant, acceptez les termes et
conditions et cliquez sur Suivant. À partir de là, vous modifiez
le chemin d'installation, mais dans ma suggestion,
laissez-le tel quel. Encore une fois, cliquez sur Suivant
et sur Suivant et installez. Et c'est fait. Maintenant, vérifions que Nojs est correctement
installé ou non. Revenez donc à l'
invite de commande ou au terminal et écrivez la version des nœuds,
puis appuyez sur Entrée. Tu vois, maintenant j'arrive ici avec la version 22.14 0.0 de Nod
Gs. Nous avons donc installé avec succès
le nœud dans notre système. Une autre chose dont nous avons besoin dans
ce cours est un éditeur de code. éditeur de code préféré est Visual Studio Code ou VS Code, qui est l'un des
meilleurs éditeurs de code. Bien sûr, vous pouvez utiliser
n'importe quel autre éditeur de code, mais peu d'éditeurs ont le
même pouvoir que le code VS. Et aussi, dans ce cours, je partagerai mes trucs
et astuces pour le code VS. Donc, si vous n'avez pas de code VS, vous pouvez aller sur
code.visualstudio.com, télécharger le code VS et C'est vraiment simple.
Dans la leçon suivante, nous allons écrire le code JS de notre
premier nœud.
6. Écrire du code de premier nœud code: Écrivons le code JS de notre
premier nœud. Ouvrez le dossier dans lequel vous
souhaitez créer un projet. Ici, j'ouvre
le dossier Project, et dans ce dossier, je crée un nouveau
dossier, disons, premier projet et j'ouvre simplement
ce projet dans le code VS. Bien. Ce code VS semble un peu plus petit pour ce
cours. Alors laisse-moi zoomer. D'habitude, je ne
zoome pas autant, mais avec ce zoom, vous pouvez
voir clairement ce que je fais. Parfait
Créons maintenant un nouveau fichier ici. Disons que le point d'index est. Vous pouvez utiliser n'importe quel nom. Cela dépend entièrement de vous. Maintenant, dans ce fichier, nous pouvons écrire notre code
JavaScript normal, que nous avons l'habitude d'écrire. Créons donc simplement une variable appelée « greeting »
égale à « bonjour ». Ensuite, nous
ne faisons que consulter ce journal. Bonjour virgule et
adhérez simplement à la variable de salutation. Enregistrez ce fichier.
Maintenant, vous vous demandez peut-être, comment pouvons-nous exécuter ce code
sans notre navigateur ? Parce qu'auparavant, nous
exécutions JavaScript à
l'aide d'un navigateur. Donc, pour exécuter ce code sans
chaises, nous avons besoin d'un terminal. Et utilisez notre terminal système et ouvrez notre dossier de projet
dans ce terminal, ou nous pouvons utiliser le terminal VS code. J'utilise toujours le terminal VSCode
car il est facile à ouvrir, allez dans le menu du terminal
et sélectionnez un nouveau terminal, ou vous pouvez appuyer sur
Control plus Pecti Il ouvrira ici le terminal. Maintenant, pour exécuter ce fichier
index point js, il suffit d'écrire node, space et notre nom de fichier, qui est index point js. Votre nom de fichier est apt Gs, alors vous devez écrire ici nodspace app point
js et appuyer sur Entrée Vous voyez, nous avons ici
notre gamme de consoles. Alors félicitations. Vous écrivez
votre premier code nodejs Maintenant, pour masquer ce terminal, nous pouvons à nouveau appuyer sur
Ctrl plus Bectig Maintenant, ici, nous pouvons également ajouter une
fonction et appeler cette
fonction, comme nous le faisons
en JavaScript normal. Ainsi, une fois que la console a ouvert une
session sur la nouvelle ligne, nous pouvons créer une
fonction d'impression de message. Et entre crochets Cully, nous nous contentons de la console point
log. Passe une bonne journée. Et après cette fonction, nous appelons simplement cette fonction
d'impression de message, afin de pouvoir obtenir ce message de
console, enregistrer ce fichier, et pour exécuter à
nouveau
ce fichier, qu'écrivons-nous
dans le terminal ? Écrivez, nous écrivons
l'index d'espace des nœuds point js. Vous voyez ici, nous obtenons ces
deux consoles Loui. Nous pouvons donc utiliser ici la fonction
set timeout, set interval
function, etc. Nous pouvons ajouter presque
tout le code JavaScript dans l'application du nœud. Vous pouvez maintenant vous demander quel type de code
JavaScript nous ne pouvons pas ajouter
ici dans le projet node JS. Ainsi, dans le projet NodeJS, nous pouvons ajouter tous les types
de code JavaScript, sauf écrire du code de
manipulation Doom tel que
document point Get element
ou window point
location, etc.,
car comme document point Get element nous le savons, quel que
soit le code que
nous écrivons dans l'application node, s'
exécutera sur le serveur
et sur le serveur, comment pouvons-nous accéder aux objets document Permettez-moi de vous montrer pratiquement
ce qui se passera si nous utilisons un document dans ce fichier JS à points d'
index. Je commente tout ce code
en utilisant Control plus slash ou Command plus slash et simplement ici, le journal des points de
la console Imprimez ici l'objet du document. Enregistrez ce fichier, et
dans le terminal, nous exécutons à nouveau node index point js, ou nous pouvons simplement appuyer sur un perro Cela nous apportera une
commande précédente. voyez, ici, nous obtenons une erreur
indiquant que le document n'est pas défini, et c'est A qui nous montre la ligne. Nous ne pouvons donc pas utiliser ici le code de manipulation
de Doom. Une autre chose est que
nous ne pouvons pas non plus utiliser ici des
événements spécifiques au navigateur tels que Alert. Donc, à la place de cette console,
nous ajoutons Alert, say hello. Enregistrez ce fichier, et
exécutons-le de nouveau. Voir ici, nous obtenons L'alerte
n'est pas définie car, encore une fois, il s'agit d'événements
liés au navigateur. Le serveur ne peut pas afficher l'
alerte dans le navigateur. C'est le front-end
qui peut afficher Alert. Donc, pour résumer dans index JS ou dans tout autre
fichier d'un projet de nœud, nous écrivons du code JavaScript pour serveur. Nous pouvons utiliser
divers modules, gérer SDDPRquest, accéder à nos fichiers système, nous
connecter à la base de données, créer des applications en temps réel, et bien d'autres choses que nous
apprendrons étape par
étape dans ce apprendrons étape par
étape dans Ne vous inquiétez pas, vous maîtriserez
Node après ce cours. Tu dois juste coder
avec moi et essayer d'écrire du code une fois que tu l'as bien
compris. Il ne s'agit pas simplement de copier-coller. Vous devez comprendre
pourquoi nous écrivons ce code spécifique
puis l'implémentons. C'est vraiment simple.
7. Rendre le code VS cool [FACULTATIF] ]: Dans la leçon précédente,
si vous vous demandez comment mon code est reformaté
lorsque j'enregistre le fichier Pour cela, j'utilise l'une
des meilleures et des plus populaires extensions de code
VS appelée pretty. Installez cette extension. Maintenant, nous devons faire quelques réglages
pour l'installation de Pretty E. Donc,
dans la section d'installation, faites défiler la page jusqu'à la section du
formateur par défaut Et ici, copiez ces deux lignes de code sans crochets Cully Maintenant, ouvrez les paramètres à partir de
l'icône représentant une roue dentée en bas, accédez aux paramètres, puis,
dans
le coin supérieur droit , ouvrez les paramètres, les
touches et le fichier, et à la dernière ligne, ajoutez une virgule, puis dans la
nouvelle ligne, après ces lignes Consultez ce fichier.
Revenez maintenant aux paramètres et au format
de recherche lors de la sauvegarde et assurez-vous que c'est
coché et terminé. De plus, de nombreux étudiants me demandent quel thème et quelles polices
j'utilise pour mon code VS. Donc, actuellement, j'utilise
mon thème préféré
, Au Mirage Warder Vous pouvez le télécharger
depuis le panneau d'extension. Ce thème n'est ni très
clair ni très sombre, il est
donc bon pour
les yeux et il est beau. Le nom de la police que
j'utilise est Monisa. Quelle est la police payante, vous pouvez télécharger cette police comme
vous le souhaitez. Je ne peux rien dire de plus. Installez-les dans votre système. Ensuite, à partir du paramètre de code
VS, recherchez ici la famille de polices et ajoutez votre nom de police au tout
début, et c'est tout. Vous pouvez utiliser le thème
et les polices de votre choix. Cela dépend entièrement de vous. Et si vous avez une bonne combinaison, vous pouvez ajouter vos captures d'écran de
VS code dans la section Q&R J'adore voir ça,
et c'est tout. Nous sommes prêts à partir. Passons donc
au code JS de ce nœud.
8. Section 02 - Que sont les modules: Bienvenue dans la deuxième section
du cours ultimate node JS. Dans cette section, nous allons
apprendre tout ce que nous devons savoir sur les modules, par
exemple que sont les modules ? Comment créer
nos propres modules ? En outre, nous avons des
modules intégrés tels que le chemin, le système
d'exploitation, le système de fichiers, le module DTP
pour créer un serveur, et bien plus encore Commençons par
ce que sont les modules. Mais avant cela, permettez-moi de vous
donner une situation. Dans la section précédente, nous avons créé ce fichier JS à points d'index. Imaginez maintenant qu'il s'agit
du projet Began de Netflix, qui est vraiment un gros projet. Ce projet possède de nombreuses fonctionnalités
telles que la connexion à la base de données, l'authentification des utilisateurs, la passerelle de
paiement, ainsi que de nombreuses autres API. Imaginez maintenant que nous ajoutions
tout ce code de fonctionnalité dans
un fichier G à point d'index unique. Comment allez-vous gérer
cela ? Ou si quelqu' un vous demande d'ajouter une autre
fonctionnalité dans le même projet, imaginez à quel point cela sera difficile
et confus. Quelle est la solution
ici ? Pensez-y. Ici, nous pouvons créer
ces fonctionnalités séparément dans
différents fichiers ,
puis simplement les saisir dans
le fichier d'index principal NodeJS Ces différents petits fichiers sont appelés modules dans le nœud JS. Si j'ai un problème de connexion à la
base de données, je peux accéder au module de
connexion à la base de données et résoudre ou améliorer ce
code indépendamment. En résumé, un module est un morceau de code qui exécute
une tâche spécifique. Par exemple, imaginez que
vous construisez une voiture. Une voiture comporte de nombreuses
pièces comme le moteur, roues, les tôles, etc. Chaque pièce est construite séparément et peut également être remplacée ou réparée sans
affecter l'ensemble de la voiture. Maintenant, dans node JS, les modules
fonctionnent de la même manière. Chaque module représente une partie différente de
notre application, et ces modules peuvent fonctionner ensemble pour former une application
complète. Et c'est pourquoi les modules sont une partie très importante de node JS. Nous pouvons maintenant diviser
les modules en trois types. Le premier concerne les modules locaux. Ce sont les modules
que nous allons créer pour notre propre application, comme module de base de
données pour la connexion à la base de données, module de
paiement pour le traitement
des paiements, etc. Le deuxième concerne les modules de base. Ce sont les modules intégrés
que nous obtenons avec node JS. Ils sont déjà disponibles
dans toutes les applications de nœuds. Par exemple, FS pour le système de fichiers, STTP pour créer un
serveur STTP ou créer STTPRQuest Système d'exploitation pour les fonctionnalités
liées au système d'exploitation ,
et bien d'autres encore. Ne vous inquiétez pas, je vais vous expliquer nos modules de base dans les prochaines
leçons de cette section. Maintenant, le
troisième concerne les modules tiers. Ce sont les modules qui sont créés et publiés
par d'autres développeurs. Si nous voulons les utiliser, nous devons installer manuellement ces modules dans notre projet. Par exemple, express point
js est un module tiers qui nous aide à
créer rapidement une API. Un autre module est Mongoose
pour Mongo Div et cetera. Ce sont des modules tiers
créés par quelqu'un d'autre, et nous pouvons également
les utiliser dans notre projet. Ne vous inquiétez pas pour
toutes ces choses, nous allons apprendre chacune d'elles étape par étape
. Donc, pour résumer rapidement, module est un morceau de code
qui exécute une tâche spécifique. Nous pouvons les stocker
dans des fichiers séparés, puis nous pouvons les utiliser
dans d'autres fichiers. Dans la leçon suivante, nous allons créer notre propre module.
9. Créer son propre module: Créons notre
propre module personnalisé. Ici, dans notre application, nous créons un nouveau fichier appelé
math operations point js. Dans ce module, nous allons ajouter des
opérations mathématiques de base, puis réutiliser dans notre fichier d'
index principal point js. Donc, tout d'abord,
créons une nouvelle fonction appelée AD et passons ici deux
paramètres appelés A et B. Et dans cette fonction, nous avons simplement écrit l'addition de ces deux
paramètres, A plus B. Vous vous demandez peut-être comment utiliser cette fonction dans
notre fichier index point js ? Parce que nous savons tous que lorsque nous définissons une fonction dans un fichier, nous ne pouvons l'utiliser que dans ce fichier, pas en dehors du fichier. Donc, pour utiliser cette
fonction publicitaire dans un autre fichier, nous devons exporter cette fonction depuis ce module d'
opérations mathématiques, puis nous pouvons l'importer dans
le fichier index point js. Mais avant cela,
laissez-moi vous montrer quelque chose. Ainsi, dans nodejs, tous les fichiers ont un objet appelé dans
cet objet de module, nous avons de nombreuses
propriétés qui donnent informations sur ce module
en particulier Laissez-moi vous le montrer de
façon pratique. Après cette fonction,
nous écrivons simplement journal des points de
la console et imprimons
ici l'objet du module. Nous devons maintenant exécuter ce
module d'opérations mathématiques. Ouvrez donc le terminal et écrivez node, math, et appuyez sur Tab. Il complétera automatiquement
le nom du fichier. voyez, nous obtenons ici cet objet de module avec
un tas de propriétés. Le premier est l'ID, qui est l'
identifiant unique du module. Ensuite, nous avons le chemin, qui est le
parcours complet de notre projet. Après cela, nous avons l'export et
il est défini sur un objet vide. Vous devinez correctement, si nous
voulons exporter une fonction d'ajout, nous devons ajouter leur
fonction dans cet objet d'exportation. Après cela, nous avons le nom du fichier
actuel avec le chemin complet et un tas
d'autres propriétés. Maintenant, comment pouvons-nous ajouter une fonction dans
cet objet d'exportation ? C'est vraiment simple. Nous écrivons donc ici le module
dot exports dot add, dont le nom de propriété est
égal à add function. Assurez-vous que nous n'appelons pas
ici la fonction d'ajout. Nous ajoutons simplement ici le nom de la fonction. Je sais que vous trouvez cela
un peu confus, mais croyez-moi, ce n'est pas le cas. Laisse-moi te montrer
ça. Il suffit donc de déplacer ce journal de points de console sous
ce module d'exportation de points. Enregistrez ce fichier, et
dans le terminal, nous exécutons à nouveau ce fichier. Vous pouvez voir dans l'objet d'
exportation que nous avons une propriété d'ajout et
qu'elle est configurée pour ajouter une fonction. Donc, si vous confondez par
le même nom de propriété, nous pouvons également modifier ici nom de la
propriété, par exemple en ajoutant des numéros. Enregistrez ce fichier et exécutons-le de
nouveau. voyez, ici, nous obtenons le nom de la propriété des numéros d'
annonce pour ajouter une fonction. Désormais, nous pouvons également exporter plusieurs fonctions
depuis le module. Nous créons donc ici une autre
fonction appelée sous-piste. Encore une fois, nous avons besoin de
deux paramètres, A et B, et dans
cette fonction, nous renvoyons simplement A moins B. Maintenant, pouvez-vous me dire
comment exporter cette fonction ? Bien, nous écrivons simplement ici module dot exports dot subtract égal à notre fonction de
soustraction Voyez si cela change
et jetez-y un coup d'œil. Exécutons à nouveau ce fichier. voyez, ici, nous obtenons cette nouvelle propriété soustrait
à notre fonction abstraite De plus, il n'est pas nécessaire que nous puissions uniquement exporter des fonctions
depuis notre module. Nous pouvons également exporter des variables, des objets
ou des tableaux, essentiellement tout ce que nous voulons. Supposons qu'en haut, nous créions une variable
appelée name. Égal au code
plus U et à une autre variable, chiffre
porte-bonheur est égal
à, disons, sept. Maintenant, si nous voulons exporter
uniquement la variable name, nous ne
pouvons ajouter ici que module point exporte le
nom du point égal au nom. Nous n'avons pas besoin d'exporter
la deuxième variable si nous ne voulons pas l'
utiliser dans un autre fichier. Exportez uniquement les variables
ou
les fonctions que nous devons utiliser
ailleurs dans notre application. Maintenant, voici une chose. Ces trois lignes de
code semblent un peu moches car nous répétons les exportations par points des
modules. Existe-t-il un raccourci
pour écrire ceci ? Oui, laisse-moi te montrer. Nous pouvons donc écrire ici
quelque chose comme ça. Le module dot exports est égal à, et ici nous passons l'objet et ajoutons toutes les propriétés que nous
voulons exporter dans cet objet unique. Nous écrivons, ajoutons,
refroidissons, fonctionnons, ajoutons
une autre propriété,
sous-empilons une fonction deux-points, sous-pile et nous pouvons définir le
nom du nom de la variable Ce code et ces trois
lignes de code fonctionnent de la même manière car nous
définissons ici les propriétés une par une. Mais ici, nous les
mettons directement en objet. Supprimons ces trois
lignes. Nous n'en avons pas besoin. Enregistrez ce fichier.
Effacons le terminal à l'aide de CLS, puis exécutons le même fichier et voyons ici que nous obtenons le même objet
d'exportation qu'auparavant Donc, si nous savons quand nom de
notre propriété et
le nom de la valeur transmise sont identiques, nous pouvons supprimer cette
colonne et le nom de cette variable. Cet ajout signifie donc
ajouter une colonne. la même manière que nous supprimons ce soustract de colonne
et également le nom de colonne Il existe donc plusieurs manières
d'écrire le même code. Sauvegardez-le et
exécutons-le une fois de plus. Ici, nous obtenons à nouveau
le même objet d'exportation. Nous avons maintenant des propriétés dans
l'objet d'exportation et nous pouvons accéder à cet objet d'exportation dans n'importe quel autre fichier
de ce projet, comme nous le verrons
dans la prochaine leçon.
10. Accéder à un module dans un autre module: Dans la
leçon précédente, nous avons créé notre module d'opérons mathématiques et avons
exporté trois propriétés Permettez-moi également de supprimer cette
ligne de console. Nous n'en avons pas besoin. Voyons maintenant comment accéder à ces propriétés dans
le fichier JS du point d'index ou dans tout autre fichier. Supprimons ce code précédent. Nous n'en voulons pas. Maintenant, pour
importer n'importe quel module dans notre fichier, nous avons besoin de
la fonction dans le nœud Js. Nous appelons cette fonction ici et à l'intérieur de cette
fonction dans les codes, nous allons entrer le chemin de notre module. Comme nous pouvons le voir, ces deux
fichiers se trouvent dans le même dossier, nous pouvons
donc écrire ici une barre
oblique point-avant, qui représente le dossier actuel Et ici, nous écrivons le nom de notre fichier, les opérations mathématiques point js. Ou nous pouvons également supprimer
cette extension point js car si nous ne transmettons pas
l'extension avec le nom de notre module, alors par défaut, nodejs
prendra point js comme Et si nous avions ce fichier d'
opérations mathématiques dans un sous-dossier ? Ensuite, nous devons d'abord écrire
ici le nom du dossier, puis nous ajoutons le nom du fichier barre oblique Et si nous avons ce
module d'opérations mathématiques dans le dossier parent, alors ici, à la
place du point unique, nous utiliserons le double point Ne vous inquiétez pas avec la pratique,
vous l'apprendrez. Pour l'instant, il suffit d'écrire les opérations mathématiques avec barre
oblique. Cette fonction obligatoire
return exporte l'objet depuis ce module que nous obtenons ici interminal.
Laisse-moi te montrer. Ici, nous stockons cette valeur dans une variable appelée opérations mathématiques. Vous pouvez prendre n'importe quel autre nom, mais la plupart du temps, nous utilisons le
même nom que ce module. Nous n'avons donc pas besoin de nous
souvenir d'un autre nom, nous n'avons
donc pas besoin de nous
souvenir d'un autre nom. Ici, nous analysons simplement les opérations mathématiques du journal des
points, enregistrons les modifications et nous pouvons
maintenant exécuter ce fichier d'
index point js Le point d'index du nœud est. voyez, nous obtenons ici l'objet avec ces trois propriétés
que nous avons ajoutées dans l'objet d'exportation
dans Mth Operations Ici, à la place des opérations mathématiques
simples, nous pouvons faire des méthoperons point AD Et ici, nous passons des arguments, disons 20 et 30. Sauvegardez-les et
exécutons à nouveau ce fichier. Vous voyez, ici, nous obtenons l'
addition de deux nombres. Nous avons donc utilisé avec succès une
fonction d'un autre module. Vous pouvez voir à quel point il est simple de créer un module et de l'
utiliser dans d'autres fichiers. Il suffit d'exporter à
partir de ce module, puis avec require, nous pouvons utiliser ces exportations
dans n'importe quel autre fichier. Nous pouvons donc utiliser d'autres
propriétés comme methoperons point Substack
ou methoperons Mais nous pouvons voir que lorsque nous devons utiliser l'une de
ces propriétés,
nous devons écrire ce point d' opérations
mathématiques. Nous pouvons donc utiliser ici le sujet
Javascript appelé déstructuration d'objets Vous le savez probablement car il s'agit d'un
pur sujet Javascript. Mais voyons rapidement ceci. Nous écrivons donc ici notre objet et nous voulons extraire ses
propriétés sous forme de variables. Donc, à la place du point de
méthopérons AD, il suffit d'écrire EdD Donc, au début,
nous écrivons C maintenant ici, nous devons utiliser des crochets
égaux au nom de notre objet, qui est une opération mathématique Maintenant, pouvez-vous imaginer ce que nous avons à écrire entre crochets ? Nous devons écrire ici le nom
des propriétés, que nous voulons extraire de
cet objet sous forme de variable. Nous écrivons ici add,
qui est notre fonction, soustract, qui est
une autre fonction, name, qui est notre variable Maintenant, à la place de cette annonce à points sur les opérations
mathématiques, nous pouvons simplement utiliser cet ajout et
nous pouvons également ajouter ici le nom. Enregistrez ce fichier et
exécutons-le dans notre terminal. Vous voyez, ici, nous en avons
50 et notre nom. De plus, au lieu de restructurer les
objets
dans une autre ligne, certains développeurs expérimentés aiment faire dans la même ligne requise. Ils ont donc simplement obtenu
cet objet d'ici et l'ont simplement collé à la place du nom de cette opération
mathématique. Nous n'avons donc pas besoin de
cette ligne supplémentaire, sauvegardez ce fichier et
exécutons-le à nouveau. Vous voyez, nous obtenons ici
le même résultat. Si vous êtes confus dans cette manière de structurer les
objectifs, vous pouvez simplement utiliser les
opérations mathématiques par points et C'est totalement bon. En
fin de compte, notre code devrait fonctionner.
11. Exercice pour son propre module: Il est maintenant temps de faire
un peu d'exercice, afin que vous puissiez réviser les modules. Ici, vous devez créer un nouveau module dans votre
application appelé Logger Et à l'intérieur de celui-ci, vous
devez exporter deux fonctions. Une fonction renverra date
actuelle avec
cette expression, et une autre fonction renverra l'année
en cours avec
cette expression. Ensuite, vous devez configurer
ce résultat dans le fichier JS à points d'
index, comme nous le faisons dans le module
des opérations mathématiques, et notre sortie devrait
ressembler à ceci, essayez-le puis
observez la solution. J'espère donc que vous aurez terminé cet exercice ou du moins que vous
essayerez de le résoudre. Voyons maintenant la solution. Tout d'abord, nous créons un nouveau
fichier appelé logger point js. Ici, nous devons
ajouter deux fonctions. La première fonction
est donc la date actuelle, et dans le crochet GLY,
nous renvoyons simplement le nouveau
point de date à deux chaînes temporelles. Maintenant, dupliquons
cette fonction, sélectionnons-la et appuyons sur
Shift plus Alter plus flèche vers le bas ou Shift
plus Option plus flèche bas. Remplaçons le nom de la
fonction par année en
cours et au
lieu de deux chaînes temporelles, nous écrivons get full year. Maintenant, vous souvenez-vous de la façon dont
nous exportons ces fonctions ? Nous utilisons le module point exports, et ici nous le définissons simplement sur object et
à l'intérieur, nous écrivons la date actuelle à la date actuelle et la fonction de l'année en cours
à l'année en cours. Ou nous pouvons les simplifier en
supprimant le même nom. Génial. Nous exportons donc
ces fonctions. Il ne nous reste plus qu'à saisir ces fonctions dans notre fichier JS à points d'
index. Donc, en haut, nous ajoutons la fonction
requise et
passons simplement ici le chemin de notre module, qui est une
barre oblique, car ce module se trouve également dans le
même dossier et le même enregistreur Nous pouvons maintenant stocker sa valeur d'exportation dans
une variable appelée logger Ou comme nous l'avons fait dans la leçon précédente, nous pouvons le déstructurer de cette façon Ajoutez donc ici les calibres
et voyez ici nous obtenons les propriétés de la date
actuelle et de l'année en cours. Maintenant, après cette console, nous ajoutons une autre console et appelons
simplement ici les deux
fonctions une par une, date
en cours et année en cours. Enregistrez les modifications et exécutons ce fichier
dans le terminal. C'est une chaise d'index de nœuds, et vous voyez ici que nous obtenons notre résultat. Vous pouvez donc voir à quel point il est
simple et facile de créer nos propres modules et d'y
accéder dans d'autres modules.
12. Utiliser le module Path: Donc, jusqu'à présent, nous avons vu
comment travailler avec des modules locaux. Voyons maintenant quelques
modules de base ou nous pouvons dire des modules déjà
disponibles dans le nœud JS. Rendez-vous donc sur nodjs.org,
et à partir de l'en-tête,
ouvrez sa documentation Assurez-vous ici de sélectionner une
autre version et sélectionner la version Ts car
il s'agit de la version stable. Ici, nous obtenons toutes les
informations sur le nœud JS, comme un objet simple, une console. De plus, nous avons
expliqué de nombreux sujets et comment les utiliser. Nous avons des modules de base
comme le système de fichiers. Ils y expliquent toutes
ses méthodes et propriétés. Nous avons également un module STP, un module
OS, un module path et bien plus encore Nous verrons ici quelques modules de base
importants dont nous avons besoin pour
créer notre backend. Si vous souhaitez tout
apprendre, vous pouvez lire
cette documentation. Mais dans ma suggestion, je vais
couvrir tous les modules importants. Commençons par le module Path. Le module Path est utilisé pour travailler avec les chemins de fichiers et de
répertoires. Par exemple, lorsque nous voulons stocker une image téléchargée
sur notre serveur, en
utilisant ce module de chemin, nous pouvons donner à cette image chemin
approprié pour l'
enregistrer dans un dossier spécifique. Donc, si vous souhaitez fusionner deux chemins ou d'autres éléments liés aux
chemins, vous pouvez utiliser ce
module de chemin. Laissez-moi vous le montrer. Vous pouvez également le voir ici, ils nous montrent comment accéder à ce module
dans notre application. De la même manière que nous
accédons à nos modules locaux dans
la fonction requise. Mais à la place du chemin du fichier, nous écrivons le nom de notre module. Dans notre application,
je supprime donc simplement ce code. Nous n'en avons pas besoin maintenant,
nous écrivons require function, et dans les codes, nous écrivons colonne du
nœud et le nom de notre
module principal, qui est path. Dans la version précédente du nœud, nous écrivions simplement le nom du module
principal sans le préfixe de colonne du nœud Cela fonctionnera également
dans la version actuelle. J'utilise cette syntaxe précédente, vous pouvez utiliser n'importe quelle syntaxe, c'est à vous de décider. Maintenant, comme avant, cette fonction requise
écrite exporte un objet depuis ce module de chemin. Nous devons les stocker
dans un chemin variable. Vous vous demandez peut-être pourquoi
nous ne déstructurons pas
ici cet objet comme
nous le faisions auparavant Oui, nous pouvons faire de même ici, mais nous ne connaissons pas encore
ses propriétés. Il vaut donc mieux ne pas
déstructurer ici. Maintenant, laissez-moi vous montrer quelques méthodes
utiles du module path. Supposons que nous voulions voir des informations
sur un fichier spécifique. Nous avons donc ici la méthode d'analyse par
points de chemin, et dans cette fonction d'analyse, comment transmettre le
chemin complet de notre fichier Mais comment pouvons-nous obtenir le chemin
complet de notre fichier ? Ainsi, dans node js, nous avons
vu précédemment que tous les fichiers avaient un objet
module, nous utilisons comme
module dot exports. De plus, tous les fichiers ont deux
autres variables. L'un est le nom du fichier de
soulignement, qui renvoie le chemin complet du fichier actuel, et
le trait de soulignement Dname, qui est le chemin du
répertoire Permettez-moi de vous montrer ces deux d'abord. Donc pour l'instant, je commente cette méthode de phase de chemin et je consol
rapidement le journal des points, le
soulignement, le journal des points de la console
Dname, Underscrendscre,
le nom du fichier cette méthode de phase de chemin et je consol
rapidement le journal des points, le
soulignement, le journal des points de la console
Dname, Underscrendscre,
le nom du fichier. Enregistrez les modifications et
exécutons ce fichier. Vous voyez, ici nous obtenons le chemin complet
du répertoire actuel. Répertoire signifie dossier, et dessous pour
Underscore DesceFileName, nous avons le chemin
complet Revenons maintenant à notre fichier, nous supprimons cette console
et supprimons les commentaires
d'ici en utilisant Control plus slash
ou Command plus
slash . Dans
cette fonction d'analyse, nous
passons simplement le nom du fichier Underscredsc Nous obtenons quelques détails sur ce chemin de fichier et
pour imprimer le résultat, il suffit de l'envelopper dans le journal
à points de la console. Bien, enregistrez les modifications et exécutons ce fichier. Vous voyez, nous avons ici cet objet. Tout d'abord, nous obtenons la propriété root, qui est le chemin racine
du chemin actuel. Ici, dans Windows, nous avons
C deux-points, barre oblique inversée. Si vous utilisez Mac ou Linux, vous obtiendrez
ici une barre oblique Ensuite, nous avons DR, qui est le
chemin du répertoire, après cela, nous avons la base, qui est la
dernière partie de ce chemin, qui est le point d'index Js. Ensuite, nous avons EXT
pour l'extension et enfin, nous obtenons le nom de la dernière
partie, qui est index. Cette méthode parch est utilisée pour
obtenir des détails sur
le chemin spécifique Voyons maintenant une
autre méthode utile module
de chemin qui est la jointure. Supposons que dans notre base de données, nous voulions stocker le
chemin où nous
stockons notre image téléchargée,
comme une photo de profil. Notez ces photos de
profil dans dossier appelé téléchargements
dans Ici, nous pouvons utiliser la méthode path
point join. Dans un premier temps, nous avons besoin
du chemin du projet en cours, et comment pouvons-nous obtenir
ce chemin de dossier ? Devons-nous utiliser le nom du fichier de
soulignement ? Non, nous devons utiliser un
underscore undisco dirname. Au deuxième argument, nous
transmettrons le nom de notre dossier
qui est uploads Nous obtiendrons le chemin de notre dossier de
projet et nous rejoindrons le dossier
Uploads à la fin de ce chemin de projet.
Voyez ce que nous obtenons. Nous supprimons cette console
et stockons ce chemin dans une variable appelée chemin du profil et la console enregistre
ce chemin de profil par point. Enregistrez ce fichier et
exécutons-le. Vous voyez, ici, nous avons le chemin complet. Cette première partie est
soulignée,
mon cher nom, et nous rejoignons le dossier
Uploads à Je sais que c'est un
peu confus, mais ne vous inquiétez pas lorsque nous utiliserons
ces modules dans notre projet, tout
cela aura du sens. Maintenant, vous vous demandez peut-être si nous
pouvons joindre deux parties manuellement ? Pourquoi devons-nous utiliser
votre module de chemin ? Comme nous le savons, pour un chemin de fichier, Windows utilise une barre oblique inversée, et les utilisateurs Mac et Linux
utilisent une barre oblique avant Nous obtenons donc des résultats
différents selon le système. Si nous écrivons manuellement le chemin
avec une barre oblique inversée, ne pouvons pas
trouver notre chemin sur Mac De plus, actuellement, notre
projet est disponible localement, et c'est pourquoi nous
connaissons son évolution. Mais dans le monde réel, nous déployons
notre application principale quelque part sur Internet et nous ne connaissons pas le
chemin d'accès à ce serveur Ce module de chemin est donc très utile dans ce
type de situation.
13. Obtenir les détails de votre système d'exploitation: Parfois, nous avons besoin
de certains détails sur le système d'exploitation de notre serveur comme le
système d'exploitation
qu'il utilise ou la quantité de mémoire dont il dispose, etc. Pour cela, nous avons un autre module de
base appelé OS, qui signifie système d'exploitation. Nous supprimons donc ce code précédent, et pouvez-vous me dire comment accéder à ce système
d'exploitation ? Bien, nous pouvons l'utiliser par fonction
require et simplement
passer ici le nœud, la colonne OS. Nous ne pouvons utiliser que le système d'exploitation. Nous pouvons maintenant le stocker
dans une variable appelée OS. Supposons ici que nous voulions exécuter un code spécifique pour
le système Windows et pour Mac, nous voulions exécuter autre chose. Ici, nous pouvons écrire si la
condition est un point de plate-forme, cela renverra
le nom de la plate-forme sur laquelle ce code est exécuté. Si st platform est égal à win 32, si c'est vrai, alors nous
exécuterons le code pour Windows. Pour l'instant, nous écrivons simplement point
console Log,
hello, Windowsser Après cela, nous voulons exécuter du
code pour le système Mac. Nous ajoutons s et vérifions que
la plateforme point est égale à Dawn. Il s'agit du
nom de la plateforme pour macOS. À l'intérieur de celui-ci, nous exécutons le journal
point de la console, hello McUser. Enfin, nous passons simplement ls
et Consol point log Hellouser. Vérifiez que cela fonctionne ou non. Regardez les modifications et jetez-y un coup d'œil. Vous voyez, nous avons ici Hello Windows
user, donc ça marche. Maintenant, dans le module OS, nous avons beaucoup plus de propriétés. Je ne veux pas
vous ennuyer en expliquant toutes les propriétés, car cela
prendra beaucoup de temps. Mais laissez-moi vous expliquer deux autres propriétés
utiles du module OS. Tout d'abord, nous pouvons
obtenir la mémoire totale du système d'exploitation à
l'aide de ce module OS. Donc, le nombre total de points est de MM pour la mémoire, et nous pouvons simplement
les imprimer à l'aide du journal des points de la console. Nous avons également une autre propriété appelée free MM pour
obtenir de la mémoire libre. Nous dupliquons donc cette ligne
en utilisant Shift plus alter, plus flèche vers le bas ou
Shift plus option, plus flèche bas et changeons cette
fonction MM totale avec FreeMM Enregistrez les modifications
et jetez-y un œil. Vous voyez, ici, nous avons de
la mémoire en petits morceaux. J'ai huit Go de
mémoire totale et la mémoire libre est de près de deux Go. Vous pouvez voir l'
importance de node js. Avant node js, en utilisant du JavaScript
simple, nous ne pouvions pas obtenir ce
type de détails. C'est ainsi que le module OS est utilisé pour obtenir
des informations sur le système d'exploitation.
14. Module de système de fichiers: Il existe un autre module de base
populaire que nous utilisons pour
interagir avec des fichiers. Par exemple, avec le
système de fichiers ou le module FS, nous pouvons écrire le
fichier, le lire , le
mettre à jour et également supprimer un fichier spécifique. Donc, ici, dans la
documentation du nœud, nous ouvrons le module du système de fichiers. Nous pouvons voir qu'il possède tellement de
méthodes et de propriétés. Permettez-moi de vous montrer comment
nous pouvons utiliser le module FS. Supprimons ce
code précédent. Ne t'inquiète pas J'ajouterai tout ce code dans un fichier séparé afin que vous
puissiez le consulter plus tard. Ici, nous voulons
accéder au module principal, besoin du code Fs, et nous le
stockons dans une variable appelée Fs. Maintenant, nous écrivons simplement Fs point et voyons ici que nous obtenons
la liste de toutes les méthodes. Mais c'est quoi ça ? Toutes ces
méthodes comportent deux variantes. L'une concerne les méthodes synchrones
ou bloquantes, et l'autre est sans mot clé ce qui signifie asynchrone Maintenant, comme nous le savons, le nœud
est populaire en raison de sa méthode asynchrone
ou non bloquante Nous devons toujours utiliser des méthodes
asynchrones dans node js. Les nœuds nous offrent une
méthode synchrone pour plus de simplicité. Laissez-moi vous montrer les deux, un par un. Ici, nous voulons obtenir la liste des fichiers que nous avons
dans le dossier actuel. Pour cela, nous avons une méthode
appelée read directory sync, et nous passons ici le chemin du répertoire que
nous voulons lire. Point slash qui est
le répertoire actuel, et nous stockons ces données
dans une variable appelée data Et à la fin, nous enregistrons
simplement ces données. Enregistrez les modifications et
voyons ce que nous obtenons ici. voyez, nous avons ici la liste de tous les fichiers contenus dans ce dossier. Voyons maintenant également comment
utiliser la méthode Asynrns. Donc, en tant que répertoire à points rouges, et comme précédemment, à
la première position, nous passons le chemin de notre répertoire, qui est une barre oblique Maintenant, dans presque toutes les méthodes asynchrones, vous devez passer le deuxième argument, qui est la fonction de rappel, qui est la fonction exécutée lorsque ce travail asynchrone sera terminé. Et cela se voit également dans
les suggestions. Il existe maintenant deux possibilités pour tous les travaux asynchrones Nous recevons un message d'erreur ou nous terminons ce travail
avec succès. Je sais que cela peut être un
peu déroutant si vous avez affaire à du travail
asynchrone par rapport au temps, mais ne vous inquiétez pas dans les sections
à venir, j'ai une section complète pour le JavaScript
asynchrone Vous apprendrez tout
cela en profondeur. Maintenant, dans cette fonction,
à la première position, nous obtenons une erreur, et
au deuxième paramètre,
nous obtenons nos données. Si nous obtenons une erreur, ces données sont nulles. Et si nous obtenons nos données, cette erreur devient nulle. Donc, pour gérer ce scénario, nous pouvons passer son état. Si une erreur est disponible, nous l'enregistrerons. Comme nous allons le faire sur la console, n'enregistrez
pas nos données. C'est aussi simple que ça. Commentons maintenant cette console
pour la méthode synchrone. Enregistrez les modifications
et jetez-y un œil. Vous voyez, ici nous obtenons
à nouveau les mêmes données. Maintenant, si vous voulez vérifier, nous obtenons une erreur ou non, alors nous pouvons changer ce
chemin en un autre, enregistrer et réexécuter
ce fichier. voyez, ici nous obtenons une erreur, aucun fichier ou répertoire de ce type. Vous comprenez maintenant comment fonctionnent
ces méthodes de course. De plus, ne vous
inquiétez pas de cette complexité car nous n'utilisons pratiquement pas ces modules de
base dans notre projet. Actuellement, je ne
vous montre que des modules, et ce module de fichier est peu
avancé pour cette étape. Donc, ne t'inquiète pas pour
ça. Vous le maîtriserez lorsque nous les utiliserons
dans nos projets.
15. Créer un serveur à l'aide du module HTTP: Voyons l'un des
modules de base les plus importants du nœud JS, qui est le module SDTP Le module SDDP nous permet de créer un serveur SDDP et également de gérer différents SDDPRQuest Comme nous le savons, NodeJS est utilisé créer un backend pour notre application
cliente,
mais actuellement, nous n'
accédons à ce backend
que accédons à ce backend Et si notre front end veut accéder
à notre back-end ? Donc, pour interagir avec le Web dans le nœud, nous avons le module SDDP. Permettez-moi de vous montrer rectiquement
comment nous pouvons créer un serveur. Comme avant, accédez au module
STDP à l'aide de la fonction
requise transmettez ici le SDDP et stockez-le dans une
variable appelée Maintenant, pouvez-vous me dire ce qu'est écrit
ce module STDP ? Je vais retourner la méthode SDDB. Maintenant, ce STDP a
une méthode appelée Create server qui est utilisée pour
créer un serveur pour notre application
principale. Maintenant, qu'allons-nous transmettre dans
cette fonction de création de serveur ? Simplement, nous passons ici la fonction de
rappel. Lorsque quelqu'un envoie
des demandes à notre serveur, cette fonction de rappel s'exécute Permettez-moi de vous demander
quelque chose. Quel est le travail principal de notre serveur ? Ainsi, lorsque l'utilisateur envoie
une demande au serveur, serveur doit renvoyer une réponse en
fonction de la demande de données. Dans notre fonction de serveur,
nous avons donc besoin d'informations
sur la demande de
l'utilisateur, sur l'API qu'il
demande, etc. Donc, ici, dans cet argument de
fonction, nous obtenons l'objet de la requête, qui est le détail de la
demande de l'utilisateur. Nous avons maintenant ici des
informations sur la demande. Notre serveur suit donc son
processus et
supposons que nous voulions renvoyer la réponse
sous forme de message Hello World. Pour envoyer une réponse ici
dans l'argument de la fonction, nous obtenons ici l'objet de réponse
après cet objet de requête. De plus, de nombreux développeurs
aiment écrire un nom court, Rg pour la demande et
Rs pour la réponse Maintenant, pour renvoyer
le message Hello world, nous écrivons le
point de réponse R. Et dans les codes, nous transmettons notre message Hello world. Dans le monde réel, nous allons
renvoyer les données à partir d'ici, pour le moment nous écrivons simplement message lorsque quelqu'un envoie
une demande sur le serveur. Et là, nous devons également dire que cette
réponse s'arrête là. Nous écrivons donc le point de réponse N. Cela garantira que notre processus de
réponse est terminé ici. Maintenant, nous créons notre serveur, mais nous devons démarrer ce
serveur sur un port. Si vous ne réagissez pas, notre
application s'exécutera sur hôte
local 5173 si
elle est créée par y. Maintenant, nous devons démarrer ce serveur sur un port Voyons comment nous pouvons le faire. Ici, ce point étape
crée une méthode serveur, renvoie notre objet serveur, nous le stockons dans une variable
appelée serveur Et après cela, en bas, nous écrivons le point serveur LISN. Et dans cette fonction, nous transmettrons le port sur lequel nous voulons
démarrer ce serveur. De nombreux développeurs aiment exécuter un
serveur sur 5 000 ou 3 000. Mais vous pouvez indiquer n'importe quel port, assurez-vous que ce port
n'est pas utilisé dans votre système. Ici, j'aime bien en utiliser 3 000. Dans le monde réel, lorsque
nous déployons notre serveur, ce
port est remplacé
par notre nom de domaine Bend, comme catwis.com ou tasrag
dotben.com De plus, dans cette fonction, nous pouvons passer une autre fonction de
rappel Cette fonction sera exécutée lorsque notre serveur
démarrera avec succès. Ici, nous écrivons simplement Consol Dot Log Server Start
Listening sur le port 3 000 Enregistrez les modifications et exécutons ce code, car sans
ce code, serveur créera un index de
nœuds point js. Vous voyez, ici, le serveur commence à
écouter sur le port 3 000. Si vous utilisez un Mac et que
vous utilisez le port 5 000, il se peut que vous obteniez une erreur car le port
5 000 est déjà utilisé, car sur Mac enquêtes sur les récepteurs
ARP
s'exécutent sur ce port Vous pouvez utiliser un autre port tel que 5 001, 5 002, ou vous pouvez
même utiliser 3 n'existe aucune règle concernant le
numéro de port tant que le port est déjà utilisé par un autre
service de notre système. Maintenant, pour vérifier cela, nous devons
envoyer des requêtes sur ce port. Ouvrez donc un navigateur et écrivez
simplement ici l'URL, colonne 3 000 de l'hôte
local
ou votre numéro de port. Vous voyez, nous avons reçu notre
message, Hello World. Nous avons donc réussi à créer notre serveur et
à démarrer ce serveur. Ainsi, chaque fois que quelqu'un envoie des
demandes sur le serveur, cette fonction s'exécute et imprime ce message aussi
simplement que cela.
16. Comment gérer différentes routes: Actuellement, nous envoyons des demandes sur la route du
port, c'
est-à-dire la route d'origine. Mais dans le monde réel, l'utilisateur
peut envoyer des demandes à hôte
local Colonne 3 000, slash
About ou slash products Nous devons donc également gérer ces différents
itinéraires sur notre serveur. Et pour gérer
différents itinéraires,
nous avons d'abord besoin d'informations pour quel
itinéraire l'utilisateur envoie une demande. Et pour cela, j'ai
ici l'objet de la demande. Nous écrivons ici la
condition que je demande une URL à
points égale à en
codes, barre oblique Cette simple barre oblique
représente l'itinéraire racine. Entre crochets CL, nous pouvons simplement déplacer cette
fonction d'écriture par points de réponse en maintenant la touche « alter ou « option » et la flèche vers le haut Après cela, nous voulons nous occuper,
disons, de l'itinéraire. Nous ajoutons donc ici si request point URL égale à in codes about
et si c'est vrai, renvoyons simplement un autre point de réponse au
message à droite. C'est une question de route. Ainsi, nous pouvons ajouter
autant de demandes que nous le souhaitons. Et après tous les itinéraires,
nous passerons, ce qui signifie que les utilisateurs passeront des itinéraires, ce qui n'est pas traité ici. Et c'est pourquoi nous renvoyons ici une réponse
simple point
droit, itinéraire introuvable. Assurez-vous également que cette fonction de point de
réponse appelée à la toute fin
de ce serveur fonctionne. Enregistrez les modifications et
retournez dans notre navigateur. Si nous changeons notre
URL en slash about, pouvez-vous me dire ce que nous
obtiendrons ici ? Voyons voir. voyez, ici, nous recevons le
même message Hello World parce que dans notre terminal, notre ancien code
fonctionne
toujours dans lequel nous
ne gérions pas les routes. Pour exécuter ce nouveau code, nous
devons exécuter à nouveau
notre application. Dans le terminal, nous
allons d'abord arrêter l'application en appuyant sur Ctrl plus C
sous Windows et Mac à la fois. Ensuite, nous
exécutons à nouveau node index point js. Bien, nous arrivons ici, les serveurs commencent à écouter sur le port, et dans le navigateur, si nous
actualisons notre page, voyez, maintenant nous recevons un message ici. C'est une question de route. Et si nous essayons de demander
d'autres itinéraires, nous obtenons ici un
itinéraire introuvable. C'est ainsi que nous gérons les
différentes routes d'API à l'aide du module SGDP Imaginez maintenant que nous avons 20 routes d'API différentes
et que pour les gérer, nous devons écrire
18 blocs sf supplémentaires. Et si tous ces itinéraires comportent
des centaines de signes de code, la gestion de notre propre serveur
deviendra tellement compliquée. Donc, dans le monde réel, nous
n'utiliserons pas ce module SDDP. Ou le fait que nous ayons un module
tiers très populaire appelé Express et Express présente bien plus d'avantages
que ce module SDTP De plus, en utilisant Express, nous pouvons diviser nos itinéraires
dans différents fichiers, afin de ne pas nous tromper
lorsque nous devons apporter des mises à jour
ou lorsque nous voulons
ajouter de nouvelles fonctionnalités. J'explique tous ces modules afin que vous compreniez mal fonctionnement du
nœud et que vous vous
familiarisiez avec une certaine syntaxe
JavaScript. J'espère que cette section vous plaira, à bientôt dans la section suivante.
17. Section 03 - Introduction aux NPM: Accédez à la troisième section
des scores ultimes de node JS. Dans cette petite section amusante, nous verrons tout sur le gestionnaire de paquets de
nœuds ou en bref sur NPM Alors, qu'est-ce que le gestionnaire de packages Node ? Le gestionnaire de packages Node est
un outil qui nous aide à gérer les packages ou les bibliothèques
pour notre projet de nœud. En termes simples, NPM est comme un grand entrepôt
pour les développeurs Dans cet entrepôt, les développeurs stockent leur code JavaScript afin que
d'autres développeurs puissent le
rechercher et télécharger le
code réutilisable dans leur projet. Laisse-moi te montrer ça.
Alors dirigez-vous vers NPM. JS.com. Ici, nous pouvons rechercher le nom de
notre package ou de notre bibliothèque. Package ou bibliothèque signifie
un morceau de code réutilisable. Par exemple, dans la section
précédente, je vous ai dit que nous utiliserons Express Library pour
créer un serveur STD Vous voyez, nous obtenons ici de nombreux
résultats pour cette recherche. Nous ouvrons simplement ce package
Express. Sur le côté gauche, nous trouvons la documentation de base, comment l'utiliser, etc.,
et sur le côté droit, nous obtenons informations sur le package Tout d'abord, en haut,
nous avons la commande d'installation, que vous verrez dans la
prochaine leçon. Ensuite, nous avons le lien
du dépôt Github afin que nous puissions voir le code et également obtenir le lien
de leur site officiel Ici, nous pouvons voir que ce sont les téléchargements mensuels
de ce package. Nous pouvons ainsi constater la
popularité de ce package. Nous obtenons également des informations de version
et bien d'autres choses encore. Ainsi, sur NPM, nous obtenons des packages pour presque toutes les fonctionnalités que nous voulons ajouter à
notre application Et ce qui est étonnant, c'est que
tous ces packages
peuvent être utilisés gratuitement. Il existe donc des forfaits premium, mais il est rare que nous
achetions des forfaits. En fait, je n'ai acheté
aucun forfait jusqu'à présent. Dans cette section, nous verrons donc des commandes expliquant comment installer
différents packages. Vous avez également désinstallé des packages,
installé la dépendance du développeur, à jour certains packages, etc. Ainsi, grâce à cette petite section, vous vous familiariserez avec les commandes
NPM et vous ne vous
y tromperez pas. Ils sont extrêmement
simples et faciles à utiliser. Commençons donc cette section.
18. Créer un paquet: Ainsi que nous l'avons vu dans la leçon précédente, nous utilisons autant de packages que
nous le voulons dans notre projet. Maintenant, lorsque nous installons un package, ce package contient un tas
de fichiers et de dossiers, que nous téléchargerons
dans notre projet et que nous
stockerons dans un dossier
appelé Node Modules. Imaginez maintenant que nous installons dix ou 20 packages
dans notre application. Tous ces fichiers seront stockés
dans le dossier des modules de ce nœud. Lorsque nous voulons
partager notre projet ou que nous voulons télécharger
notre projet sur Github, nous ne
téléchargeons pas ce dossier de
modules de nœuds car cela
augmentera la taille du projet et le nombre de fichiers Nous ne téléchargeons donc pas le dossier des modules de
nœuds. Vous pouvez maintenant vous demander si nous ne
partageons pas ce
dossier de modules de nœuds avec quelqu'un, comment celui-ci sait quels packages
il doit installer. Pour résoudre ce problème
dans notre projet de nœud, nous allons créer un fichier
appelé package point JCN Dans ce fichier, les nœuds stockent toutes les informations principales
concernant notre projet. Ainsi, chaque fois que nous commençons à travailler
sur un projet de nœud, nous créons avant
tout des G et des
fichiers packagés pour notre projet. Voyons comment
créer le fichier Gn du package. Ici, je crée un
nouveau dossier appelé NPM Dash Commands et j'ouvre
ce dossier dans le code vis Bien. Maintenant, tout d'abord, nous devons créer un fichier de package
GSN pour cela, nous ouvrons notre terminal
en utilisant Control Plus Batak, et ici nous écrivons NPM, init voyez, cet utilitaire vous guidera tout au long de la création d'un fichier
package sn. En bas, il
demande le nom de notre projet. Si vous souhaitez le modifier, vous pouvez écrire
un nouveau nom ici, mais assurez-vous d'utiliser lettres
minuscules et
également sans espace. Je suis content de
ce nom actuel, alors j'appuie simplement sur Enter. Après cela, il vous
demandera le nom de la version. Encore une fois, nous ne voulons pas modifier cette valeur par défaut, nous
appuyons donc sur Entrée. Maintenant, nous pouvons écrire la description de notre
candidature. Pour l'instant, je passe juste ça de côté. Ensuite, nous avons le point d'entrée, qui est le
nom de fichier par défaut de notre projet. Ainsi, lorsque nous déploierons
notre application, cette plateforme saura quel est le fichier principal de
notre application. Ensuite, nous
avons la commande de test, le référentiel
Git, puis le mot-clé,
l'auteur et la licence. Appuyez sur Entrée pour tout cela et voyez ici que nous
obtenons cet objet qui va être ajouté
au package
JCNFle qu'il demande,
est-ce que ça va ? Si vous êtes d'accord avec
ces détails, nous pouvons simplement écrire ici, oui ou oui. Et c'est fait. Vous voyez, ici, nous avons le package
JSNFle dans notre dossier de projet. Si vous ouvrez ce fichier, vous voyez, nous obtenons
ici cet objet avec détails de
l'application
et à l'avenir, nous pouvons également modifier
ces détails. Maintenant, si vous y prêtez
peu attention, lorsque nous répondons
au fichier GSN du package, nous n'avons rien
changé et nous devons
encore répondre à toutes ces questions Y a-t-il un
raccourci pour cela ? La réponse est oui, nous avons le raccourci com pour
créer des packages et des fichiers. Supprimons ici ce package Gs et ce fichier
actuels. Dans le terminal, auparavant, nous y écrivons NPM Nous devons donc
répondre à toutes ces questions. Mais si nous voulons
sauter ces questions, alors nous écrivons ici NPM
dedans Y pour tous, oui Et c'est fait. Vous voyez, nous obtenons à nouveau le package DSNFle
en une seconde Et l'objet est également le même. En résumé, lorsque nous
démarrons un nouveau projet nodejs, nous devons d'
abord créer fichier
package Gn avec la commande
NPM
19. Installer le package dans le projet: Dans la
leçon précédente, je vous ai dit que ce fichier GSN de package contient informations d'
application
avec la liste des packages, mais nous ne pouvons voir aucun nom de
package ici C'est parce que dans
cette application, nous n'avons encore installé
aucun package. Installons donc quelques packages. Pour cela, nous devons exécuter une commande dans le
terminal. C'est vraiment simple. Il suffit d'
écrire NPM install, ou nous pouvons utiliser ici un raccourci, qui est juste un espace I. Ici, nous écrivons le
nom de notre package, disons Express. Vous obtiendrez également
cette commande la page de ce
package sur le site Web de NPM Vous pouvez également copier à partir de celui-ci, et ici nous appuyons sur Entrée. Vous voyez que dans notre dossier de projets, nous obtenons
le dossier des modules de nœuds dans lequel tous
nos packages tiers enregistrent leurs fichiers et leur dossier. Et si nous l'ouvrons, vous voyez, nous avons
ici de nombreux
dossiers et de nombreux fichiers. Ne vous inquiétez pas,
car dans le monde réel, nous n'ouvrons jamais ce dossier. Soit nous créons ce dossier, nous le supprimons, mais nous ne l'ouvrons
jamais, ne vous inquiétez pas. Après cela, nous obtenons également le
package log point JSNFle. Packageog point JSNFle est utilisé pour
enregistrer les dépendances à un En d'autres termes, le
package log point JSNFle
garantit que tous les développeurs ainsi que le système de
déploiement utilisent la même version du
package pour éviter les problèmes De plus, ne vous inquiétez pas à ce sujet. Nous ne touchons presque pas à ce dossier. Et si nous voyons dans le package point JCNFle ici en bas, nous obtenons une nouvelle propriété
appelée dépendances, et dans celle-ci, nous obtenons toutes nos dépendances
avec sa version Nos projets reposent sur les dépendances. Sans ces packages, notre
application ne peut pas fonctionner, c'est pourquoi nous l'avons
appelée dépendance. Il s'agit de la version de
notre package Express. Si nous installons un autre package, celui-ci l'ajoutera à cette
liste de dépendances avec sa version Maintenant, cette version est
la dernière version développeurs
déploient sur le site Web de NPM Mais parfois, les développeurs, en
déployant par erreur une
version bloquée ou une nouvelle version, introduisent une nouvelle syntaxe Dans ce cas, nous
pouvons également installer ancienne version de
n'importe quel package NPM Ici, sur le côté droit, nous avons la version Stab Vous voyez, ici, nous pouvons voir l'
historique complet de ce package. Nous pouvons installer n'importe
lequel de ces packages. Supposons que nous voulions installer
cette version 4.18 0.1. Nous cliquons donc sur cette version. Il ouvrira sa page d'accueil
pour cette version spécifique. Et nous pouvons voir ici que
la version est modifiée, et que la
commande d'installation est également modifiée. Ils ajoutent AdSign et ensuite, ils rédigent la
version du package, aussi simple que cela Revenons donc au code VS ici, notre version actuelle est la suivante. Maintenant, nous copions cette commande
depuis ce site et collons
simplement dans notre
terminal de projet et appuyons sur Entrée. Version C modifiée. C'est ainsi que nous
installons les packages avec commande
NPM I package name De plus, ici, nous pouvons ajouter
plusieurs noms de packages. Et si nous voulons installer version
spécifique, nous écrivons NPM, nom
du package au numéro de
version rouge, et c'est C'est aussi simple que cela d'installer le
package dans un projet de nœud. Et après avoir installé
les packages, nous pouvons commencer à les utiliser dans tous les fichiers JavaScript
de ce projet.
20. Désinstallation des paquets: Voyons maintenant comment
désinstaller le package. Mais avant cela, installons un autre package appelé Mongo DB. Dites-moi quelle commande nous utilisons. Nous utilisons NPM install ou I, puis nous écrivons le nom de notre
package Mongo Tu t'en sors vraiment très bien. Dans ce package point jcnfle, vous pouvez voir un autre
package dans la dépendance Essayons de désinstaller
ce package. Pour cela, nous devons écrire NPM,
uninstall, ou nous avons également un raccourci pour cela, qui Ensuite, nous écrivons le
nom de notre package qui est Mongo DV. Cette commande fait deux choses. Tout d'abord, il supprimera
les fichiers et
dossiers de
package concernés du dossier des modules du
nœud. Deuxièmement, il mettra
à jour les fichiers de configuration, package JSN
et le packslogt Ainsi, à l'avenir, notre application n'installera pas de packages
inutiles.
21. Installer le paquet en tant que dépendance du développeur: Maintenant, parfois, dans notre projet, nous voulons installer un package uniquement pour l'utiliser dans l'environnement de
développement, pas dans la production. Par exemple, nous avons
des packages de test qui
servaient à tester l'implémentation de notre
code. Nous n'avons pas besoin de packages de test dans notre environnement de production. Cela n'
augmentera pas la taille du serveur. Dans le nœud Jazz, nous pouvons installer packages dans la
dépendance du développeur ou, en bref, dans dépendance
dave, ce qui signifie que le package ne s'
ajoutera qu' à notre
environnement de développement, pas à la production. Dans notre application,
installons donc un package de test
en tant que dépendance Do. Pour cela, nous écrivons NPM. Ici, nous écrivons le
nom de notre package, qui est Mocha. Il s'agit de la commande normale
pour installer le package. Maintenant, pour installer le
package en tant que dépendance Do, nous devons ajouter une option ici, d s Dev et appuyer sur Entrée. Vérifions-le maintenant. Pun package point
JCNFle en bas, nous pouvons voir les dépendances des développeurs, et dans cela, nous avons notre
package avec Nous pouvons installer n'importe quel package
en tant que dépendances de développement, nous devons utiliser Dev à la
fin de la commande d'installation. Mais gardez à l'esprit que cela ne fera qu' ajouter à l'
environnement de développement. De plus, si nous voulons désinstaller les packages de dépendances
DV, nous utilisons la même commande celle que nous avons vue dans la leçon
précédente, NPM Uninstall ou le nom du package
UN, qui est Mocha. Et c'est fait.
22. Les logiciels qui sont obsolètes et les mettent à jour: Voyons quelques
commandes utiles de NPM. Parfois, dans notre application, nous installons des
packages qui peuvent devenir obsolètes et NPM a
sa version la plus récente Par exemple, dans cette section, nous installons la version précédente
du package Express. Maintenant, comment pouvons-nous identifier
les packages mis à jour ? Pour cela, nous avons une commande
dans NPM, qui est obsolète. Nous écrivons NPM obsolète
et appuyons sur Entrée. Et vous voyez, voici la
liste. Nous avons le nom du package. Est la version actuelle, recherchée signifie dernière version du package qui correspond à la plage de versions. Dernière version, qui est la dernière version
de table de ce package, emplacement, qui est l'
emplacement de ce package, qui se trouve dans le dossier non
module express. Enfin, cela dépend du projet ou de la dépendance qui
dépend de ce package. Ainsi, nous pouvons rapidement voir quels packages sont
obsolètes dans notre projet. Actuellement, nous
n'avons qu'un seul package, mais imaginez que nous travaillions sur vieux gros projet et que nous
obtenions ici de nombreux packages obsolètes. Maintenant, pour le démontrer, laissez-moi installer un autre package
avec une version plus ancienne. Nous écrivons NPM install
Mongo Debi au taux de
4,14 0,0. Appuyez sur Entrée. Bien. Maintenant, nous exécutons à nouveau la commande obsolète
NPM Vous voyez, nous avons ici
nos deux forfaits. Maintenant, vous vous demandez peut-être pourquoi
la version recherchée et
la dernière version sont différentes ? Qu'est-ce que cela signifie ?
Comme je vous l'ai dit, Wanted Column Sources, qui est la dernière version
du package répondant à
la plage de versions. Actuellement, nous avons la version
4.14 0.0 dans notre projet. C'est une gamme de versions uniquement liée à
la version 4. Par exemple, 4,15 0,1, 4,16 0,0, 4,17 0,1, etc. Ce type de version
correspond à la plage de
versions 4.14 0.0, et non 6.15 Mais vous vous demandez peut-être quel est le problème lié à la
mise à niveau de notre version
vers la version 6.15 0.0 lets
? Nous pouvons le faire. Mais lorsque les développeurs changent
le numéro de
version, comme la version quatre en version
cinq ou en version six, ils peuvent effectuer des
mises à jour qui peuvent vous donner une erreur pour l'ancien code
selon la version 4.14 0.0 C'est pourquoi nous mettons toujours à jour notre package vers cette version
souhaitée, et non vers la dernière version. De cette façon, nous n'
annulerons pas notre candidature. Nous voulons maintenant mettre à jour tous ces
packages obsolètes en une seule fois. Nous avons une autre commande pour
mettre à jour les packages obsolètes. La commande est NPM
update. C'est ça. Il mettra à jour tous les packages vers leur dernière version dans
la plage spécifique, mais il ne mettra pas à jour fichiers
package point Json et
packago Json Vous voyez, dans le package GSN, nous avons toujours notre ancienne version
appelée package Express Maintenant, jusqu'à ce que nous mettions à jour le
package point JSN ou packlot JCNFle, il
ne sert à rien C'est nécessaire, nous devons
mettre à jour les chiens et les fichiers du package. Pour cela, nous utilisons un autre
package téléchargé sur NPM, à savoir jour de NPM check Nous écrivons NPM, I et ici nous ajoutons G pour installer globalement
ce package dans notre système Dans les autres applications du nœud, il n'est pas nécessaire d'
installer ce package. Il sera
disponible dans le monde entier dans notre système. Ici, nous écrivons le nom de notre package, qui est NPM check Updates Assurez-vous d'écrire le même nom avec un
tiret et non un trait de soulignement De plus, si vous utilisez MG, début de
cette commande globale vous devez ajouter un pseudo préfixe au Sinon, vous obtiendrez une
erreur et
entrez ensuite le mot de passe de votre système. Maintenant, nous pouvons simplement exécuter les mises à jour de
NPM check. Vous voyez, il vérifie le point JCNFle
du package et indique que nos bases de données Express et
Mongo Ici, il montre
cette dernière version, mais nous voulons mettre à jour notre
package avec la version souhaitée. Nous devons donc écrire ici NCU, qui est l'abréviation
de NPM check T pour Target. Nous ciblons les versions mineures, qui
sont les versions recherchées. Cela
ne renverra que les versions majeures. Vous voyez, nous obtenons ici la
version souhaitée pour les deux packages. Toujours en bas, il suggère d'exécuter NCT minor pour
mettre à niveau le package J et le fichier Nous exécutons les mises à jour de NPM check, ou nous pouvons écrire NT, minor et appuyer sur Entrée C, il a changé la version
des packages et du fichier. Encore une fois, il suggère d'exécuter NPM install pour
installer les nouvelles versions Nous écrivons NPM install ou NPM
I et appuyons sur Entrée et c'est fait. Tous nos packages sont mis à jour, c'est ainsi
que nous identifions les packages
obsolètes et que nous mettons à jour les packages avec
leur dernière gamme spécifique. Ainsi, notre application ne s'
interrompt pas avec la nouvelle version du package.
23. Supprimer les paquets inutilisés du projet: Parfois, dans notre application, nous pouvons installer
de nombreux packages au début de notre projet, mais certains packages ne sont pas
vraiment utilisés Nous pouvons
donc supprimer
les packages inutilisés car cela occupera de
l'espace inutile dans la production. Donc, en oubliant la liste
des packages non utilisés, nous avons besoin d'un autre package
appelé DP check, qui est le contrôle des dépendances. Nous écrivons donc NPM IG depth check. Encore une fois, nous installons ce
package pour le niveau global. Dans toutes les applications,
nous pouvons l'utiliser. De plus, si vous êtes Mcuser, assurez-vous d'ajouter sudo
au début de la commande
globale du package et d' entrer le mot de passe de votre système Maintenant, vous pouvez simplement
exécuter ici dep check, et cela renverra la liste des dépendances
inutilisées et également des dépendances dab
inutilisées Actuellement, nous n'avons utilisé
aucune dépendance ni aucun package. C'est pourquoi nous considérons tous les packages
tiers comme non utilisés. En utilisant NPM uninstall
ou UN Express Mongo DB, nous pouvons désinstaller tous les packages Génial. Maintenant, si nous vérifions
encore une fois , nous n'arriverons à
rien, adorable C'est ainsi que nous pouvons supprimer les packages
inutilisés de l'application du
nœud. Tout tourne autour du gestionnaire de
packages de nœuds ou de NPM. Si vous souhaitez réviser rapidement ce que vous avez appris dans cette section, vous trouverez un résumé PDF à
la fin de chaque section, afin que vous puissiez le télécharger et
récapituler ce que vous avez appris Maintenant, à partir de la section suivante, nous allons commencer à construire notre
premier véritable projet No Js.
24. Section 04 - API vs API REST: Bienvenue dans la quatrième section du cours ultimate node JS. Dans cette section, nous allons commencer à travailler sur
notre premier projet. Nous commençons donc par les bases, qu'est-ce que l'API RS, configurons notre serveur à
l'aide d'Express JS, puis nous créerons différents
types de requêtes STB, get, post, put et delete Nous assistons également à la validation
des données et bien plus encore. Commençons donc cette section. Maintenant, comme nous le savons, API signifie interface de
programmation d'applications, et c'est le moyen pour deux programmes de
communiquer entre eux. Souvenez-vous de notre exemple de restaurant, voyons un autre exemple
concret. Imaginez qu'un utilisateur souhaite
s'inscrire sur notre site Web, il ou elle remplisse le
formulaire puis le soumette. Au moment de leur soumission, nous appelons l'API pour
enregistrer un nouvel utilisateur, et dans le backend,
nous créons un nouvel utilisateur. Comme celles-ci, nous pouvons créer de nombreuses API pour enregistrer
l'utilisateur existant, obtenir la liste de tous les produits, ajouter des produits au panier, supprimer des produits du
panier, etc. En termes simples, l'API est
utilisée pour transférer des données entre le front-end et le
back-end
vers le front end. Nous le savons
déjà. Vous pouvez maintenant vous demander
ce qu'est l'API REST. REST API est l'abréviation de Representational
State Transfer API. L'API REST est un moyen spécifique
de créer nos API simples. Ne vous inquiétez pas pour son
nom. C'est très simple. API Rest est la même API, mais nous devons suivre certaines
règles pour créer cette API. Si nous suivons certaines règles, cette simple API
devient une API REST. Voyons maintenant quelques règles
que nous devons suivre. Make Rest API. L'une des règles est que nous devons définir une URL d'API distincte pour
chaque donnée. Par exemple,
supposons que nous créions une API pour les
opérations liées aux utilisateurs, telles que l'enregistrement d'un utilisateur, l'
obtention des informations d'
un seul utilisateur, etc. Dans ce cas, notre API doit être notre nom de domaine, puis
slash user pour s'enregistrer Et si nous voulons obtenir des
informations sur un utilisateur unique, nous créons une URL d'API
telle que slash users 123 Ici, 123 est un identifiant unique d'utilisateur. Comme si nous créons une API
liée aux produits, notre
URL doit être
comme suit : slash products, slash products, slash products, slash
products, slash
add to Ainsi, en
regardant simplement cette URL d'API, nous avons une idée de base
concernant nos API, et ainsi, nous pouvons facilement apporter des modifications et notre
application rester propre. Une autre règle concerne les différents
types d'actions telles que la lecture, l'
ajout, la mise à jour
ou la suppression de données. Devrait utiliser des méthodes
SGDP spécifiques. Vous pourriez maintenant vous demander quelles
sont les méthodes SGDP. Comme nous le savons, le SDDP est l'abréviation de protocole de
transfert hypertexte et permet à notre interface de demander et de recevoir des
pages
Web et d'autres ressources à partir de serveurs Ainsi, c'est uniquement grâce au
SGDP que nous sommes en mesure d' envoyer et de recevoir des données
depuis le backend à l'aide Maintenant, ce SDDP comporte
cinq méthodes principales. Obtenez, publiez, mettez, patchez et supprimez. Laissez-moi vous expliquer
cela un par un. La première est la méthode Get. Nous utilisons la méthode Get lorsque nous voulons uniquement obtenir des données
du serveur. Par exemple, nous voulons
obtenir tous les détails des utilisateurs, ou nous voulons obtenir
les détails de tous les produits ou nous voulons obtenir les détails d'
un seul produit. Dans ce cas, nous définissons
notre API avec la méthode GT. Pour comprendre ces méthodes, nous utiliserons l'analogie de bibliothèque. La méthode Get revient à demander à
un bibliothécaire de vous montrer un
ou plusieurs livres Ne vous inquiétez pas pour la
mise en œuvre. Nous verrons toutes les méthodes étape
par étape dans cette section. Deuxièmement, nous avons la méthode post. Nous utilisons la méthode post lorsque
nous voulons publier ou envoyer des données depuis le front-end pour créer de nouvelles
données sur notre serveur. Par exemple, pour
enregistrer un nouvel utilisateur, nous devons envoyer les données utilisateur depuis le front-end, ce qui
créera de nouvelles données sur notre serveur. Je pense que c'est comme si nous
donnions un nouveau livre au bibliothécaire pour le
livre en bibliothèque Ensuite, nous avons mis la méthode. Nous utilisons la méthode Put lorsque
nous voulons mettre à jour une donnée existante sur le
serveur avec de nouvelles données. Par exemple, si vous modifiez informations de
votre profil
sur un site Web et que vous les
enregistrez, une demande de mise à jour est envoyée pour
mettre à jour votre profil
avec les nouvelles informations. Pensez que c'est comme donner au bibliothécaire une version mise à jour d'un livre
pour remplacer l'ancien Ensuite, nous avons la méthode des pages. Nous utilisons la méthode des pages
lorsque nous voulons mettre à jour de petites
données, et non des données complètes. Par exemple, si nous voulons
simplement mettre à jour notre adresse e-mail dans notre profil sans rien
changer d'autre
, une demande de page peut être utilisée. C'est comme si
nous donnions au bibliothécaire uniquement les pages mises à jour d'un livre à mettre à jour plutôt que de
remplacer le livre dans son intégralité Imaginez, nous avons ici
un objet utilisateur sur notre serveur. Pour mettre à jour, complétez
cet objet utilisateur, puis quelle méthode nous utiliserons, nous utiliserons la méthode put. Et si nous voulons mettre à jour uniquement
le mot de passe de cet utilisateur, alors quelle méthode nous utiliserons, nous utiliserons la méthode patch. Tu t'en sors vraiment très bien. La méthode Put est utilisée pour la mise à jour
complète des données, et la méthode patch est utilisée pour mise à
jour
minime des données existantes. La dernière méthode est la suppression. Et vous avez bien deviné, nous utiliserons la méthode suppression
pour supprimer les données du serveur. Par exemple, lorsque nous supprimons une publication ou un commentaire
sur les réseaux sociaux
, une demande de suppression est envoyée pour le supprimer
du serveur. Et pour cela, je ne pense pas nous ayons besoin d'une analogie avec les bibliothèques, n'est-ce pas ? De plus, ce n'est pas pratique. Pensez que c'est comme demander aux bibliothèques de retirer un
livre de la bibliothèque. Vous pouvez voir que les méthodes SGDB
sont très simples. Nous utiliserons ces
cinq méthodes SGDP pour définir nos différents
types d'API Ce ne sont là que quelques
règles que nous voyons actuellement, mais ne vous inquiétez pas, nous apprendrons toutes ces règles au
fur et à mesure que nous créerons des API. Vous vous demandez peut-être pourquoi
nous avons besoin de l'API REST. Pourquoi devons-nous suivre les
règles pour créer une API ? En suivant toutes les règles, nous pouvons organiser les choses, et c'est également vrai pour l'API RS. Les règles rendront notre
API plus organisée. De plus, en suivant les règles de l'
API REST, nous créons une API simple et
facile à utiliser
car elle utilise des méthodes SDDP spécifiques pour effectuer des
types de travail spécifiques De plus, avec les règles, nous pouvons créer une API propre et
maintenable, tous
les développeurs peuvent comprendre et commencer à
travailler dessus Pour l'instant, ne
vous inquiétez pas pour les règles. Comme je l'ai dit, vous apprendrez ces règles pendant que
vous créerez des API. Celeste commence à gagner notre
premier projet Node JS. Je suis très excitée et
je sais que vous l'êtes aussi.
25. Planifier la liste d'API pour le projet 01: Maintenant, avant de commencer un projet, il est préférable de
planifier approximativement le projet Ted. Comme nous le savons, notre
premier projet concerne la
gestion de la tâche et voici
à quoi ressemble son interface. Il s'agit également du premier
projet de mon cours React JS, et nous allons créer
ce backend
comme premier projet backend Ne vous inquiétez pas, nous n'allons pas créer de front-end ici car concentrons principalement sur le NodeJS
et sur la création du meilleur backend
pour
nos et sur la création du meilleur backend
pour Depuis le front-end, il
suffit d'appeler les API. Maintenant, vous vous demandez peut-être
comment pouvons-nous planifier le projet NodeJS ? C'
est très simple. C'est la méthode
que j'ai utilisée pour planifier mon projet Bend,
même pour les grands projets. Au lieu de construire d'
abord le projet puis d'apporter des modifications
majeures, il est préférable de consacrer
un peu de temps à la planification avant de
commencer notre projet. Pour le projet Ben, si nous
créons la liste des API, c'est très utile car
Bend est presque entièrement consacré aux API. Pour ce projet,
nous avons d'abord besoin de la liste de tous les todos, une API pour obtenir tous les todos Ensuite, nous devons créer API pour ajouter une nouvelle
tâche, puis nous pouvons mettre à jour les détails de la
tâche, une API pour mettre à jour la tâche, et à la fin, nous devons supprimer single
to do, une autre API pour
supprimer une tâche spécifique. Actuellement, nous savons que nous avons
besoin de ces quatre API, et nous allons créer deux ou trois API
supplémentaires pour la pratique. Si, lors de la construction d'un projet, nous devons créer plus d'API, nous créerons plus d'API. Il n'y a rien de
mal à cela. Ce n'est qu'un plan approximatif
pour réduire la confusion.
26. Configurer une nouvelle application: Créons maintenant une nouvelle
application pour notre projet. Ouvrez donc le dossier dans lequel
vous souhaitez créer un projet, je le nomme piste des
tâches et ouvrez simplement
ce dossier dans le code VS. C'est le nom de notre
projet. Est-ce que ça sonne bien ? J'espère que c'est le cas. Si vous
avez un meilleur nom, vous pouvez également l'utiliser. Cela dépend entièrement de vous. Maintenant, que devons-nous faire pour
créer des applications sans JS ? Vous souvenez-vous que nous venons de le faire dans notre section précédente. Nous ouvrons simplement notre terminal et initialisons notre projet en utilisant NPM pour As we
will use y here. Vous voyez, nous obtenons PGSNFle avec
une configuration par défaut. Ici, nous pouvons voir que notre
fichier principal est index point js, c'est-à-dire le fichier
qui s'exécute lorsque
nous démarrons notre application. Créons un fichier index point
js, et c'est tout. Ici, dans ce fichier, nous allons écrire du code
pour notre backend.
27. Créer un serveur avec Express: Dans la section précédente,
nous avons donc créé notre serveur à
l'aide du module STTP Le problème avec le
module STTP est que nous devons définir nos différents points de terminaison d'API dans ces instructions I et LSI, ce qui n'est pas très clair et pas facile à gérer
pour les C'est pourquoi nous utilisons package ou un
module
très populaire appelé express point js. Express Dogs est minimal et flexible pour créer de
meilleures applications de nœuds. En termes simples, en
utilisant express point js, nous pouvons simplifier nos itinéraires. Nous pouvons facilement gérer les
demandes et réponses STIP, intergiciels et
bien d'autres choses encore Laisse-moi te montrer quelque chose. Voici le
package Express sur le site Web de NPMJS. Vous pouvez voir que ses téléchargements hebdomadaires s'
élèvent à près de 37,2 millions, ce qui est fou et près
de 90 % des développeurs de projets NodJS
utilisent le package Express C'est très important,
Master Express. Tout d'abord, installons
ce module dans notre projet. Ouvrez le terminal, écrivez
et envoyez Install Express. Au moment où j'
enregistre ce cours, sa dernière version est 5.1 0.0. Si vous voulez avoir la même
expérience que moi, alors vous pouvez écrire ici
NPM install Express aerate 5.1 0.0 et appuyer sur Entrée Ne vous inquiétez pas pour Express. C'est un package vraiment simple. D. Nous voulons maintenant utiliser ce module Express dans
ce fichier d'index js. Peux-tu me dire
ce que nous devons faire ? Bien, nous allons saisir le module express
en utilisant require function, express, et cette
fonction requise renvoie une fonction. Nous le stockons simplement dans
une variable appelée express. Maintenant, pour créer une application
express, nous appelons ici cette
fonction express, qui renvoie un
objet et nous le
stockons dans une variable appelée
application ou app. Vous pouvez lui donner n'importe quel autre nom, mais tous les
développeurs l'ont probablement appelée application. Allons-y avec l'application. Maintenant, dans cet objet d'application, nous avons de nombreuses méthodes utiles. Par exemple, nous
avons ici app point get app point post, app point pot. App point patch, app
point DLD, etc. Vous souvenez-vous où nous
voyons ces cinq méthodes ? Il s'agit de méthodes SDDP
permettant de créer différents
types d'API Si nous voulons définir notre
API pour la méthode SDDpgt, nous utilisons app
point Si nous voulons définir la méthode de suppression
SDDP, nous utilisons app point De la même manière que nous pouvons créer des demandes de publication
, de publication et de correctif. La manière de définir ces
cinq méthodes est la même. Néanmoins, nous verrons toutes les méthodes de cette
section une par une. Pour l'instant, commençons
par la requête GAD. Dans cette méthode
GAT, au premier paramètre, nous devons écrire le nom de notre point de terminaison d'
API. Supposons que nous voulions définir l'API
G pour l'URL, le SGDP, la
colonne à double barre oblique, l'hôte local, la
colonne 3 000 barres obliques Maintenant, quel est notre point de terminaison dans cette URL ? Tudos est notre point de terminaison d'API C'est ce que nous devons écrire
ici au premier paramètre. Assurez-vous que nous ajoutons d'abord la barre oblique Hefward. Dans le cas contraire, cela
ne fonctionnera pas correctement. Maintenant, que se passe-t-il si nous voulons
définir l'API get pour l'URL, SDDP, la colonne 3 000
localisée, qui est l'
URL racine À ce moment-là, nous ne pouvons utiliser
que la barre oblique, qui représente le point final de la racine Nous devons maintenant définir
ce qui se passera lorsque notre interface enverra des
demandes au point de terminaison. Tu te souviens,
laisse-moi te montrer. Ici, nous passons une
fonction de rappel, et dans celle-ci, nous obtenons deux objets,
une requête et une réponse Cette demande contient
tous les détails sur demande d'
URL et avec
cet objet de réponse, nous pouvons envoyer les détails
relatifs à la réponse. Nous l'avons déjà vu
dans la leçon du module STP. Maintenant, ce que nous voulons envoyer lorsque quelqu'un envoie
une demande sur cette API. Pour l'instant, nous renvoyons simplement un point de réponse texte au projet
SEND Task Track. Lorsque quelqu'un envoie
une requête Get sur ce point de terminaison, cette fonction s'
exécute puis renvoie
simplement ce texte en
réponse, aussi simple que défini. Par ces deux lignes, notre serveur
Express est créé, mais nous devons exécuter ou écouter
ce serveur sur un port. Si nous n'écoutons pas notre serveur, notre API ne fonctionnera pas. Ici, à la fin, nous écrivons app point L ISE et nous passons
simplement notre numéro de port
au deuxième paramètre, nous passons à nouveau la fonction Callback, qui s'exécutera lorsque notre serveur commencera à
écouter sur ce port Ici, nous pouvons simplement confirmer que le serveur Dot Log est en cours d'exécution ou écoute
sur ce port 3 000 Enregistrez les modifications et
exécutons notre fichier index point js. Écrivez le nœud, le point d'index js. Le serveur C écoute
sur le port 3 000. Sympa. Revenez maintenant au navigateur et exécutez Local host Column 3,000, qui est l'URL racine Vous
voyez ici que nous obtenons le texte du projet Task
Track, que nous envoyons depuis notre serveur. Vous pouvez voir qu'Express simplifie vraiment
notre code. Nous pouvons comparer notre code
actuel avec le code du module SGDP précédent Avec Express, c'est vraiment simple. Il s'agit également de notre première API. C'est pourquoi nous n'avons écrit
qu'un texte en réponse. Maintenant, au fur et à mesure que nous avançons
dans notre projet, vrai frisson va commencer
28. Exercice pour créer un serveur Express: Il est temps de faire un peu d'exercice. Je veux que vous supprimiez tout le code du fichier JS à points d'index créiez
à nouveau un serveur Express et que vous créiez une API pour
root et point. Grâce à cet exercice, vous vous
familiariserez avec la création d'un serveur
Express. Littéralement, cela ne
prendra qu'une minute. Essayez de terminer cet exercice ,
puis observez la solution. OK. J'espère que vous avez résolu l'exercice ou
que vous avez essayé de le résoudre. Voyons maintenant la solution. Tout d'abord, nous avons besoin du module
Express dans notre fichier. Exigez Express et stockez-le
dans une variable appelée Express. Cet express est une fonction, nous l'appelons
donc ici et il
renverra notre objet serveur
ou notre objet application. Stockons-le donc dans
une variable appelée app. Ici, nous créons notre
serveur Express en utilisant ces deux lignes, mais nous devons écouter notre serveur pouvoir exécuter notre API. Donc à la fin, on ajoute simplement app point Lisen et au premier paramètre,
qu'allons-nous passer Bien, nous passons le port,
qui est à 3 000. Et au deuxième paramètre,
nous passons la fonction de rappel
et à l'intérieur de celle-ci, le serveur de journalisation des
points de console
fonctionne simplement sur le port 3 000 Une chose est que j'écoute le
serveur avant d'ajouter l'API car j'ai souvent
oublié d'écouter le serveur, et cela me fait perdre beaucoup de temps. J'écoute toujours le serveur dès que je le crée. Maintenant, entre les deux, nous pouvons
définir n'importe quoi pour notre API. Donc, pour la requête Get, nous ajoutons app point GAT. premier temps, nous ajoutons
notre API et notre point, puis au
deuxième paramètre, nous ajoutons une fonction de rappel, qui a deux paramètres,
request et response Dans ce rappel,
nous envoyons simplement du texte en utilisant le point de réponse SNG Il s'agit d'un projet Task Track. Enregistrez les modifications, et
ici nous devons arrêter notre application depuis le terminal car elle
exécute toujours l'ancien code. Nous exécutons à nouveau le fichier node
index point js. Vous voyez, le serveur écoute, et dans notre navigateur, nous obtenons le texte
mis à jour, très simplement.
29. Créer une API pour obtenir tout un liste de tous: Créons maintenant une API pour
obtenir la liste de toutes les tâches. Pouvez-vous me dire quelle
méthode SDP nous devons utiliser ? Bien, pour obtenir les
données du serveur, nous utilisons la méthode Get DP. Nous écrivons donc ici app point GT. Et disons que nous voulons
donner à cette API le nom todos. Nous passons donc ici slash
todos, puis,
au deuxième paramètre, nous passons la fonction de rappel, qui a deux paramètres
request Vous voyez, pour toutes les API, cette structure
restera la même. Seul ce changement de méthode SDP,
ce changement de point de terminaison et la logique de cette fonction
Web d'appel changeront C'est ainsi qu'Express JS rend
notre projet simple et propre. heure actuelle, nous n'
allons pas travailler avec une base de données car nous ne voulons pas ajouter complexité
supplémentaire à
notre premier projet. Nous apprendrons toutes ces
choses étape par étape. Ne vous inquiétez donc pas pour la base de données. Maintenant, ici, nous devons
envoyer tous les tableaux todos. En haut, je définis
une donnée fictive appelée tableau
todos et j'
y ajoute simplement quelques todos Ici, chaque todo est un objet
doté de quatre propriétés. ID, citons-le à une tâche, qui est un texte de tâche. Créons toutes les API
pour le projet 1. balises, qui sont les
balises liées à la tâche, qui est un tableau, pas simplement du JavaScript sous forme de virgule Et du statut à faire. Ces propriétés, identifiant, tâche, balises, statut sont définis
par Noches Developer, ce
qui signifie que
vous voulez les appeler, nombre de propriétés
dont vous avez besoin, ces éléments que vous
devez décider en fonction des données que nous voulons stocker
et des données que nous ne voulons pas Dupliquons maintenant cet objet deux fois de plus en utilisant Sift plus
alter plus flèche vers le bas ou Sift plus Option
plus flèche vers le bas. Nous changeons cet ID en deux tâches afin de créer un EPI pour
la liste de toutes les balises à faire, aucun Js et le statut à faire Enfin, nous changeons simplement l'ID en trois tâches pour planifier le projet 1, le texte JavaScript et
le statut comme terminé. Vous voulez simplement renvoyer ce
tableau en réponse lorsque quelqu'un
envoie une requête Gut à l'API
qui coupe todos et Point Ce que nous écrivons ici, nous écrivons le point de réponse SN et nous transmettons
simplement notre tableau todos Enregistrez les modifications et
vérifierons que cette API
fonctionne ou non. Ouvrez le terminal, fermez le serveur en
cours d'exécution à l'aide de Control plus C, puis réexécutez ce fichier. Maintenant, dans le navigateur situé à la
place du site Web racine, nous appelons simplement slash
Todos et Point Vous voyez, nous avons ici notre gamme. C'est aussi simple que cela d'envoyer des données depuis le back-end à l'aide de l'API G.
30. Configurer le redémarrage automatique de nodemon: Actuellement, lorsque nous apportons des
modifications à notre projet, nous devons fermer notre
ancien serveur en cours d'exécution et redémarrer notre application, ce qui est vraiment ennuyeux. Pour
redémarrer automatiquement notre application, nous avons un package
appelé nodemon C'est vraiment utile. Ouvrez le terminal et écrivez
NPM install ou IG nodemon. Ici, nous utilisons DSG pour installer ce
package Norman dans le monde entier Sinon, nous devons installer nor moon dans chaque projet de nœud. De plus, si vous utilisez Mac, pour installer le package
global, vous devez écrire sudo
au début de
la commande, puis il vous
demandera le mot de passe système Maintenant, comment pouvons-nous exécuter un fichier en utilisant le
nœud 1 ? Laisse-moi te montrer. Dans le terminal, auparavant, nous exécutions le fichier en utilisant
node, index point js. Maintenant, pour node M, nous écrivons
nodemon index point js. est aussi simple que ça. Vous voyez,
nous avons ici notre version du nœud M. Ou en redémarrant, nous pouvons entrer dans RS. Cela nous indique également que nous
regardons la période Path, ce qui signifie racine
de ce projet. Après cela, il surveille des
extensions comme Js, MGs, Cgs, JSON, etc. Un fichier qui a ce
type d'extensions, Nod moon
surveille constamment ces fichiers, et si quelque chose
change dans ces fichiers, il redémarrera notre application. À la fin, vous voyez, nodemon exécute également
Command node index point js En utilisant nodemon, nous
n'avons pas besoin de redémarrer
notre application Il
redémarrera automatiquement lorsque nous modifierons quelque chose dans ces fichiers
avec ces extensions.
31. Variables d'environnement: Actuellement, nous
configurons manuellement le pod de notre serveur. Mais dans le monde réel,
ce pod est défini par l'environnement dans lequel notre
application s'exécute. Plus précisément, il est géré par le fournisseur d'hébergement ou plateformes de
développement
telles que render, Heroku, AWS, etc. Lorsque nous déployons notre application,
sur ces plateformes, notre port 3 000 est peut-être déjà
utilisé par un autre serveur. À ce moment-là, si nous avons codé en
dur notre port, notre serveur
ne fonctionnera pas sur ce port et cela nous donnera
une erreur lors du déploiement. Quelle est donc la solution ici ? C'est vraiment simple. Nous
allons vérifier une condition. Si dans notre
environnement d'application, une variable de
port est définie, nous utilisons cette variable de port, sinon nous utilisons notre port codé en
dur. Laissez-moi vous montrer que c'
est très simple. Donc, avant d'
écouter notre serveur, nous créons une variable appelée
port equals to now here, comment pouvons-nous vérifier que notre serveur possède un port dans son environnement ou non ? Pour cela, nous avons un
objet appelé process point ENV. Cet ENV est destiné à l'environnement. Dans cet environnement, nous obtenons toutes les variables définies par les plateformes
d'hébergement et le
port pour la variable Port. Donc, si une plate-forme d'hébergement
souhaite définir un port différent, elle stockera cette variable
process point Env
point port C'est une convention courante. De plus, tous les noms de
variables d'environnement sont tous en majuscules, et c'est pourquoi nous donnons également à cette variable le
nom de tous les ports capitaux. Donc, rien qu'en le regardant,
nous savons qu' il peut s'agir d'une variable d'
environnement. Si ce port point nw point de processus est disponible, aucun problème. Mais s'il n'est pas
disponible ou défini, nous devons transmettre notre valeur de port codée en
dur. Nous avons ajouté l'opérateur or, qui est le symbole par deux fois, c'est la touche au-dessus de la
saisie ou du retour Ici, nous passons devant notre
port, qui est de 3 000. Passons maintenant
cette variable de port à la place de ce port codé en
dur, et nous allons également modifier
ce message de console. Faisons de cette chaîne une chaîne
modèle en utilisant acti, car
dans les chaînes modèles, nous pouvons facilement accéder à la
variable et modifier ces 3 000 avec des crochets dollar
coli, pot Si ce
port d'environnement est disponible, nous l'utilisons ou s'
il est faux ou nul, nous utilisons ce port 3 000. est aussi simple que ça. Actuellement,
dans notre application, le port d'
environnement n'est pas défini. C'est pourquoi notre application
fonctionnera en continu sur le port 3 000. Ne vous inquiétez pas si vous êtes un peu confus au sujet de ce
processus point ENV, nous le verrons en détail
dans les prochains projets Permettez-moi de vous donner un raccourci pour configurer l'application node. Tout d'abord, Express requis,
créez une application express, créez cette variable de port en utilisant cette expression et en écoutant l'application express
sur le port. Ces quatre éléments resteront les mêmes dans toutes les applications de nœud. Oui, nous pouvons ajouter plus de
fonctionnalités dans d'autres lignes, mais rien ne changera
dans ces quatre lignes.
32. Paramètres de route et paramètres de requête: Auparavant, nous avions créé une API pour obtenir la liste de toutes les
tâches à effectuer dans notre application. Mais que se
passerait-il si nous avions besoin d'informations sur
un seul à faire, comme
avec l'ID 1 ou l'ID 3. Pour cela, nous devons
transmettre l'identifiant dans l'URL de l'API. Notre APIURL ressemble à ceci. Todos ON, ce qui signifie que nous
voulons en récupérer un pour obtenir des
informations dont l'identifiant est Le type de variable
que nous transmettons dans notre URL est
appelé paramètre de route. Il est très important de
fournir des informations
spécifiques
sur les demandes d'API, telles que l'identifiant,
le statut, la date, etc. Laissez-moi vous montrer comment
définir ce type d'URL d' API et accéder
aux paramètres de route. Nous ajoutons un nouveau point de terminaison de l'API GAT
pour slash todo slash. Maintenant, pour définir le paramètre de
route, nous utilisons deux points et donnons le nom de notre variable de
route, comme ID. Cet ID est notre paramètre de route. Nous pouvons l'
appeler comme todo ID, mais ID est court et doux, alors nous utilisons ID, et c'est tout C'est ainsi que nous pouvons définir le
paramètre de route dans l'URL de notre API. Accédons à ce
paramètre de route dans notre logique d'API. Encore une fois, nous appliquons la fonction de
rappel avec deux paramètres,
demande et réponse Maintenant, à l'intérieur de cette fonction,
qu'en pensez-vous ? Dans quel objet, nous
obtenons des informations sur notre paramètre de route, notre
demande ou notre réponse. Huit. Nous obtenons des informations sur le paramètre de route
dans la demande. Demandez donc des points PAM. Dans cet objet perms, nous obtiendrons tous les paramètres de
route, et nous pourrons y accéder par identifiant de point Vous voyez, ici, nous recevons également des suggestions
automatiques. Maintenant, envoyons simplement cet identifiant dans notre point de réponse,
enregistrons les modifications et retournons dans notre navigateur. Dirigez-vous vers l'hôte local, colonne 3 000 todo slash one S, ici nous obtenons l'identifiant Nous avons réussi à obtenir le paramètre de route.
Maintenant, voici une chose. Nous pouvons également transmettre plusieurs paramètres de
route dans notre API. Par exemple, nous pouvons
transmettre le statut de la tâche à do. Maintenant, dans le backend, nous ajoutons ici paramètre de
route.
Comment pouvons-nous le faire ? C'est vrai. Nous ajoutons le statut du clan Slash, et comment pouvons-nous accéder au paramètre de
route ? C'est vrai. Nous utilisons request
point Perms point status Permettez-moi de vous montrer l'
itinéraire complet de l'objet Perms. Enregistrez les modifications
et revenez au navigateur, nous passons ici la valeur de statut
après notre valeur d'identifiant. Assurez-vous que la commande est
identique à celle que nous avons définie dans notre API, c'
est-à-dire le premier
identifiant, puis le statut. Ici, nous obtenons l'objet
params avec ces deux propriétés que nous
définissons dans l'API Maintenant, vous êtes peut-être curieux. Et si nous n'
adoptons pas le statut d'ici ? Voyons également cela. Supprimez
la valeur d'état et vous verrez,
ici, nous ne pouvons pas en
faire une, ce qui signifie que notre serveur n'a pas
trouvé d'ABI avec cette URL. Si nous définissons
des paramètres de route dans notre API, assurez-vous de transmettre tous les paramètres de route
dans le bon ordre. Il existe un autre moyen
de transmettre des données dans une URL, qui consiste à utiliser des paramètres de
requête. Si vous utilisez des
sites Web, dans l'URL, vous pouvez voir un point d'interrogation,
puis transmettre certains types
de variables, telles que shot est égal à date et order égal à un C pour un ordre
croissant, etc. Ce sont les
paramètres de requête utilisés pour transmettre des données dans une URL. Vous pouvez maintenant vous demander
quelle est la différence entre les paramètres de route
et les paramètres de requête ? Ils sont utilisés pour
transmettre des données dans une URL, mais les paramètres de route sont utilisés
pour transmettre les données, ce qui est le plus nécessaire lorsque les paramètres de requête
sont utilisés pour transmettre des données, qui sont supplémentaires
ou facultatifs. En termes simples, dans notre API, si le front-end n'a pas
transmis les paramètres de
route, notre API nous donnera une erreur. Mais si nous n'avons pas transmis les paramètres de
requête, notre API ne nous donnera
pas d'erreur. Il s'agit d'un détail supplémentaire. Par exemple, si nous n'avons pas
transmis l'ID ou le statut de todo, l'
erreur indiquant que l'API est introuvable nous sera Mais si nous ne transmettons pas ces variables après
le point d'interrogation, nous n'aurons pas d'erreur. Je vais maintenant vous montrer
comment accéder aux paramètres
de requête dans notre API. Pour cela, il n'est pas nécessaire de
modifier quoi que ce soit dans l'URL de l'API. Et accédez-y directement
dans notre fonction de rappel. Pour le paramètre de requête, nous avons
un autre objet dans la requête, qui est request point
query, et c'est tout. Nous n'avons
rien à faire sur notre terminal. Enregistrez les modifications
et jetez-y un œil. Vous voyez, nous obtenons ici
l'objet de la requête. paramètres de point de requête sont utilisés
pour les paramètres de route, et la requête de point de requête est
utilisée pour les paramètres de requête Nous les utiliserons beaucoup lorsque
nous créerons des API complexes. Ils sont très utiles.
33. Obtenir un todo unique par ID: Voyons maintenant comment nous pouvons
renvoyer single to do par son identifiant. Pour cela, lorsque nous utilisons un
paramètre de route ou un paramètre de requête, nous utiliserons un paramètre de route car cette information
est la plus requise. Nous supprimons donc ce statut
de classe de notre point de terminaison,
nous n'en avons pas besoin. Dans la fonction Colvey, nous devons renvoyer
le single à faire, dont l'identifiant est le même que
notre identifiant de paramètre de route Tout d'abord, stockons le paramètre de route
dans une variable séparée. Donc, Cs pour faire un ID est égal à, comment pouvons-nous accéder aux paramètres de
route ? Nous demandons un identifiant de paramètre point. Nous devons maintenant trouver
un identifiant unique à faire notre tableau todos dont l'identifiant
est le même que celui-ci Que nous utilisons une méthode de
tableau JavaScript, qui est find. Todos array point find, et dans cette méthode fine, nous passons une fonction de rappel, et ici dans le paramètre, nous obtenons le single
to do object a Donc ce T est cet
objet unique dans le tableau Tds Et nous renvoyons ici une condition si t ID est égal à notre todo ID Si vous ne connaissez pas
cette belle méthode, laissez-moi vous expliquer brièvement car il s'agit d'un pur concept
JavaScript. Cette méthode fine vérifiera donc notre tableau Tudos, et d'abord, elle choisira le premier objet
du tableau dans cette variable T, puis nous vérifierons la condition Le point T ID est
identique à l'endroit où faire l'ID. Si c'est vrai, alors cette méthode fine
renverra cet objet unique. Nous stockons donc les
inconvénients invariables à faire. R, si cette condition n'
est pas satisfaite, alors il définira T comme objet
suivant, puis
vérifiera à nouveau la condition. Et c'est ainsi que nous
pouvons trouver un single à faire en utilisant cette belle méthode. Envoyons ceci à faire en
réponse à la méthode SN par point. Enregistrez les modifications
et jetez-y un œil. Supprimons ces
paramètres de requête et donc la valeur d'état, et ici nous n'obtenons rien. Pourquoi ? Nous transmettons l'ID un, et dans notre tableau todo, nous avons également affaire à
l'ID un. Alors qu'est-ce qui ne va pas ? Essayons de consoler
le single todo. Apportez les modifications et actualisez
la page sur le navigateur. Maintenant, dans notre terminal VSCO, où nous exécutons notre serveur, nous recevons nos consoles Tu vois, ici, on n'est pas définis. Nous ne pouvons donc pas trouver todo dans notre tableau
todos, et
c'est l'erreur Cette erreur peut-elle se produire car nous ne comparons pas correctement
les identifiants. Essayons également de consoler ce type d'identifiant todo
en utilisant le type d'identifiant de tâche Cela renverra le
type d'identifiant de tâche, enregistrera les modifications et
actualisera la page. Revenons au code VS et voyez,
ici, nous obtenons une valeur indéfinie
pour single to do, et nous obtenons un identifiant de type
string what to do C'est pourquoi nous n'allons pas le faire en
single, car ici notre identifiant todo est un entier et nous le
comparons à la chaîne Nous devons donc convertir cette chaîne
Td ID en entier. Nous pouvons donc encapsuler cette
requête point perms point ID avec un entier d'analyse. La fonction Pass integer
convertira notre chaîne en entier. Sauvez les anneaux et jetez-y un coup d'œil. Actualisez la page et voyez, nous avons
ici l'objet unique à
faire avec l'ID un. Si nous passons ici l'ID trois, alors nous en arrivons à l'
ID trois, donc ça marche. Bien. Maintenant, vous pouvez demander
dans le paramètre de route, nous passons un entier. Mais pourquoi, à l'arrière, le
prendre sous forme de ficelle ? Donc, la vérité est que tout ce que
nous transmettons dans l'URL est transmis sous forme de chaîne. Donc, si nous voulons passer
quelque chose sous forme d'entier, nous devons
le convertir dans le backend. Nous ne pouvons pas transmettre de valeur entière
en utilisant le paramètre de route, et c'est également vrai
pour les paramètres de requête. Rappelez-vous donc toujours que
lorsque vous définissez paramètres de
route ou des paramètres de
requête, vous
devez
convertir sa valeur
en utilisant la méthode parse integer ou
parse float Je crée intentionnellement cette
erreur pour vous montrer ce qui pourrait arriver si nous créons une API et un
identifiant Xs dans le paramètre de route.
34. API POST pour ajouter un nouveau todo: Créons maintenant une API de publication pour
ajouter un nouvel objet à faire. Comme nous le savons, pour créer de
nouvelles données sur le serveur, nous utilisons l'API post. Également lors de la post-requête, front-end enverra
des données au serveur. Par exemple, nous créons ici API de
publication pour ajouter un nouveau todo Notre interface enverra donc informations sur les tâches,
telles que la tâche, balises et le statut, dans le
corps de cette demande À partir de ces informations, comment pouvons-nous ajouter un nouveau todo dans notre tableau todos Ne vous inquiétez pas, laissez-moi
vous le montrer de façon pratique. Nous définissons donc ici l'
API de publication en utilisant app point post, et au premier argument, nous transmettons notre point de terminaison. Passons slash todos
au deuxième argument,
nous passons la fonction de rappel avec deux paramètres,
request et response Vous pouvez maintenant vous demander si ces
deux points de terminaison sont identiques. Comment pouvons-nous utiliser ces
API individuellement ? Nous pouvons donc voir ici que cette
API utilisait la méthode
Get et que la deuxième API
utilisait la méthode post. Lorsque le front end envoie une demande d'
API sur ce
point de terminaison avec la méthode G, cette fonction s'
exécute et si le frontend envoie une demande d'API sur le même
point de terminaison avec la méthode post, alors cette fonction s'exécute Nous verrons comment envoyer une
demande de courrier dans une minute. Maintenant, comme nous le savons depuis le front-end, nous envoyons des données dans le corps de la
demande et comment
pouvons-nous obtenir des informations relatives
à la demande dans cette fonction ? Nous pouvons utiliser ce paramètre de
requête. Dans cette demande, nous obtiendrons toutes les informations relatives à
cette demande particulière. Ici, nous avons une demande, et dans cette demande, nous avons une propriété appelée corps. Ce corps contient toutes les données front end envoie
avec la demande, qui est notre objet todo, nous les stockons dans
une variable appelée todo Et après cela, il suffit de
consol dot log this todo, et response
point send this to Maintenant, goûtons, nous obtenons des données dans notre
variable todo ou non Auparavant, nous envoyions une
simple requête Get à partir de l'URL du navigateur car, par défaut, le navigateur envoyait une demande
Get à l'URL, mais nous ne pouvons pas envoyer d'autres requêtes
SDDPRQuest à l'aide Pour cela, nous avons besoin d'un code
frontal, nous pouvons utiliser un
logiciel de dégustation d'API tel que Postman, ou nous pouvons également utiliser une extension de code VS
appelée client Thunder À partir de ces trois options, l'installation de l'extension VSCode
est beaucoup plus facile à configurer Donc, dans ce cours, nous utiliserons
probablement le client
Tender et Postman à la fois parce que nous
goûtons à l'API avancée,
nous avons besoin de Postman Mais ne vous inquiétez pas, les deux
interfaces sont identiques. L'essentiel est que nous puissions
goûter à notre API, c'est aussi simple que cela. Accédez à la
version finale de l'extension à partir d'ici, recherchez le
client Thunder et installez-le. Maintenant, dans notre liste de panneaux, cette icône de client d'appel d'offres est
ajoutée. Ouvrons-le donc. Et ici, nous pouvons tester nos
API pour notre projet. Tout d'abord, nous
saisissons l'URL de notre API, qui est SDDP, colonne double barre
oblique, hôte local,
colonne 3 000 barre oblique colonne 3 000 Et de quelle méthode nous avons besoin,
nous avons besoin de la méthode post. Nous sélectionnons donc la publication à partir d'ici, et maintenant nous devons transmettre Todo
Object dans le corps de notre requête Donc pour cela, nous sélectionnons ici
le corps et dans l'option JSON, ici nous allons transmettre
nos données en objet. Le premier champ dont nous avons besoin est la tâche. Nous devons transmettre le nom du champ en double code et
nous devons également transmettre la valeur
en double code. Il s'agit d'une nouvelle tâche. De plus, si vous ne pouvez pas voir correctement
ces remplissages, fermez ce pénal en utilisant
Control plus B ou
Command plus B.
Ensuite Control plus B ou
Command plus B. , nous avons besoin d'un autre
champ, les tags,
et nous passons ici array,
dans lequel et nous passons ici array, nous passons deux
valeurs SGML et CSS Dernier statut et valeur de remplissage, disons, à faire. Maintenant,
voici une chose. Ce nom de remplissage,
qui est cette tâche, statut
fiscal, ces noms sont
définis par le développeur du backend Quel que soit le nom défini par le
développeur Bend, développeur
frontal doit envoyer les données avec le
même nom de champ. Sinon, comment, dans
le back-end, nous
récupérons les données du
corps de la demande Pour envoyer cette demande de publication, nous cliquons sur le bouton Envoyer. Vous voyez, nous n'avons rien obtenu, et si nous vérifions notre terminal, nous devenons également indéfinis Pourquoi nous n'obtenons pas les données contenues dans notre objet
de demande, ce que nous faisons de mal. Lorsque le front-end
envoie une requête post, il envoie des données dans le corps de
la demande au format JCN, et c'est ce que nous avons également fait
dans notre demande de test Par défaut, le
serveur Express ne sait pas comment lire et
comprendre automatiquement ces données JSN Pour Express, nous avons besoin d' un traducteur qui
convertira ces données JSN en un simple objet Javascript car nous ne pouvons pas
travailler directement avec les données JSN Nous devons le convertir en objet ou
en tableau, ce que notre Javascript
peut comprendre. Pour cela, nous avons un
intergiciel dans Express, qui fonctionnera en tant que traducteur Donc, après la variable todos, nous ajoutons app point U, et dans cette variable, nous
appelons notre middleware express point JSN et Assurez-vous d'ajouter ce
middleware avant nos API, et vous devez également l'appeler express point
JS et Dans le cas contraire, cela ne fonctionnera pas. Actuellement, sans ce middleware GSN
express point, corps du
point de requête Maintenant, enregistrons les modifications
et envoyons à nouveau une demande de publication. Vous voyez, maintenant nous obtenons le corps du point de
demande
, comme nous envoyons cet objet. D'où l'importance du middleware
Express point JSn. Il ne nous reste plus qu'à ajouter ce
nouveau todo dans notre tableau todos. Nous utilisons donc ici
une méthode de tableau simple, todos array point push Cela ajoutera de nouvelles données à la
dernière position du tableau. Et ici, dans la méthode push, nous passons un objet parce que tous
nos objets sont dans un objet, et nous devons suivre la même structure d'
objet
pour que le nouveau puisse le faire Donc, tout d'abord,
nous avons besoin d'une pièce d'identité et comment
pouvons-nous obtenir le document que nous ne
l'avons pas transmis dès le départ. Donc, pour l'identification, nous pouvons faire
quelque chose comme ça. Nous obtiendrons l'
identifiant du dernier à faire et l'augmenterons d'une unité. Donc, pour obtenir la dernière chose
à faire de la liste, nous écrivons le tableau todos en paquet
carré, tableau todos dot
Length, qui est actuellement Mais nous savons que
l'index des tableaux commence par zéro. Nous devons donc faire ici
la longueur moins un. Donc, ce tableau
Tds entre crochets, longueur de point du tableau
Tds moins
un, est notre dernier objet à faire, et nous voulons accéder à son identifiant Nous ajoutons donc ici un identifiant et l'augmentons
simplement d'un. Donc, si la longueur de notre flèche est de trois, alors trois moins un , soit deux, qui est l'
indice du dernier élément. Ensuite, nous accédons à son identifiant
et l'augmentons d'un, soit quatre, c'est aussi simple que cela. Ensuite, nous avons une tâche remplie, et nous passons une valeur pour ce que nous obtenons à partir du corps du point de
requête, et pour accéder à la
tâche ad point task. Ensuite, nous avons du texte, et nous passons la valeur au texte à points Enfin, nous avons le statut.
Quel est le statut ? Nous allons faire le statut de point. Maintenant, je pense que cela
pourrait vous embrouiller. Nous définissons cet
objet Nut séparément. C Nu todo équivaut
à dépasser cela ici. Et dans la méthode push, nous ajoutons simplement cette nouvelle tâche. Je pense que cela semble plus clair. De plus, une chose
que je veux vous dire dans n'importe quelle API à la fin de
la fonction de rappel, nous devons au point de réponse sg Sinon, sur notre front end, notre demande continue de fonctionner, ce qui réduit notre vitesse
globale. Assurez-vous donc que dans chaque
API, nous renvoyons quelque chose. Vous vous demandez peut-être ce que nous devons renvoyer suite à la demande de poste ? À partir de la demande de publication, nous pouvons renvoyer les données
récemment ajoutées sur notre serveur à la base de données. Ainsi, notre interface reçoit toutes les informations, telles que l'identifiant,
et les utilise comme bon lui semble. Ici, nous renvoyons simplement cette nouvelle tâche, enregistrons les modifications, jetons un coup d'œil,
renvoyons la demande et voyons maintenant que nous
obtenons des données portant l'ID quatre. Si nous récupérons tout ce qu'il faut faire
dans la requête Get, C, nous obtenons quatre tu dos Nous avons donc réussi à
créer une demande de publication et à ajouter un nouveau Tudo dans
notre tableau Tudos Récapitulons rapidement ce que
nous avons appris dans cette leçon. Nous utilisons donc une requête de publication pour créer de nouvelles données sur le serveur, et nous obtenons ces nouvelles données à partir
du corps de la
demande de publication envoyée par le front-end. Pour en avoir le goût, nous utilisons cette
extension pour les clients d'appel d'offres et envoyons nos données dans JCNFMat , le
format courant pour l' Maintenant, dans le back-end,
nous devons convertir ces données au format
Javascript simple, et c'est pourquoi nous utilisons Express D JCNMDDLEWARE et les
ajoutons Sans ce
point Express JCNMDDLEWARE, requête
devient Ensuite, nous ajoutons les nouvelles données dans
un objet séparé avec toutes les remplies, puis nous les insérons simplement dans le
tableau de Tudou et, à la fin, nous
renvoyons les nouvelles données ajoutées à
partir du point de réponse SN est aussi simple que ça.
Dans la leçon suivante, nous allons améliorer
cette requête de publication.
35. Valider les Données utilisateur: Actuellement, notre interface envoie les données
qu'ils souhaitent envoyer. Mais que se passe-t-il si quelqu'un n'envoie pas les données requises, telles que le
texte Tas, le tableau de texte ou le statut. Sans eux, nous ne pouvons pas ajouter données
incomplètes dans notre espace de stockage. C'est mauvais pour notre application. Dans cette condition,
nous devons donc ajouter la
validation des données dans notre API. Ainsi, au début de notre API, nous vérifierons que le front-end transmet ou non toutes les données
nécessaires. S'il ne transmet pas les données
appropriées, nous arrêtons
immédiatement la demande avec un message d'erreur
approprié. Laissez-moi vous montrer ce que je veux dire. Ici, après avoir obtenu les données
du corps du point de
demande, nous ajoutons une condition simple. Si la tâche todo point n'
est pas disponible, nous renvoyons une erreur à partir de là Donc, entre crochets Cali, nous écrivons un point de réponse : la tâche d'
envoi est requise. Maintenant, voici une chose. Même si nous écrivons ici
response point send, notre code restant
fonctionnera également. Pour arrêter d'exécuter le
code à partir d'ici, nous devons ajouter ici return. Sans ce retour, le code
restant s'exécutera de toute façon. N'oubliez pas d'ajouter le retour. Maintenant, dupliquons ce que je bloque deux fois de plus en utilisant Sift plus
alter plus flèche vers le bas ou option
Sift plus flèche vers le bas. Maintenant, il suffit de changer
la condition pour que le texte soit un texte à points et de modifier le message d'erreur. Les textes sont obligatoires. Enfin, pour faire un point status, un
statut est requis. De plus, ici, nous pouvons vérifier d'autres
conditions, comme le texte doit être un tableau ou la valeur de la tâche doit être supérieure à trois
caractères, etc. Pour l'instant, nous ne
voulons pas cette complexité, alors goûtons à cette
implémentation. Enregistrez les modifications,
ouvrez la version préliminaire de l'article, et nous supprimerons simplement
ce remplissage de tâches. Envoyez la demande et vous
verrez que nous recevons
ce message. La tâche est obligatoire. Magnifique. Maintenant, sur le front-end, il
suffit d'afficher
ce message d'erreur sur le formulaire ou à l'endroit où
ils souhaitent l'afficher. De cette façon, nous pouvons
valider manuellement les données de nos champs de saisie. Mais il ne s'agit que de trois remplissages. Imaginons que nous ayons sept à huit
champs et que pour chaque champ, nous voulions valider les données. Ensuite, nous devons écrire cette
condition sept à huit fois. Y a-t-il un autre
moyen de le faire ? Oui Disposer d'une bibliothèque spéciale pour
valider les données utilisateur La première est la joie. Il s'agit de l'une des
bibliothèques de validation de données les
plus populaires et les plus
robustes de node JS, et nous utiliserons également joy
pour la validation des données
dans ce cours. Il existe également une autre bibliothèque comme yap et validator dot js Vous pouvez utiliser n'importe laquelle de ces bibliothèques. Personnellement, j'aime la joie, et nous utiliserons la joie
dans le prochain projet. Actuellement, nous nous concentrons principalement sur la création d'API participatives,
c' est-à-dire sur la création, la lecture, la
mise à jour et la suppression d'API.
36. Passer un code de statut: Maintenant, lorsque nous renvoyons une
erreur depuis le serveur, il est préférable de transmettre également le code d'erreur avec
ce message d'erreur. Grâce à cette erreur ou à ce code d'état, notre interface obtient
des informations sur le succès ou l'échec
de la SDDPRquest Vous le
savez peut-être déjà ou vous avez peut-être vu cette erreur. Par exemple, lorsque nous
ne trouvons pas de page Web,
vous savez que certains sites Web
affichent une page 404 introuvable. Ce 404 est le code d'erreur ou d'
état de « Introuvable ». Consultez le code d'erreur ou d'
état le plus courant pour SDDPRQuest. Le premier est 200, ce qui signifie tout o. Il s'agit du code
d'état par défaut envoyé par notre application
express. Dans notre demande également, vous pouvez voir ici que nous
obtenons le statut 2000. Ensuite, nous avons le code 201, ce qui signifie créé
avec succès. Si nous créons de nouvelles
données sur notre serveur, nous pouvons renvoyer
ces données avec le code d'état 201. Vous dites dans quelle méthode HTTP, nous pouvons renvoyer le
code d'état à 01, écrire ? Dans la demande de publication, si nos
données sont créées avec succès. Ensuite, nous avons le statut 400, ce qui signifie une meilleure demande
effectuée par le front-end. Il s'agit notamment de certaines demandes d'
accès manquantes, non
valides ou non autorisées. Et oui, pour la validation des données, nous renverrons un message d'erreur
avec ce code d'état 400. Ensuite, nous avons 404, ce qui signifie introuvable. Supposons que nous envoyions
une requête get pour que le
single soit utilisé avec l'ID ten. Maintenant, cela n'est pas
disponible dans nos données. Donc, à ce moment-là, nous pouvons envoyer une réponse avec le code d'état 404. Un autre code
d'état important est 500, ce qui signifie une erreur interne
du serveur. Supposons que nous obtenions une erreur
lors de la création de la nouvelle tâche
à effectuer sur ce serveur. Ensuite,
nous vous enverrons une
réponse avec le code d'état 500. Il existe de nombreux codes d'état, mais pour l'instant,
ils sont très utiles. Ne vous inquiétez pas avec l'entraînement, vous vous souviendrez de tous
ces codes de statut. Maintenant, pour transmettre le
code d'état à notre réponse, nous pouvons ajouter ici plusieurs curseurs. Appuyez donc sur Alt ou Option et cliquez simplement à l'endroit où
vous voulez un curseur multiple. Et ici, nous ajoutons le statut par point, et dans ce code de statut, nous voulons transmettre
des données non valides. On passe le cap des 400 et c'est tout. Appuyez sur SCAP pour supprimer plusieurs curseurs et pour que nous puissions transmettre le code de données
avec notre demande De plus, si nous
créons des données avec succès, nous renvoyons une réponse
avec Stas 201 Conservez le fromage Chan
et jetez-y un œil. Envoyez à nouveau la demande et vous verrez,
ici, nous obtenons le code d'état d'erreur, 400 demandes erronées. Charmant.
37. res.send et res.json: Jusqu'à présent, nous envoyons la réponse en utilisant la méthode
response point send. Mais cette méthode Sen du point de réponse est utilisée à des fins générales, qui signifie que dans cette méthode du point de
réponse SN, nous pouvons envoyer n'importe quel type de
contenu comme du texte brut, du SDML ou nous pouvons également
transmettre des données JSON Maintenant, lorsque nous créons une API dans un nœud, nous
voulons la
plupart du temps renvoyer des données dans le JSNFMat car c'est
beaucoup plus facile Ici, dans la réponse, nous avons une autre méthode
appelée point de réponse JSON. Cela convertira automatiquement nos données dans le JCNFMat et définira
également le type de contenu de l'
en-tête sur la barre oblique de
l'application Ne vous inquiétez pas si vous ne
connaissez pas le type de contenu d'en-tête, nous le verrons dans
la section suivante. Nous utiliserons l'
envoi par point de réponse pour les réponses simples, qu'il s'agisse de texte, de SDML ou d'objets, et nous utiliserons le point de réponse JSN lorsque nous voulons nous assurer que la réponse est au format JSN et correctement formatée Les deux fonctionnent presque de la même manière. Mais pour les données JSN, le point de
réponse GSN est
plus pratique Dans la première demande GAD, nous voulons envoyer un texte brut Nous utilisons ici le point de réponse SN. Après cela, nous voulons envoyer
à do array, afin de pouvoir utiliser ar
response point JSN ensuite, nous voulons
également envoyer un objet,
puis ce que nous utiliserons Nous utilisons le point de réponse JSN. Supprimons
également cette console. Nous n'avons pas besoin de consoles sur
notre serveur. C'est juste pour tester. Ensuite, nous
renvoyons ici une erreur. Tout d'abord, nous changeons l'
envoi avec JSN JSON, et JSN il vaut mieux
transmettre cette erreur dans l'objet Enveloppez cette chaîne dans un objet et ajoutez
simplement la
propriété du message et deux points. Nous faisons de même pour cette erreur et
également pour cette dernière erreur. Et lorsque nous
créons avec succès un nouvel objet à faire, nous renvoyons
le nouvel objet à faire. Nous changeons donc également
le sable avec JSON. Assurez-vous de ne pas transmettre texte
brut dans la méthode JN de
réponse. Cela vous donnera une erreur. Enregistrez les modifications et, lors
des tests précédents, accédez à la section d'en-tête. Nous avons ici un tas de détails, mais pour l'instant, nous avons besoin de
ce type de contenu. Vous voyez, il est défini sur le texte STML. Maintenant, envoyons une autre demande de publication
non valide. voyez, ici, nous obtenons un objet que nous envoyons avec la propriété du
message, et maintenant si nous vérifions
notre type de contenu, voyons qu'il est défini sur JSON. Utilisez le point de réponse envoyer
pour du texte brut ou du DML et utilisez le point de réponse
JSN pour envoyer des données GSN
38. Mettre à jour un tout simple avec la requête PUT: Créons maintenant une API pour
mettre à jour notre todo unique. Supposons que nous voulions
mettre à jour le texte de la tâche ou que nous voulions mettre
à jour le statut. Nous voulons donc ici
mettre à jour de petits détails
sur nos données actuelles, ou nous pouvons également mettre à jour
toutes les informations. Il vaut donc mieux utiliser la requête
here put. Vous pouvez également utiliser votre
méthode de page. C'est totalement bon. Donc, l'application ne met pas 0,2 barre oblique sur Todos. Nous avons maintenant besoin de l'
identifiant todo que nous voulons mettre à jour. Nous ajoutons ici le
paramètre de route, le calm ID. Après cela, nous ajoutons une fonction de
rappel avec
demande et réponse Maintenant, commençons par
obtenir le paramètre ID. CSid est égal à l'ID des paramètres
point de requête. Nous savons que cet identifiant est une chaîne, nous l'enveloppons
donc avec la fonction
parse integer Notre première tâche est
de trouver quel élément du
tableau possède cet identifiant. Ensuite, grâce à cet indice d'élément, nous pouvons modifier d'autres
valeurs très facilement. Donc, pour trouver l'index, nous utilisons la méthode todos array dot
find index Ici, nous obtenons un seul
objet à faire dedans, puis nous passons condition T ID qui doit être
égale à notre paramètre ID. Cette expression renvoie
l'index de l'élément, stockons
donc dans une variable
appelée to do index. Et si l'utilisateur passe un identifiant, qui n'est pas disponible
dans notre tableau ? À ce moment-là, cette
valeur d'index todo deviendra moins un car cette méthode d'
indexation fine renvoie moins un si vous ne
la trouvez pas Ici, nous passons si l'
index de la condition à faire est égal à moins un. Ensuite, nous renvoyons le
point de réponse 404, qui n'est pas trouvé, puis le
point Json et nous envoyons l'objet avec un message de propriété et renvoyons
simplement ici le
message « introuvable ». Assurez-vous d'ajouter ce retour
ici. Génial. Supposons que nous
trouvions un index todo, alors nous devions mettre à jour les champs de
cet élément avec nos nouvelles données transmises
avec la demande d'API Donc, en haut,
nous obtenons d'abord les données du corps du point de requête et nous stockons
cet objet dans la variable todo Maintenant, au lieu de définir
trois variables différentes, nous pouvons utiliser ici la déstructuration
d'objets À la place du nom de variable, nous pouvons simplement ajouter des crochets
CLI et écrire les noms de nos propriétés qui sont passés dans le corps du point de demande. Tout d'abord, nous obtenons la tâche, puis le texte, puis
le statut. Et c'est tout. Cette seule ligne de code fonctionne la même manière que ces
trois lignes de code. Maintenant, dans la mise à jour, ce
n'est pas à chaque fois que nous
changeons de tâche ou
que nous changeons uniquement des données Nous pouvons modifier n'importe laquelle de
ces trois propriétés, et notre interface
ne doit transmettre que les propriétés
qu'elle souhaite modifier
dans le corps et notre interface
ne doit transmettre que les propriétés
qu'elle souhaite modifier
dans le corps
de la requête. Ici, nous pouvons faire
quelque chose comme ça. Si la tâche est disponible, nous avons mis à jour le tableau pour
faire en sorte que la tâche par point d'index
soit égale à tâche. Donc, si cette tâche est disponible
dans le corps de la requête, seule la ligne mettra
à jour la propriété de la tâche. Répliquons cette
condition I deux fois de plus. Remplaçons cette tâche par
des tags, des tags et des tags. De plus, ce statut, statut, voici le
statut, et c'est tout. De plus, il nous
manque une chose. Pouvez-vous me dire que nous devons
renvoyer une réponse à la
fin de cette fonction. Point de réponse Json et ici nous envoyons notre objet à
jour. Tableau Todos en
paquet carré, index todo. Enregistrez les modifications et
goûtons à cette implémentation. Accédez donc à Thunder Client
et créez une nouvelle demande, écrivez notre point de terminaison, qui
est l'hôte local SDDP, colonne 3 000 Todos Ici, nous passons todo
ID. Disons un. Changez cette méthode Get pour mettre méthode et transmettons
les données dans le corps de la requête. L'objet doté de la propriété task et de
la valeur correspondante est
la tâche mise à jour. Et il vous suffit d'envoyer la demande. Vous voyez, nous obtenons ici
les données mises à jour. Et si nous passons ici l'ID
dix et envoyons la demande, nous obtenons ici
un message d'erreur introuvable. Vous pouvez voir à quel point
il est simple de créer un PI. Donc, si vous souhaitez
enregistrer votre test, appuyez sur Control plus ou
Command plus, puis à partir de là, nous pouvons également renommer notre demande de
test
39. Exercice Supprimer un todo spécifique: Il est maintenant temps de faire un exercice
intéressant. Vous devez créer une API pour supprimer la tâche spécifique
à effectuer à l'aide de son identifiant. C'est un exercice très facile. L'exercice vous aidera à apprendre rapidement et à renforcer
votre confiance en vous. Même si vous ne pouvez pas terminer
l'exercice en entier, essayez
au moins de le résoudre, car
c'est
ainsi que vous saurez sur quelle partie
vous devez travailler le plus. Essayez-le et
quelle est la solution. J'espère donc que vous allez résoudre cet exercice ou du
moins essayer de le résoudre. Voyons maintenant rapidement
la solution. Nous définissons donc ici
une nouvelle API à l'aide l'application point Tilt, car nous
supprimons des données ici, points de terminaison pour effectuer un identifiant Callan, une demande de
rappel, une réponse Tout d'abord, nous obtenons l'ID
à partir du paramètre de route. Const ID est donc égal à
request point params point ID, et il suffit de l'envelopper avec la fonction
parse integer. Cette pratique d'analyse des entiers
est très utile car lorsque j'apprends node Jaz, je répète souvent cette
erreur Assurez-vous de ne pas
répéter cette erreur. Ici aussi, nous devons d'abord
trouver l'index de
l'objet todo, qui possède cet identifiant Donc, à partir de la méthode Put, nous copions cette ligne variable, et nous copions également cette
condition pour
introuvable et nous les insérons
dans notre méthode de suppression Maintenant, après cela, nous
devons simplement supprimer ce todo spécifique
de notre tableau todos Pour cela, nous utilisons la méthode d'épissage par points du
tableau todos. Pour cela, nous devons faire
valoir deux arguments. Tout d'abord, quel index
nous voulons supprimer, c'
est-à-dire cet index pour le faire. Le deuxième argument est le
nombre d'éléments que
nous voulons supprimer
de cet index. Supposons que nous ayons une valeur d'indice deux, et que nous en passons ici trois. Cette méthode d'épissage supprimera trois éléments avec
l'indice deux, et elle supprimera également l'élément avec les
index trois et quatre Dans notre cas, nous voulons simplement
supprimer cet élément,
nous en passons un ici, et à la fin, nous
renvoyons simplement le point de
réponse Json et ici nous passons le message de
réussite, l'objet avec la propriété du message et la valeur deux supprimés avec succès. Enregistrez les modifications, et goûtons également à
cette demande de suppression. Créez une nouvelle demande,
remplacez l'URL par STP, colonne double
barre oblique vers l'hôte local, colonne 3 000 slash Studo Supprimons la
tâche dont l'identifiant est Sélectionnez la méthode de suppression. Ici, nous ne voulons rien
transmettre dans corps de
notre demande,
envoyez cette demande. voyez, ici, nous recevons un message de
réussite, ce qui signifie que notre première tâche est supprimée de
notre tableau de tâches. Maintenant, si nous envoyons à nouveau la
demande avec le même identifiant, voyez, nous ne sommes pas trouvés. Y. Vous pouvez voir que créer des API n'
est pas si difficile Et dans cette section,
nous avons créé les API get, post, put, delete,
all crud J'espère donc que vous
comprenez comment utiliser Express et créer des
API augmentées avec Express. Dans la
section suivante, nous allons apprendre quelques
concepts avancés d'Express Rendez-vous dans la section suivante.
40. Section 05 - Présentation du middleware: Bienvenue dans la cinquième section du cours ultime de NodeJS Cette section traite des concepts
avancés d'express
et de nœud. Nous commençons par les intergiciels, multiples types d'intergiciels, façon de travailler avec
différents environnements tels que le développement ou la production, moteurs de
modèles et la structure professionnelle complète
de l'application Commençons par le middleware.
Qu'est-ce qu'un intergiciel ? Dans Express, un intergiciel est une
fonction qui appelle la
fonction intergicielle suivante ou envoie une réponse pour mettre fin à la En termes simples, quelle que soit la
fonction qui appelle la fonction intergicielle suivante ou envoie une réponse pour
mettre fin à la demande, cette fonction est
appelée Maintenant, permettez-moi de vous poser une question. Pensez à cette
fonction de rappel que nous transmettons ici. Pouvons-nous appeler cette
fonction un intergiciel ? Oui, car cette fonction
envoie une réponse pour
mettre fin à cette demande Gad Lorsque notre interface envoie des
demandes à un point de terminaison d'API, ces demandes
passent par un tunnel ou un pipeline dans lequel toutes
nos fonctions
intergicielles sont placées en ordre Ce pipeline est appelé pipeline de traitement des
demandes. Supposons que nous définissions ici le
premier intergiciel, le second
et le dernier intergiciel trois qui
enverront enverront Maintenant, lorsque le front end
envoie une demande d'API, cette fonction middleware
one s'exécute d'
abord Ensuite, cela transmettra notre demande au
middleware NST 2, et une fois
l'exécution terminée, le middleware 2 transmettra cette demande au
middleware 3, notre demande au
middleware NST 2,
et une fois
l'exécution terminée, le
middleware 2 transmettra
cette demande au
middleware 3,
qui enverra la réponse. Notre serveur
maintiendra cet ordre. Si nous obtenons une erreur dans le premier
intergiciel,
les deux autres
intergiciels ne fonctionneront pas. est aussi simple que ça. quelques tâches courantes relatives
aux intergiciels Le premier est utilisé pour
enregistrer les détails de la demande. En outre, il est utilisé pour vérifier que l'utilisateur qui envoie la demande
est connecté ou non. Il s'agit du cas d'utilisation le plus courant et
le plus efficace des intergiciels. Ne vous inquiétez pas, nous verrons cela dans la section d'authentification des utilisateurs. Maintenant, la dernière
tâche courante du middleware consiste à transmettre les données entrantes
. Nous l'avons déjà fait. N'oubliez pas que ce point JCN
est une fonction intergicielle, qui transmet les données
entrantes au format
JSON, puis
transmet notre demande à la fonction
intermédiaire suivante,
qui est au format
JSON, puis cette fonction principale qui Maintenant, vous vous demandez peut-être pourquoi nous avons
besoin de ces intergiciels ? Pouvons-nous écrire tout le code
dans une seule fonction ? Pour cela, imaginez que
nous créons Bend pour une application de
réseau social. Disposez d'une API qui est utilisée
pour créer un nouveau message. Nous voulons maintenant définir les
conditions de cette demande. Seuls les utilisateurs connectés peuvent
créer une nouvelle publication. Si l'utilisateur n'est pas connecté, nous renverrons un message d'erreur, veuillez vous connecter avec votre compte. Nous avons maintenant une autre API qui est utilisée pour ajouter des likes
dans un seul article. Dans cette API, nous voulons également la même condition, à savoir
que l'utilisateur doit se connecter. Ici, nous devons à nouveau
ajouter le même code. Désormais, au lieu de répéter ce code de
vérification verrouillé, nous pouvons le définir dans une fonction
intergicielle et simplement ajouter ce middleware
pour toutes les De cette façon, nous n'avons pas
besoin de répéter notre code. En utilisant un intergiciel, nous divisons
notre code en petits morceaux, ce qui le rendra
propre et plus De plus, grâce à un intergiciel, nous pouvons empêcher les utilisateurs
indésirables de demander à
accéder aux routes protégées Pour récapituler rapidement, un intergiciel est une fonction qui, appelée intermédiaire suivante,
envoie une réponse à la envoie une réponse Nous pouvons constater que le middleware est très utile pour n'importe quelle application de
nœud Dans la prochaine leçon, nous
verrons comment créer des intergiciels
41. Créer un middleware personnalisé: Créons maintenant notre
propre intergiciel personnalisé. C'est vraiment simple et
passionnant. Ici, dans notre application, nous avons déjà ajouté express
point Json Middleware en utilisant app point U. Maintenant, après cela, nous ajoutons
une autre méthode AbdTuuse, dans laquelle nous Cette
méthode ABDTuse est donc utilisée pour ajouter un
intergiciel global à intergiciel global à Maintenant, dans cette méthode d'utilisation, nous passons la fonction de rappel. Cette fonction Colbec
comporte trois paramètres, réponse à la
demande et le suivant Maintenant, vous pouvez demander, nous connaissons la
demande et la réponse. Mais quel est le paramètre suivant ? Ce paramètre next est utilisé pour appeler la fonction
middleware suivante Maintenant, dans cette
fonction de rappel, nous écrivons notre logique. Supposons que nous voulions
enregistrer par points sur console nos
méthodes de demande et nos points de terminaison Dans la chaîne du modèle,
nous ajoutons des crochets dollar C, méthode du point de
demande, l'URL du point de demande dollar
cbakets Maintenant, voici une chose. Dans
tous les intergiciels personnalisés, que nous définissons,
dans la dernière partie, nous devons appeler
cette fonction suivante Sinon, notre
demande sera bloquée dans ce middleware et l'utilisateur
n'obtiendra pas de Laissez-moi vous le montrer de
façon pratique. Enregistrez les modifications et revenez
à notre client Tunder. Permettez-moi d'ouvrir cette demande
et de l'envoyer. Oh, désolé, j'ai oublié de lancer cette application
avec nodemon Assurez-vous que votre application est également en cours d'exécution dans le terminal. Le point d'index Nodemon est bon. Nous envoyons maintenant cette demande. Tu vois, c'est en cours de traitement. Et si nous ouvrons notre terminal, C, nous obtenons
ici la console
de cette requête, ce qui prouve que notre fonction
middleware est appelée Notre
pipeline de traitement des demandes actuel est donc le suivant. Tout d'abord, nous avons exprimé le middleware
adjacent, puis nous avons le middleware personnalisé, puis nous avons la
dernière fonction du middleware qui renvoie la puis nous avons le middleware personnalisé,
puis nous avons la
dernière fonction du middleware qui renvoie la réponse. Lorsque nous n'appelons pas la fonction middleware
suivante, notre requête est bloquée ici dans ce middleware et elle nous
indique l'état du traitement, qui ralentit l'ensemble de notre application C'est pourquoi n'oubliez pas que
dans chaque intergiciel personnalisé, il est nécessaire d'appeler la fonction intergicielle
suivante, sinon nous renvoyons la
réponse Ici, nous appelons la fonction
middleware suivante, enregistrons les modifications
et jetons un coup d'œil Maintenant, si nous envoyons à nouveau
la demande, vous voyez, ici nous obtenons la réponse
et dans la console, nous obtenons également le journal des demandes. C'est aussi simple que cela de définir notre fonction d'
intergiciel personnalisée Je sais qu'il s'agit d'une fonction d'
intergiciel très basique, mais à l'avenir, nous créerons un
intergiciel personnalisé qui vérifiera si notre utilisateur est
connecté ou non De plus, lorsque nous définissons notre intergiciel à l'aide de la méthode
app point use, ce middleware
s'appliquera à tous les appels d'API, tout comme ce middleware express
42. Conçu dans Middleware: Express, nous avons très peu d'intergiciels
intégrés. Nous utilisons déjà l'un
des
intergiciels intégrés qui est
express point Ce middleware transmet données du corps de
notre requête au
format JSN Sans utiliser ce middleware, nous ne pouvons pas intégrer de données dans le corps de la
requête. Vous souvenez-vous que nous
n'avons rien reçu dans le corps de la demande ? Maintenant, un autre
intergiciel intégré utile est le codage URL. Il s'agit d'un
intergiciel intégré similaire comme
express point JSON Middleware Express point JSN utilisé pour transmettre JSNData et
intergiciel codé par
URL press point utilisé pour transmettre les données codées JSNData et
intergiciel codé par
URL press point utilisé pour transmettre les données codées par URL. Ce
format de données codé par URL est généralement utilisé lorsque les données sont envoyées via simples formulaires SML à l'aide de
la méthode post En termes simples, ces
deux intergiciels sont utilisés pour extraire les
données de la demande que Quest possède JCNData,
Express utilise JCN Middleware et
lorsque notre demande contient des données au format URL codé, Express utilise ce middleware codé par URL . Les fonctions du middleware
simplifient le processus d'accès aux données des demandes, nous n'avons
donc pas besoin de les
analyser manuellement aussi simplement que cela Voyons maintenant comment ajouter intergiciel codé par
URL dans
notre application . C'
est vraiment simple. Nous ajoutons ici app.us
et à l'intérieur de celui-ci, nous appelons la fonction Express point
URL encodée Enregistrez les modifications et
voyons si ce middleware
fonctionne ou non Nous passons à la demande de publication. Auparavant, nous envoyions des
données à l'aide de ce format JSON. Nous avons maintenant une autre
option qui est codée par formulaire. Ici, nous transmettons les données dans une paire clé-valeur comme une tâche
et nous ajoutons notre texte. Il s'agit d'une nouvelle tâche encodée. Ensuite, nous
voulons transmettre du texte,
qui est un tableau, dans lequel
nous transmettons le SDML et le CSS Enfin, nous voulons adopter le
statut, ce qui est normal. Il ne reste plus qu'
à envoyer cette demande. voyez, ici, nous obtenons de nouvelles données
créées avec le statut 201, notre URL encodée fonctionne.
Mais attendez une minute. Nous obtenons ici cette étrange
syntaxe de ce tableau. En fait, il ne s'agit pas d'un tableau. Notre serveur enregistre ce
tableau sous forme de chaîne. Tu vois, c'est codé
en double code, ce qui signifie que c'est une chaîne. Pourquoi cela se produit.
Lorsque nous voulons transmettre un tableau ou un objet au format codé par
formulaire, nous devons ajouter un
paramètre supplémentaire dans notre intergiciel Ici, dans le middleware
codé par URL, ajoutez un objet dont la propriété unique étendue à true. Sauvegardez ceci. Et dans la requête post, au lieu de passer ce
tableau dans un seul champ, nous devons le transmettre
dans différents remplissages. Comme le nom de notre tableau est tags, nous écrivons
donc des balises, et ici nous ajoutons des crochets, qui indiquent qu'il s'agit d'un tableau, puis nous transmettons des valeurs
dans plusieurs remplissages. Nous écrivons d'abord DML. Ensuite, nous ajoutons une autre paire
clé-valeur, encore une fois, balises, un paquet carré, et nous
écrivons une autre valeur CSS. Enfin, nous transmettons des balises, paquets
carrés et du JavaScript. Vous comprenez maintenant
pourquoi les développeurs cessent d'utiliser ce format
codé par formulaire. JSNFMat est beaucoup plus facile
à transmettre et à déguster. Vous voyez, nous avons maintenant notre tableau de texte. Voyons également si nous supprimons les propriétés
étendues
du middleware qui
fonctionne toujours ou non. Je veux
juste voir. Oh, ça ne marche pas. voyez, ici, nous recevons
des textes obligatoires, ce qui signifie que nous
ne recevons pas de textes. Dans les versions précédentes du nœud,
cela pouvait fonctionner. Mais comme nous utilisons sa
dernière version de nœud, cela ne fonctionne pas,
il est donc préférable de l'étendre à true,
c'est aussi
simple que cela. Vous vous demandez peut-être
quel intergiciel devons-nous ajouter dans notre projet
node JS ? Point express codé au format JCN ou
Express URL. Dans le monde moderne, 90 % des développeurs utilisent JSNFMat Le JSNMDDLEWARE est courant. Mais si vous ne savez pas
dans quel format, votre interface
enverra les données de demande, codées au format
JSN ou sous forme de formulaire, ajout des deux intergiciels
est bénéfique pour
vous
43. Partager des fichiers statiques à partir du serveur: Voyons un autre intergiciel intégré
qui est utilisé pour envoyer des
fichiers statiques depuis le serveur Si vous ne connaissez pas les fichiers statiques,
les fichiers statiques
sont simplement des actifs destinés front-end, tels
que les fichiers SDML, les fichiers
CSS, les fichiers JavaScript, les fichiers
texte, les images, les
pattes, les PDF, etc. Ils sont appelés statiques
parce que notre serveur ne modifie ni ne traite ces fichiers avant de les
envoyer au client. Par exemple, nous avons le logo de
notre entreprise sur le serveur. Nous enverrons ce fichier de logo à notre interface et celle-ci
s'affichera sur le site Web. Maintenant, vous pourriez penser que nous avons un fichier
statique sur le serveur.
Comment pouvons-nous le partager ? Ne vous inquiétez pas, c'
est très simple. Laisse-moi te montrer ça.
Ici, nous utilisons app point ug. Maintenant, pour partager les
fichiers statiques depuis le serveur, nous devons utiliser un autre
intergiciel intégré appelé
press point Dans cette fonction, nous devons
transmettre le nom du dossier
que nous voulons partager. Le plus souvent, les développeurs l'ont
qualifié de public. Vous pouvez l'appeler comme
bon vous semble, mais le public est une convention
courante. Vous vous demandez peut-être que nous n'avons pas ce dossier public
dans notre projet, nous devons
donc le créer
appelé public. Assurez-vous d'écrire le même nom que celui que vous avez
donné à votre dossier, et assurez-vous également que ce dossier est disponible à la
racine du projet, non dans un autre dossier. Maintenant, pour la démonstration, nous allons ajouter ici
tout type de fichier ou d'image. Voici donc cette image. Je le télécharge et je
l'ajoute dans mon dossier public. Et renommons ce fichier en Fire Watch ou n'importe quel nom que
vous voulez Bien. Maintenant que nous définissons notre dossier
public comme statique, nous pouvons accéder à tous
les fichiers disponibles
dans ce dossier. Ouvrez donc un navigateur, et nous écrivons ici notre URL de base, colonne hôte
local 3 000 barres obliques Ensuite, nous pouvons écrire nom du fichier auquel
nous voulons accéder, firewach point P. Si extension de
votre fichier image est PNG ou JPG, vous
devez écrire
la même extension de fichier Ici, je ne reçois pas le
dossier. Qu'est-ce qui ne va pas ? Oh, nous avons oublié de
sauvegarder ces modifications. Encore une fois, essayez d'
accéder à ce fichier. Tu vois, c'est ici que nous obtenons notre image. Nous allons donc ajouter tous
nos fichiers statiques dans le dossier
public et nous pouvons y
accéder directement ici. Notre interface utilisera cette URL pour afficher des images, des
pions ou quoi que ce soit d' De plus, dans notre application, nous pouvons définir un ou
plusieurs dossiers statiques. Comme certains développeurs aiment
ajouter le dossier Assets, nous pouvons dupliquer
ce middleware et simplement remplacer le
nom du dossier par Assurez-vous simplement que ce dossier
est disponible à la racine. Maintenant, de nombreux développeurs aiment
ajouter un préfixe pour le chemin de fichier statique Actuellement, nous accédons à nos fichiers statiques directement
après la colonne 3 000 de l'hôte local. En ajoutant un préfixe, cela
ressemblera à ceci. Colonne hôte local 3 000, barre oblique statique
Firewatch Web P, ou colonne hôte locale 3 000 OTR Firewatch Laissez-moi vous montrer comment
nous pouvons le faire. Pour cela, il suffit d'ajouter notre préfixe avant notre intergiciel statique
express ATR si cela change si
nous actualisons notre page, voyez, nous n'obtenons pas
ici de fichier statique. Nous devons ajouter Autar dans l'URL, et maintenant nous obtenons nos fichiers statiques C'est ainsi que nous pouvons partager des fichiers
statiques depuis le serveur. Maintenant, permettez-moi de vous faire
un petit exercice. Ajoutez un fichier statique dans le
dossier appelé assets et accédez
simplement à ce fichier dans le navigateur avec le préfixe profile Je sais que tu peux le faire, donc je ne
te montre pas la solution. C'est vraiment simple.
44. Middleware tiers utile: Voyons quelques intergiciels
tiers utiles. Nous les appelons intergiciels
tiers parce qu'ils sont créés
par des tiers Le premier est Morgan. Ce middleware est le middleware tiers le plus
populaire
pour la journalisation du SDDPRQuest pour Maintenant, quand j'apprenais que Node l'
a fait, je me pose cette question. Pourquoi les développeurs veulent-ils
enregistrer la demande SDP ? Qu'est-ce qu'ils obtiendront en
enregistrant simplement la demande SDP ? Je sais que tu te
poses la même question. Lorsque nous enregistrons
une demande SDP à l'aide de Morgan, nous pouvons suivre l'
API qui appelle le plus longtemps Quelle API met le
plus de temps à répondre, combien d'appels d'API sont traités, déboguer l'API faible et bien d'autres avantages En général, en enregistrant
la demande SDP, les développeurs peuvent surveiller, déboguer
et améliorer leurs API Voyons maintenant comment enregistrer demande SDP
à l'aide de Morgan Voici un package Morgan. C, il a 4 millions de
téléchargements par mois, ce qui est insensé. Et comme nous le savons, nous utilisons cette commande pour
installer le package Morgan. Il suffit donc de le copier, d'arrêter notre application
avec Control plus C et de le coller dans notre terminal. Bien. Maintenant,
relançons notre application. Maintenant, dans notre application, nous avons créé ce middleware de
journalisation personnalisé Nous n'en avons pas besoin, nous
pouvons donc commenter ce code. Maintenant, pour utiliser Morgan,
nous devons d'abord l'importer
dans notre application. Donc, au sommet, consentir à Morgan
équivaut à exiger Morgan. Et en bas,
nous ajoutons le point U de l'application, et à l'intérieur de celui-ci, nous appelons
cette fonction Morgan. Dans cette fonction Morgan, nous pouvons transmettre un
format prédéfini de demande de journalisation. Par exemple, nous avons combiné Dev
for development pour plus de détails, common, tiny, etc. Si vous souhaitez voir
tous les détails, vous pouvez consulter
cette page du package. Vous trouverez ici toutes les
informations relatives aux formats. Maintenant, dans notre code, nous
ajoutons simplement ici des codes doubles. Tu vois, ici, nous recevons des suggestions. Combiné, court court de Dov, minuscule pour le moment, passons Dev Save the changes
et jetez-y un coup d'œil Cliquez maintenant sur n'importe quelle API dans le terminal. C, nous obtenons ici les détails de la
demande. Nous obtenons d'abord la méthode SDDP, puis le point de terminaison, puis le statut, temps de
réponse et la
taille de la Grâce à ces données, nous pouvons
améliorer nos API. Si nous envoyons à nouveau la demande, voyez, nous obtenons un nouveau journal. C'est ainsi que Morgan
va nous aider. Maintenant, le prochain
intergiciel tiers est Helmet. C'est un autre intergiciel populaire, et nous savons tous ce que
font les casques dans notre vie quotidienne. Il protège notre tête
des accidents, et c'est ce que font également les
intergiciels pour casques C'est une excellente
option pour améliorer la sécurité de notre application
avec une configuration minimale. De plus, il est couramment utilisé
dans un environnement de production. De nombreuses applications de nœuds
utilisent ce middleware. Nous cherchons donc ici un casque. Ici, nous obtenons ce package. Installons ce package. Ouvrez le terminal, arrêtez
l'application, collez la commande ici. Et si vous souhaitez installer la
même version que celle que j'utilise, vous pouvez également ajouter la version
ici et appuyer sur Entrée. Capuche Exécutons à nouveau notre
application. Maintenant, pour utiliser ce package, nous l'importons d'
abord en haut. Donc, un casque Const, égal à
deux, nécessite un casque. Et en bas, avant
nos autres intergiciels,
nous ajoutons app point g et
appelons simplement ici helmet
Middleware nous ajoutons app point g et
appelons simplement . Et c'est tout. Cela ajoutera automatiquement des en-têtes
sécurisés qui
sécuriseront notre application Express Je tiens également à clarifier une chose. Lorsque nous ajoutons des intergiciels
dans notre application, Express les ajoute dans l'ordre dans lequel
nous les ajoutons dans notre code Par exemple, actuellement Express, ajoutez d'abord le middleware casque dans le pipeline de
traitement des demandes, puis JSON, puis codé en URA, puis statique, puis Morgan L'ordre est également
important pour les intergiciels.
45. Comment coder en fonction de l'environnement: Voyons maintenant comment coder en fonction de notre environnement
d'application. Par exemple,
notre application
est actuellement en cours de développement, et lorsque nous déploierons
notre application, elle sera dans l'environnement
de production. Maintenant, lorsque notre application
est en phase de développement, ce qu'alors que nous voulons activer middleware
Morgan
pour notre Nous devons donc tout d'abord
connaître l'environnement actuel. Et oui, nous le savons de la
même manière que nous essayons de connaître le port. Nous pouvons donc simplement consulter
point log process ENV, et ici nous accédons à
dollar Cully Brackets,
progress point env point
node underscore ENV Ce nœud souligné ENV
est le nom de la variable, identique à ce port Voyons ce que nous allons obtenir ici. Enregistrez les modifications, et
nous voilà indéfinis. Pourquoi ? Parce qu'au départ, notre environnement n'
est pas celui du développement STS. Maintenant, dans Express, nous avons un autre moyen de connaître l'environnement
actuel, qui consiste à utiliser app point gat. Et dans cet instinct, nous devons
remplacer ENV par environnement. Cette application point gt ENV
renverra le même résultat que cet environnement de soulignement point nw point
node process Mais lorsque nous ne configurons pas l'environnement de soulignement des
nœuds, à ce moment-là, cette application point gt ENV retournera par
défaut le développement,
ce qui est génial, ce qui est génial, Laisse-moi te montrer. Donc,
console point log app ENV Crochets frisés en dollars, point d'
application Get ENV. Sauvez les Geng et voyez, c'est le développement Mais encore, notre
point de processus ENV n'est pas défini. Nous voulons maintenant ajouter
ce middleware Morgan uniquement si nous sommes dans l'environnement de
développement Nous pouvons donc coder comme ceci. Ici, nous ajoutons la condition I, app point Get ENV Vous pouvez également utiliser le point de processus NV, mais vous devez ensuite modifier la
condition en fonction de cela C'est désormais synonyme de développement. C'est vrai, ce n'est qu'alors que
nous ajouterons ce middleware. Nous les déplaçons dans
ce blog If. Maintenant, pour indiquer, nous ajoutons ici un autre
journal des points de la console, a ajouté Morgan. Bien. Enregistrez les gènes, et dans le terminal, vous voyez, Morgan est ajouté
ici. Passons maintenant à
notre environnement de production pour voir si Morgan en
ajoute ou non. Tout d'abord, nous arrêtons l'exécution de notre
application. Pour définir la variable d'
environnement, nous écrivons dollar ENV,
colonne, nœud, soulignons ENV égal à en
codes, nous Si vous êtes un utilisateur Mac ou Linux, vous
devez
écrire ici export,
space, node, underscore ENV
est égal à production Assurez-vous d'écrire le nom
et la valeur corrects de la
variable d'environnement . Appuyez sur Entrée. Maintenant, exécutons à
nouveau notre application nodemon index point js. Tu vois, Morgan n'est
pas ajouté ici. C'est ainsi que nous modifions notre environnement
d'application et notre code en conséquence. Passons une fois de plus à l'
environnement du développement. dollar ENV, le nœud colon, le trait de
soulignement EN V sont donc égaux au développement Ou pour Mac ou Linux, export, node, underscore ENV
est synonyme de développement Et si nous vérifions à nouveau notre
application , vous
voyez, Morgan est ajouté ici.
46. fichier env et paquet dotenv: Jusqu'à présent, nous définissons les variables d'
environnement à l'aide dollar ENV ou de la
commande export dans le terminal Mais il existe un autre moyen
simple de définir ces variables à
l'aide du fichier point ENV Dans ce fichier NV, nous pouvons simplement ajouter toutes nos variables d'
environnement telles que le port est égal à 3 000 ou le nœud de soulignement
ENV Ou nous pouvons également définir ici
l'URL de notre base de données. Et de nombreux développeurs utilisent
cette approche pour définir des variables au lieu de
les définir dans le terminal. Ce fichier ENV garde les informations
sensibles de
nos applications , telles que les informations
d'identification, hors de notre code, ce qui est une bonne pratique
de sécurité Maintenant, ce fichier ENV est
un simple fichier texte. Pouvons-nous charger sa variable
dans notre application de nœud, afin de pouvoir les utiliser et
coder en conséquence. Pour utiliser ces
variables d'environnement dans une application de nœud, nous avons un package appelé point ENV Ne vous inquiétez pas avec
une seule ligne de code, nous pouvons utiliser ces variables d'
environnement. Installons ce package. Point d'installation NPM ENV. Bien. Maintenant, dans notre fichier de
points d'index en haut, nous devons simplement ajouter une
ligne require point NV, puis nous appelons ici la méthode
point config, et c'est Nous n'avons rien d'
autre à faire. De plus, l'avantage cette approche
est que nous pouvons y accéder même manière en utilisant process point nw point
PoRD et process point nw
point node underscore Exécutons cette application. Bien. Vous voyez, nous sommes actuellement dans un
environnement de développement, et c'est pourquoi
Morgan a été ajouté. Maintenant, pour vous montrer, je
change le port à 8 000. N'utilisez pas le port 5 000 dans MAG car il est déjà en
cours d'exécution dans votre système, et nous remplacerons ENV par production Enregistrez ceci, et nous devons maintenant redémarrer manuellement notre
application car Norman ne redémarre
notre application lorsque les fichiers portant ces
extensions sont modifiés. Vous voyez, notre port est passé à
8 000, mais qu'est-ce que c'est ? Notre ENV est le même qu'
avant, c'est-à-dire le développement. Mais dans le fichier ENV, nous l'avons mis en
production. Peux-tu deviner ? C'est parce que dans
la dernière leçon, nous avons codé en dur la valeur ENV de notre
nœud en utilisant dollar
ENV ou Donc, notre application,
mémorise ces paramètres. Rappelez-vous donc toujours que
lorsque nous avons un fichier
ENV à points et que nous définissons également notre variable d'environnement à l'
aide du terminal, notre application de nœud donne plus de priorité à
la valeur du terminal Pour résoudre ce problème,
nous pouvons simplement supprimer la valeur ENV de
soulignement du nœud Donc, écrivez, supprimez-le, chemin, ENV, deux-points,
nœud, soulignez Ou si vous utilisez Mac ou Linux, écrivez unset, space,
node, soulignez
ENV et appuyez sur Entrée Redémarrez maintenant l'application. Vous voyez, nous avons ici la production. Et si dans le fichier ENV, nous changeons ENV en développement,
sauvegardons les modifications, redémarrons notre
application en utilisant nod moon voyez, ici, nous obtenons le développement parce que
Morgan a été ajouté.
47. Différents paramètres pour différents ENV: Actuellement, nous modifions
manuellement
nos variables d'environnement
car il ne s'agit que de deux variables. Mais dans le monde réel, il se peut que nous ayons plus de deux variables d'
environnement. Par exemple, nous avons une URL
de base de données différente dans le développement et une
URL différente dans la production. De même, nous pouvons avoir une clé
secrète pour
l'authentification, etc. Maintenant, lorsque nous avons autant de variables d'
environnement, il est difficile de
les modifier manuellement. Maintenant, comment pouvons-nous résoudre ce problème ? Pour résoudre ce problème,
nous pouvons créer deux fichiers ENV distincts :
point nw point development et point nw point production Vous pouvez même créer des tests
point par point. Dans ces deux fichiers, nous allons définir nos différentes variables d'
environnement. Ensuite, dans notre index point js, nous pouvons simplement mettre la condition si notre environnement de nœud
est en développement, puis nous chargeons le fichier de développement
point nw point. Et si notre environnement
est délicieux, nous chargeons ce fichier de dégustation point
NV point est aussi simple que ça. Laissez-moi vous le
montrer de façon pratique. Nous créons ici un nouveau fichier
appelé point nw point Development. Dans ce fichier, nous définissons différentes variables d'
environnement. Le premier est que le port
est égal à 3 000. K est égal à do
underscores secret. Nous pouvons également ajouter un
nœud de soulignement : ENV est égal au développement,
et c'est tout Créons maintenant un autre fichier appelé point nw dot production. Et à l'intérieur de cela, nous ajoutons
que Pd est égal à 8 000 K est égal à pro qi et qu'au dernier nœud et un carré E et
V sont égaux à la production. Enregistrez ceci, et maintenant
dans le point d'index s, il suffit d'ajouter une condition. Donc, en haut, ici, nous créons d'abord une variable
appelée ENV file égale à,
et ici, pour utiliser des opérateurs
ternaires, nous passons la condition si process point nw point
node underscore NV est Si c'est vrai, alors notre fichier ENV devrait parsemer la production de points nv Nous avons défini le fichier de
développement point nw point
comme fichier d'environnement. Maintenant, simplement dans cette méthode de
configuration, nous devons transmettre l'objet avec le chemin de
propriété au fichier ENV État très simple. Et ici, pour montrer
une autre variable NV, nous utilisons
ici consol point log, process point nw point Vérifions-le si cela
fonctionne ou non. Morgan est actuellement
en train d'être ajouté. Arrêtons maintenant notre application. Dollar ENV, colon, nœud, trait soulignement ENV est égal
à Si vous êtes un utilisateur Mac ou Linux, vous
devez utiliser export, node, underscore, EN V
est égal à production Commençons maintenant notre application. Vous voyez, nous sommes dans l'environnement de production
parce que Morgan n'est pas ajouté, et ici nous obtenons la clé Pro
et notre port est également changé à 8 000, de sorte qu'
en utilisant différents fichiers ENV, nous pouvons définir différentes variables d'
environnement
48. Moteurs de modèle dans l'application Node: Voyons le
moteur de modèles dans le nœud. Ce sujet est un peu ancien et peu utilisé dans
le monde moderne. Voyons donc
ce qu'est le moteur de modèles. Fondamentalement, le
moteur de modèles est un outil qui nous permet de créer des pages SDML
dynamiques Ainsi, au lieu d'
écrire manuellement le code STML pour chaque page, nous pouvons créer un modèle, et en utilisant le moteur, nous pouvons automatiquement insérer
des données dans ce modèle Envoyez ensuite le
fichier SGML généré au navigateur du client. Supposons que nous voulions créer un site Web de blog à l'ancienne où tous les blogs ont
la même mise en page, mais seul leur
contenu est différent. À présent, nous ne
voulons pas créer manuellement un fichier SGML pour
chaque article de blog Cela prendrait beaucoup de
temps et serait inefficace. Au lieu de cela, nous pouvons utiliser
un moteur de modèles pour créer un modèle unique
pour la mise en page de notre blog, et le moteur de modèles
affichera dynamiquement le contenu du blog en fonction des données que nous fournissons, c'
est aussi simple que cela. Il existe de nombreux
moteurs de modèles dans No Jaz, mais le plus populaire est PUG
et un autre est EJS Les deux fonctionnent de la même manière. Seule leur syntaxe est différente. Permettez-moi de vous parler de PUG. Donc, dans notre terminal, nous écrivons NPM install PuGor si vous
souhaitez installer la même version,
puis nous écrivons au trois points rouge zéro point
trois Bien. Maintenant, dans notre fichier JS à points d'
index, nous devons définir le moteur de vue, qui est le
moteur de modèles, sur PUG Nous écrivons donc ici app dot set. Ici, nous voulons définir le moteur, nous écrivons
donc le moteur de vue. Et au deuxième paramètre, nous passons simplement PUG Donc, sur cette ligne, nous avons défini PRG comme
moteur de vue ou de modèle. Nous devons maintenant créer un
modèle pour notre page SDML dans POG. Dans notre application, nous
créons donc un dossier appelé views. Assurez-vous d'écrire le
même nom que les vues. Et à l'intérieur de ceux-ci, nous pouvons créer un fichier appelé template point POG Vous pouvez prendre n'importe quel nom de fichier. Cela n'a pas vraiment d'importance. Ici, nous devons écrire
du code dans la syntaxe Perg, qui est très
similaire à notre SDML Nous commençons ici par le HTML. Notez qu'ici, je n'utilise pas de
crochets pour les balises. À l'intérieur du SDML, nous pouvons avoir une tête, donc nous l'
écrivons comme cette arborescence À l'intérieur de la tête,
nous pouvons ajouter un titre Ici, nous voulons obtenir la valeur
du titre de manière dynamique. Nous écrivons le nom de notre balise equal, et ici nous écrivons le nom de
notre variable que nous transmettons au moment de l'exécution. Titre. Ne t'inquiète pas, je
vais tout te montrer. Maintenant, après la tête, nous
savons que nous pouvons ajouter une balise body, sorte que nous nous déplaçons sur la même
ligne parallèle que head et addre body Dans PRG, il n'est pas nécessaire
de fermer le tag. Maintenant, dans le corps, nous pouvons ajouter H une balise égale à l'
en-tête et après cela, nous ajoutons un paragraphe
égal au contenu Modèle simple pour blog. Vous pouvez voir que cette
syntaxe est très propre par rapport au SDML normal. De nombreux développeurs l'aiment, mais beaucoup ne l'aiment pas. Enregistrez ce fichier et
voyons comment nous pouvons afficher page
SDML et transmettre ces
variables dynamiquement Auparavant, nous avons défini une API pour route racine
simple dans laquelle nous renvoyons simplement le point de réponse Send. Il s'agit d'un projet de suivi des tâches. À présent, à la place du texte simple, allons afficher notre modèle Perg Ici, à la place du point de
réponse Send, nous écrivons le point de réponse Render. Et cette fonction
prend deux arguments. premier est le nom du fichier
ou du modèle que nous voulons afficher. Dans ce cas, il s'agit d'un modèle, et le deuxième argument
est l'objet avec les variables et sa valeur que nous définissons
dans ce modèle. Donc, tout d'abord,
le titre d'un blog, disons. Après cela, nous nous dirigeons
vers le moteur de modèles, et le contenu pour faciliter Pug
est vraiment bon, je ne sais pas Enregistrez les modifications,
et dans le navigateur,
nous passons à la colonne 3 000 de
l'hôte local. Erreur de connexion :
nous avons peut-être oublié de démarrer l'application node
one index point js. Oh, il se trouve actuellement dans l'environnement
de production. Définissons-le dans l'environnement
de développement. Ainsi, le dollar ENV peut souligner
le nœud ENV est égal
au Ou si vous êtes un utilisateur Mac ou Linux, vous pouvez utiliser l'exportation, node underscore ENV est
égal au développement Assurez-vous de ne pas
transmettre de codes ici, puis nous lancerons
l'application. voyez, il écoute en 3 000
et si nous actualisons notre page, voyez, nous obtenons ici
le modèle Perg Le titre est le premier du blog. Le titre et le contenu sont
également les mêmes que ceux que nous adoptons. C'est ainsi que nous pouvons
afficher un fichier SDML sur le serveur, puis l'
envoyer au navigateur du client Je ne pense pas que
les entreprises modernes utilisent cette méthode, car la plupart d'
entre elles utilisent Rag, angular ou View pour le front-end
49. Nettoyer la structure d'application du code: Actuellement, si nous voyons
notre fichier JS à points d'index, l'impression que nous avons vraiment
foiré notre code Tout semble très encombré
et impossible à entretenir. Structurons donc
notre application de nœud, qui est utilisée dans le monde réel. Donc, actuellement, nous avons ajouté toutes les API
associées à faire dans le fichier JS à point d'index
unique. Imaginez que dans une autre application de
commerce électronique, nous ayons un autre ensemble
d'API pour les utilisateurs. Nous avons un autre ensemble d'API
pour les fonctionnalités liées aux cartes. À l'heure actuelle, nous ne pouvons pas ajouter toutes ces API dans le
même fichier index point js. La solution est que nous pouvons créer un dossier distinct appelé routes, dans lequel nous ajouterons
des fichiers pour chaque ensemble d'API. Nous créons un nouveau
dossier appelé routes. Il s'agit d'une pratique courante
pour la structure des applications. Maintenant, nous créons un nouveau
fichier appelé todos point js, dans lequel nous allons définir toutes les routes d'
API liées à todos Tout d'abord, coupons toutes les routes du fichier JS à points d'
index. Et collez-le dans le fichier
todos point js. Maintenant, vous pouvez demander dans le fichier
index point js en haut, nous avons une instance d'application
et en l'utilisant,
nous définissons différentes routes d'API. Mais ici, dans le fichier
todos point JS, nous n'avons pas cette instance d'application Alors, comment pouvons-nous
définir des itinéraires ici ? Vous pourriez dire que nous pouvons
recréer l'instance de l'application, mais ce n'est pas possible.
Cela ne marchera pas. Donc, dans l'express, nous avons une autre instance appelée
routeur par laquelle nous pouvons définir l'API et les
points, tout comme nous
sommes des API utilisant une instance d'application. Ici, nous saisissons d'abord express const Express est égal
à require Express Maintenant, dans cet express, nous avons une autre
méthode appelée Router, qui renverra
l'instance du routeur, et c'est pourquoi nous la stockons
dans une variable appelée router. Maintenant, remplaçons simplement cette instance d'application par
cette instance de routeur. Sélectionnez donc cette application et appuyez sur Ctrl plus D
ou Commande plus D, ce qui sélectionnera
toutes les instances de l'application et les remplacera par un routeur. Bien. Nous avons maintenant défini nos itinéraires dans
les différents fichiers. Mais comment notre fichier index point
js connaîtra
ces routes, nous voulons
ajouter dans notre application. Pour cela, nous devons exporter
cette instance de routeur depuis ce fichier et l'ajouter dans le
fichier index point js. C'est aussi simple que ça. Alors, vous souvenez-vous comment exporter des variables
depuis le fichier de nœud ? C'est vrai, nous utilisons le module dot
exports is equal to router. Enregistrez ce fichier, et dans
le fichier index point js, supprimons ces blocs. Nous n'en avons pas besoin,
et nous ajoutons ici app point g pour ajouter ces
itinéraires dans notre application. Ici, à la première position, nous ajoutons le préfixe du routeur, identique à ce fichier statique La plupart du temps, les développeurs
aiment ajouter ici l'API Slash. Ensuite, au
deuxième argument, nous transmettons notre instance
de routeur depuis le fichier todos point js Donc, en haut, nous
importons ce routeur
en utilisant la fonction require. Et ici, nous passons le chemin de notre fichier, qui est slash out todos Maintenant, comme nous le savons, cette fonction
require renverra l'instance du routeur, afin que nous puissions la stocker dans
une variable appelée todos routes Et en bas, ici, on passe par les routes de Tudou. Et c'est fait. De plus, j'ai découvert que nous avions besoin ce tableau Tudous
dans le fichier Tudos Nous l'avons donc découpé d'ici et
collé dans notre fichier Tudous. Enregistrez les modifications
et vérifierons si notre application
fonctionne bien ou non. N'oubliez pas que pour tous les itinéraires à faire, nous devons ajouter une API de préfixe avant les points de terminaison.
Envoyez la demande. Tu vois, ça marche. Maintenant, un dernier changement que je veux
faire concerne notre TudsRoute, nous pouvons voir que nous ajoutons Tudos avant chaque Nous pouvons donc généralement
transmettre cette barre oblique todos au préfixe du fichier
index dogs Sauvegardez-les. Maintenant, dans le fichier
todos point js, nous pouvons supprimer slash
todos du point de terminaison Nous supprimons également les tâches
pour tous les points de terminaison de l'API. Gardez ceci et nous sommes prêts à partir. Nous pouvons également supprimer
ces lignes indésirables. Nous n'en avons pas besoin. Vous voyez, notre fichier index point js a maintenant l'air propre et
plus facile à maintenir Nous suivrons cette structure de
candidature pour le reste de notre cours. Notre section
5 est donc terminée. Vous pouvez rapidement voir le
résumé PDF et récapituler l'ensemble de la section en deux à 3 minutes et je vous
verrai dans la section suivante
50. Section 06 - Asynchrone ou synchrone ous: Bienvenue dans les six sections
du cours Ultimate Not JS. Il s'agit de la
section relative aux répresseurs pour certains sujets d'AdvanceVAScript tels que le synchrone
par rapport à l'asynchrone, la fonction de
rappel, les promesses de rappel certains sujets d'AdvanceVAScript
tels que le synchrone
par rapport à l'asynchrone, la fonction de
rappel, les promesses de rappel et l'attente asynchrone. Beaucoup de développeurs sont
confus dans ces sujets, il vaut
donc mieux que nous les comprenions. Donc, si vous êtes
déjà confus dans ces sujets et
que vous souhaitez maîtriser node js, vous serez confronté à de nombreux problèmes dans les sections à venir . Il est préférable d'
apprendre ces sujets, que nous pouvons appeler JavaScript
asynchrone avant de nous
plonger vraiment dans les applications de nœuds Dans toutes les applications de nœuds, nous utilisons beaucoup ces sujets. Découvrons ces sujets. Sont simples et faciles à apprendre. De plus, si vous êtes déjà
sûr de ces sujets, vous pouvez ignorer cette section. Cela dépend entièrement de vous. Avant de commencer à apprendre les concepts du
JavaScript asynchrone, voyons la différence entre asynchrone et synchrone Cela nous aidera à mieux
comprendre. Qu'est-ce que le synchrone ?
La programmation synchrone signifie que notre code s'exécute ligne par ligne Chaque ligne doit être terminée avant de
passer à la ligne suivante. En termes simples, la programmation
synchrone revient à suivre une
recette étape par étape Chaque étape doit être terminée avant
de passer à la suivante. Si une étape prend du temps, nous devons attendre que l'exécution soit
terminée, puis nous pouvons continuer. Par exemple, nous préparons
un gâteau pour une fête d'anniversaire. Maintenant, il y a un
processus étape par étape, disons que nous mélangeons d'
abord les ingrédients, puis nous les mettons au
four pour la cuisson, et enfin, nous
décorons le gâteau. Ici, il faut suivre
les étapes ligne par ligne. On ne peut pas commencer directement à décorer le gâteau
sans le faire cuire. Nous devons passer aux étapes 1, 2 et 3. C'est l'exemple synchrone. Le code synchrone est également
appelé code de blocage. Permettez-moi de vous montrer le comportement de
blocage ou un exemple de code de blocage
en JavaScript. Pour mettre en pratique ces sujets, nous créons un nouveau dossier dans
le dossier des projets appelé JavaScript
asynchrone et ouvrons ce dossier dans le code VS Maintenant, dans ce dossier, nous créons un simple
fichier JavaScript appelé index point js. Bien. Nous écrivons maintenant
trois lignes de console. Donc, console point log. Première étape, commencez. Un autre journal de points sur la console. Deuxième étape, et dernière étape,
consol dot log. Troisième étape, et
exécutons ce code. Donc, dans le terminal, nous
écrivons node, index dogs. Vous voyez, nous obtenons la
sortie ligne par ligne. Nous passons d'abord à la première étape, puis à la deuxième,
puis à la troisième. Maintenant, vous pourriez dire que nous ne pouvons pas voir le comportement
de blocage de ce code. Comment pouvons-nous le voir dans la pratique ? Actuellement, nous obtenons
cette sortie sans blocage car aucune ligne ne
prend plus de temps à exécuter, chaque ligne s'exécute immédiatement. Ajoutons un petit
bloc dans ce code. Ici, après la console 1, nous créons une fonction
appelée fetch data Dans cette fonction, nous ferons semblant de récupérer des
données de la base de données Comme nous le savons peut-être, l'extraction
des données de la base de données peut prendre de deux à trois
secondes, voire plus Pour l'instant, nous ajoutons simplement un
délai en utilisant quatre boucles vides, ce qui peut prendre un certain
temps à exécuter. Ici, soit I égal à zéro, I inférieur à un et neuf
fois zéro et I plus plus. Tout simplement, nous ne voulons
rien faire dans cette boucle automnale, alors ouvrez et fermez les crochets Maintenant, l'
exécution de cette ligne peut prendre une ou deux secondes. Ensuite, nous déplaçons la deuxième étape de notre console haut et ici, les données sont récupérées Ici, avant notre troisième étape, nous appelons cette fonction fah data Pouvez-vous deviner ce que nous
obtenons dans le résultat ? Voyons voir. Enregistrez les modifications et exécutons ce fichier. Vous voyez, après la première étape, notre code s'arrête un peu pour que notre
fonction s'exécute. Ensuite, nous
récupérons les données, puis nous procédons à la troisième étape. Ici, pendant un moment, nous pouvons voir le comportement bloquant
de notre code JavaScript
, appelé code JavaScript
synchrone Vous pouvez maintenant deviner
ce qui est asynchrone. En mode asynchrone également, notre
code s'exécute ligne par ligne. Mais pour aller de l'avant, nous n'avons pas besoin d'attendre
pour terminer cette tâche. Nous pouvons démarrer une tâche, et
si cela prend plus de temps, nous pouvons passer
à la ligne suivante. En termes simples, la programmation
asynchrone revient faire plusieurs choses à la
fois et à ne pas attendre la
fin de l'exécution de chaque ligne
pour commencer la ligne suivante Vous pouvez démarrer une tâche et, pendant que vous attendez qu'elle soit terminée, vous pouvez faire autre chose. Par exemple, vous préparez un fût et vous
regardez également ce cours Vous mettez donc le gâteau
au four pour la cuisson, mais cette cuisson peut prendre de
dix à 15 minutes. À ce moment-là, vous pouvez faire autre chose au lieu d'
attendre que le gâteau soit cuit. Vous commencez donc à regarder
ce cours. Et si vous aimez ce cours, vous pourrez
alors partager
avec vos amis. De même, si nous définissons notre code de somme à l'aide de JavaScript
asynchrone, si l'exécution de cette ligne prend
plus de temps
, notre code JavaScript n'
attendra pas Il s'exécutera
dans le code et lorsque cette ligne aura terminé
son exécution
, elle exécutera cette ligne. Nous pouvons faire plusieurs choses
en JavaScript asynchrone sans simplement attendre qu'une
ligne termine sa tâche. C'est la
différence fondamentale entre le JavaScript synchrone et
asynchrone Par défaut, notre
code JavaScript est synchrone, mais Javascript fournit certaines
méthodes qui nous permettent rendre notre code asynchrone pour effectuer des
types de travail spécifiques De plus, comme nous le savons, le nœud est populaire car il peut
appliquer une nature asynchrone. Maintenant, laissez-moi vous montrer
comment transformer notre code synchrone ou bloquant en code asynchrone
ou non Ici, à la place de ces quatre boucles qui occupent
notre code, pouvons ajouter une autre méthode
pour ajouter du retard. Nous ajoutons un délai défini. Cette méthode prend deux arguments. Le premier est la fonction et le
second est le temps de retard. Par exemple, nous passons ici
10 000 millisecondes, soit Maintenant, en premier lieu,
nous passons simplement la fonction
et à l'intérieur de celle-ci, nous déplaçons cette étape vers la console de récupération
des données Après 10 secondes, cette fonction
testera les données de la console. Maintenant, pouvez-vous deviner le résultat
de ce code ? Voyons voir. Tu vois, on passe d'abord à la première étape. Après cela, en arrière-plan
ou la fonction est en cours d'exécution, mais cela n'a pas arrêté
notre code là. Notre code continue
à exécuter l'étape trois, et lorsque ces 10
secondes se termineront, nous obtenons la deuxième étape : data ft. Il s'agit donc du code non bloquant
ou asynchrone. Code synchrone,
attendez qu'une ligne terminée et code
asynchrone, attendez que cette ligne soit en arrière-plan et
continuez à travailler Vous vous demandez peut-être quel est le meilleur mode synchrone
ou asynchrone À mon avis, les deux sont utiles. Personne n'est meilleur. Ils ont tous deux
des objectifs différents. La synchronisation est idéale lorsque
nous avons besoin d'exécuter une tâche dans un ordre spécifique ou lorsque la tâche est rapide
et non bloquante Assure simplicité
et prévisibilité. asynchrone est important
pour les tâches qui prennent du temps,
telles que la gestion de fichiers, l'accès à la
base ou les requêtes réseau, pour
lesquelles nous ne
voulons pas bloquer le
thread principal de notre serveur Dans l'application node, nous
utiliserons du JavaScript
asynchrone pour effectuer des opérations non
bloquantes, telles
que des requêtes de base de données, des appels d'
API, la lecture et écriture de fichiers sans
geler le thread principal L'essentiel est que notre application fonctionne de manière non
bloquante, ce qui donnera à nos utilisateurs une expérience
rapide et exceptionnelle. Comme nous le savons, par défaut, notre code JavaScript
est synchrone. Mais JavaScript fournit certaines
méthodes par lesquelles nous pouvons rendre notre code asynchrone pour effectuer des
types de choses spécifiques La première consiste à utiliser la fonction de
rappel. Une autre méthode consiste
à utiliser des promesses. Dans cette section, nous allons en apprendre
davantage sur ces méthodes.
51. Les rappels dans JavaScript: Découvrons maintenant le
rappel en JavaScript. Alors, qu'est-ce que la fonction de rappel ? Une fonction de rappel est une fonction
transmise en tant qu'argument à une autre fonction et exécutée une fois qu'une
tâche spécifique est terminée Laissez-moi vous expliquer votre rappel
en utilisant un scénario du monde réel. Supposons que vous
commandiez un sandwich à la
sandwicherie avec votre téléphone, alors vous appelez la
sandwicherie et passez votre commande. Ils vous disent que la
préparation et la livraison prendront 20 minutes. Vous avez donc raccroché et fait autre chose au lieu de simplement
attendre le sandwich. Maintenant, lorsque le sandwich est prêt, le livreur sonne votre porte et
vous offre ce sandwich simple Dans ce cas, appeler
la sandwicherie et passer
votre commande revient à démarrer
une tâche asynchrone. Après cela, ils vous disent que
cela prendra 20 minutes. Il s'agit du délai de
la tâche asynchrone. Ensuite, tu as raccroché et tu as fait autre chose au lieu de simplement
attendre le sandwich. Il s'agit d'un comportement non
bloquant, ce qui signifie que notre code
continue de s'exécuter. Lorsque Sandwich est prêt, ce qui signifie que notre
tâche asynchrone est terminée, le livreur sonne votre porte et
vous donne Il s'agit de la
fonction de rappel
exécutée lorsque la
tâche asynchrone est terminée. Ainsi, une fonction de rappel est transmise en tant qu'argument à une
autre fonction, et elle est également exécutée après la fin d'une
tâche spécifique En termes simples,
quoi que nous voulions faire une fois la
tâche asynchrone terminée, nous transmettrons
la fonction de rappel Maintenant, si vous travaillez ou apprenez le Javascript
depuis longtemps, pariez avec moi que vous avez déjà utilisé la fonction de rappel
dans votre code Vous ne
savez juste pas que cette fonction s'
appelle ColWcFunction Par exemple, vous souvenez-vous que dans la fonction de temporisation définie
à la première position, nous passons une fonction
exécutée après un certain délai Et vous avez raison,
cette fonction que nous avons passée en argument
s'appelle une fonction de rappel la même manière que nous transmettons la fonction de
rappel dans la fonction
set interval. Permettez-moi de vous donner un autre exemple. Dans presque toutes les méthodes matricielles, nous transmettons des fonctions de rappel Comme dans la méthode du fourrage, la méthode de la carte, la méthode du filtre. Dans toutes ces méthodes, nous transmettons la fonction de rappel. De plus, dans notre projet précédent, nous transmettons la fonction de rappel dans l'app point get app point post, app point pot, delete et dans toutes les méthodes N'oubliez pas que celles-ci sont également
appelées fonctions de rappel. Maintenant, pour une compréhension de base, créons une
fonction et
passons-la tant que fonction de rappel,
car dans le nœud, nous devons beaucoup transmettre la
fonction de rappel Supprimons donc ce code. Si vous voulez regarder
le code précédent au bas de cette leçon, vous obtiendrez le dossier
Resources Zip. Téléchargez-le et décompressez-le. Dans le dossier des ressources, vous trouverez des liens Gita pour
tout le code section par section Vous pouvez donc en tirer une
référence. Donc, tout d'abord, nous
écrivons le journal des points de la console. Démarrez. Maintenant, nous créons
ici une fonction appelée fetch student dans laquelle nous allons faire semblant de récupérer des
données de la base de données Donc,
pour simuler le délai de récupération des données, nous ajoutons ici encore une fonction de temporisation
définie Et à la première position,
qu'est-ce qu'on passe ? Bien, pas seulement une fonction, nous passons une fonction de rappel. Nous passons donc ici fonction en utilisant la syntaxe de
la fonction flèche. La fonction flèche est une autre
façon de définir une fonction, et elle est beaucoup plus propre
pour les fonctions de rappel Maintenant, au deuxième argument, nous passons des millisecondes,
disons 3 000 Et ici, dans le délai défini, nous consultons le journal des points pour récupérer les données des
étudiants dans la base de données Appelons maintenant cette fonction
Fetch Student ici après la ligne de console Pour rendre les choses plus réalistes, nous transmettons également ici le numéro d'étudiant, qui est l'identifiant de l'étudiant que nous voulons
récupérer. Disons un. Maintenant, lorsque nous avons terminé
de récupérer les données, bout de 3 secondes, nous voulons
renvoyer les données de l'étudiant Nous renvoyons donc
l'objet étudiant avec une pièce d'identité. Ici, nous obtenons
l'identifiant comme paramètre et
passons simplement ce même identifiant ici. Notre étudiant
s'appelle également Harley, et disons que nous voulons son numéro
d'inscription, supposons 500 Nous prétendons obtenir cet objet étudiant
de la base de données Maintenant, lorsque nous appelons cette fonction, nous obtenons
ici les données de l'étudiant, nous pouvons
donc simplement les stocker dans
la variable appelée étudiant. Pour vérifier, il suffit de
const dot log,
student et de transmettre
ici cet étudiant À la fin, nous consultons
simplement le journal des points, et maintenant, pouvez-vous deviner ce que
nous allons obtenir dans le résultat ? Aurons-nous les données des
étudiants ou non ? Voyons voir. Le point d'index du nœud est. voyez, ici, nous commençons, l'
étudiant n'est pas défini, puis nous récupérons les
données de la base de données.
Laissez-moi vous expliquer pourquoi. Lorsque nous appelons cette fonction
well stud avec l'ID un, tout d'abord, le délai d'attente défini s'exécute, qui exécutera ce code au bout
de 3 secondes Maintenant, à l'époque, nous n'obtenons rien
de la fonction. C'est pourquoi la valeur de la variable étudiante était indéfinie Notre code JavaScript
a continué de fonctionner. C'est pourquoi nous demandons à l'étudiant d' indéfinir,
puis au bout de 3 secondes, la fonction set timeout consolera cette ligne de données de
récupération Maintenant, comment pouvons-nous exécuter ce code et obtenir les données
des étudiants ? Quelle est la solution ici ? Pour résoudre ce problème, nous utilisons la fonction de
rappel et nous le
ferons dans la prochaine leçon
52. Résoudre le problème avec le rappel: Ainsi, dans la leçon précédente, nous avons reçu l'erreur
undefined student Maintenant, résolvons ce problème
en utilisant la fonction de rappel. Tout d'abord, nous n'avons pas besoin de stocker le résultat dans
la variable student. Maintenant, pour résoudre ce problème, nous allons apporter peu de changements à
la fonction étudiante de la Fed. Donc, après l'ID, nous passons sa
fonction de rappel en paramètre Et au lieu de retour de l'objet étudiant
depuis la fonction, nous appellerons cette
fonction ou rappellerons cette fonction et y
passerons simplement l'objet étudiant. Je sais que c'est un
peu confus. Lisez cette leçon et vous comprendrez très bien
les rappels Maintenant, comme nous accédons à la fonction de
rappel en tant que paramètre, nous devons passer cette fonction comme deuxième argument lorsque
nous appelons fair
student function Nous passons donc ici une fonction, et à l'intérieur de cette fonction, nous pouvons simplement déplacer
cet étudiant de la console. Maintenant, d'où vient
cet objet étudiant. Bien, ici, nous avons
l'objet étudiant en paramètre car
lorsque nous appelons cette fonction de rappel dans
la fonction d'étudiant rapide,
nous passons l'objet
étudiant ici,
et cet objet étudiant, et cet objet étudiant, nous y accédons directement dans
ce paramètre de rappel Voyons voir si cela
fonctionne ou non. Donc, le point d'index du nœud est Js. Vous voyez, nous commençons d'abord,
puis au bout de 3 secondes, nous récupérons les données de
la base de données, puis utilisons la fonction de rappel pour
imprimer cet objet étudiant, et c'est exactement ce que nous voulons Voici notre code précédent
et actuel. Au lieu de renvoyer les données de la fonction fat
student,
nous appelons une autre fonction pour journal des points de
la console,
les données de l'étudiant. Cette ligne de console ne
s'exécutera que lorsque cette
fonction de rappel sera appelée Grâce à cette technique de
fonction de rappel, nous rendons notre code asynchrone
ou Maintenant, pour que cela soit clair à
la place de cette fonction, nous utilisons la syntaxe de la fonction flèche. Nous supprimons le
mot-clé function et entre
les parenthèses et les
crochets GLY, nous ajoutons une flèche voyez, maintenant notre code
semble simple et cette méthode est très utile dans
node car, comme vous le remarquez, nous passons toujours une
fonction de rappel comme celle-ci Au lieu de
le déclarer séparément, nous le définissons directement ici. Vous pouvez voir qu'en utilisant la méthode de la fonction de
rappel, nous pouvons gérer des tâches asynchrones Auparavant, nous utilisions
cette notation Colbec pour définir les routes d'API C'est donc la fonction de
rappel. La fonction de rappel est juste le nom de la fonction
que nous passons en argument à une
autre fonction, et elle est exécutée
après avoir terminé tâche, en particulier la tâche
asynchrone est aussi simple que ça. Ajoutons maintenant
un peu de difficulté à cela. Supposons qu'à partir de ce numéro
d'inscription de l'étudiant, nous voulions récupérer le détail de
ses résultats Après cette fonction fetch
student, nous créons une nouvelle fonction
appelée Get result Paramètre, nous ajoutons le
numéro d'inscription car en utilisant cela, nous allons récupérer le résultat dans la base
de Maintenant, dans cette fonction, nous renvoyons simplement l'objet
avec des propriétés, ID du
résultat au numéro d'inscription, nous obtenons dans le paramètre, que nous obtenons dans le paramètre,
et ensuite, un pourcentage
à, disons, 70. Maintenant, comme nous le savons, nous
récupérons à nouveau le résultat dans la base
de données, ce qui signifie que cela prendra
encore du temps, et c'est pourquoi cette
fonction nous tient à Donc, pour simuler le retard, nous ajoutons
ici une fonction de temporisation définie
et une fonction de rappel,
et encore une fois, nous attendons
3 000 millisecondes Maintenant, dans cette fonction de
temporisation définie,
nous déplaçons ce retour, et comme nous le savons, ce retour n'
a aucun sens Nous devons transmettre ce résultat dans la fonction de
rappel.
Comme nous l'avons fait ici. Donc, fonction de rappel
et enveloppez simplement cet objet de résultat avec une parenthèse de fonction de
rappel De plus, avant cela,
nous pouvons consulter résultat de la récupération du journal à
points dans la base
de Bien. Maintenant, là où nous appelons cette fonction de résultat Gad,
pensez-y Oui, nous pouvons appeler la fonction de
résultat Gad dans cette
fonction de rappel car nous obtenons une inscription dans
l'objet étudiant, et nous pouvons également l'appeler ici dans la fonction fetch student Mais comme cette fonction
consiste uniquement à récupérer les données, c'est pourquoi nous ne
voulons pas mélanger les choses Nous appelons donc la fonction de
résultat Ga dans la fonction de rappel. Le premier argument, nous
passons le numéro d'inscription, qui est le
point étudiant E underScenum Et ce que nous passons
au deuxième argument, nous passerons la
fonction de rappel ici Maintenant, dans le paramètre, nous obtenons l'objet
résultat que nous transmettons ici, et nous nous contentons de consigner le résultat par point
log. Nous devons également obtenir ce
rappel à partir du paramètre. Sauvez les gangs et
calculons le score. Ici, nous obtenons d'abord
les données de l'étudiant, puis au bout de 3 secondes, nous obtenons le résultat de cet étudiant. Permettez-moi donc de vous montrer rapidement
ce qui se passe ici. Donc, tout d'abord, la console de
démarrage fonctionne, puis nous l'appelons fonction d'étudiant d'
automne. Mais en raison de cette fonction de temporisation
définie, elle ne s'exécutera pas immédiatement Notre code va donc de l'avant et se
contente de consoler cette fin. Maintenant, après 3 secondes, le délai défini exécutera le code qui est
disponible dans les huit Nous appelons donc la fonction Callback
et passons simplement Object. D'où nous obtenons cette fonction de
rappel. Bien, nous l'obtenons
à partir du paramètre, et lorsque nous définissons
cette fonction de rappel, elle se trouve ici dans la fonction fat
student, et c'est pourquoi nous obtenons d'abord les informations sur les
étudiants Maintenant, après avoir obtenu
les détails de l'étudiant, nous appelons une autre fonction, qui est le résultat G. Cette
fonction de résultat G s'exécutera donc, et en raison du délai d'attente défini, son exécution prend à nouveau 3
secondes. Et à l'intérieur de celui-ci, nous appelons
une autre fonction de rappel, et lorsque nous définissons cette fonction de
rappel, oui, ici, et enfin, cette fonction de rappel
console ce résultat,
et c'est ce et c'est ce Si sans fonction de rappel, nous voulons exécuter notre code dans le même ordre, nous pouvons le faire Nous avons un étudiant indéfini
et à cause de cela, nous ne pouvons même pas obtenir de résultat Alors maintenant, vous comprenez pourquoi j' accorde autant d'importance à
la fonction de rappel Parce que si vous êtes confus
dans la fonction de rappel, comment pouvez-vous vous concentrer
sur l'apprentissage du nœud ?
53. L'enfer des rappels: Actuellement, dans ce code, nous ajoutons cette fonction de rappel
dans une autre fonction de
rappel. Imaginez maintenant si nous avons
une autre tâche asynchrone, disons mettre à jour À l'intérieur de celui-ci, nous passons
un point de résultat ID, et la fonction de rappel s'exécutera après la mise à jour de notre résultat Nous obtenons ici un résultat mis à jour. Vous pouvez voir que notre code semble
désordonné et difficile à lire car nous avons ici de nombreuses fonctions de
rappel imbriquées les unes
dans les Permettez-moi de supprimer
toutes ces consoles pour que nous
puissions voir clairement, ici nous recevons des rappels imbriqués Cette situation est appelée enfer du rappel,
car nous avons de nombreuses fonctions de
rappel imbriquées les unes dans les autres, ce qui rend le code
difficile à lire et à gérer Si nous avons le même
code en mode synchrone, cela ressemble à ceci Tout d'abord, nous appelons fair
student function et stockons ses données
dans une variable étudiante. Identique à la fonction Obtenir
le résultat et à transmettre le
numéro d'inscription de cet étudiant. Enfin, nous appelons fonction étudiante
mise à jour
et l'identifiant du résultat de la passe, que nous voulons mettre à jour. Vous pouvez voir que le
code synchrone est très simple, facile à
lire et à gérer Maintenant, vous vous demandez peut-être quel est le problème avec l'enfer du
rappel ? Vous voyez, même si nous avons un
rappel, notre code fonctionnera. Le problème est simplement que c'est difficile à lire et à gérer car
dans le monde réel, nous pouvons avoir plus de
trois rappels imbriqués À un moment donné, il
sera très difficile de lire, de gérer et même de mettre à l'échelle. Nous devons donc rendre notre
code facile à lire. C'est vraiment simple. Nous devons simplement créer
notre fonction anonyme, qui est la fonction
qui n'a pas de nom. Convertissez ces fonctions de
rappel anonymes
en fonctions nommées En termes simples, au lieu de définir cette fonction de
rappel ici, nous les définirons séparément et transmettrons le nom de cette
fonction ici Remettons nos consoles en bon état et supprimons
cette dernière fonction. Nous venons de l'ajouter
pour le rappel de démonstration. Ici, nous créons une fonction
appelée cost, print student. Nous pouvons l'appeler n'importe quoi, et j'utilise ici les fonctions de
flèche dans le texte car c'est facile
pour la fonction de rappel Nous pouvons maintenant couper cette fonction de
rappel à partir d' ici et la coller à la
place de cette fonction de flèche Bien et à la place de
cette fonction de rappel, nous passons simplement la fonction print
student Assurez-vous de ne pas appeler la fonction
Imprimer pour étudiants ici. Il suffit de passer la
fonction en paramètre, et cette fonction d'apprentissage d'
impression
s'exécutera ici en tant que fonction de
rappel Maintenant, convertissons rapidement cette fonction de rappel anonyme en
fonction nommée Le résultat d'impression de Cons est donc égal à, et ici nous collons simplement
cette fonction de rappel Et à la place de cela, nous transmettons le résultat de l'impression. Vous voyez, notre code semble maintenant
propre et facile à maintenir. Pour récapituler rapidement, lorsque nous avons des fonctions de rappel
imbriquées, nous avons un problème de guérison des rappels, qui est difficile à lire et à
gérer Quelle est la solution ?
C'est vrai, nous convertissons nos fonctions de rappel anonymes
en fonctions nommées.
C'est aussi simple que ça.
54. Promesse en JavaScript: Dans la
leçon précédente, nous avons vu comment
gérer une tâche asynchrone à l'aide de fonctions de rappel Mais dans cette implémentation, nous avons ce problème d'
aide au rappel, et nous résolvons également ce
problème avec une fonction nommée Maintenant, ma question est la suivante : combien de
nouvelles fonctions créons-nous ? Imaginez que nous ayons dix fonctions de
rappel imbriquées, puis que nous devions créer
dix fonctions nommées avant d'appeler notre fonction
principale Existe-t-il un autre moyen de
gérer les tâches asynchrones ? Oui, il existe
un autre moyen qui consiste à utiliser la promesse.
Qu'est-ce qu'une promesse ? Une promesse est un
objet spécial capable de contenir le résultat d'une opération
asynchrone. En d'autres termes, une
promesse est vous
donner le résultat de
l'opération asynchrone,
ou si l'opération asynchrone
échoue, elle Pour l'instant, nous apprenons les promesses dans le nouveau fichier appelé
promises point js. Ensuite, nous mettons à jour notre code précédent avec l'implémentation
de Promises. Donc, d'abord, nous créons une promesse, puis nous verrons comment utiliser cette promesse.
C'est vraiment simple. Donc, pour créer une promesse, nous écrivons un nouveau mot clé,
puis une promesse. Maintenant, cette promesse est
une classe et elle prend un argument qui est une fonction
avec deux paramètres. Ici, le premier
paramètre est la résolution et le second est le
rejet et la fonction de flèche. Maintenant, dans cette fonction, nous pouvons effectuer notre tâche
asynchrone. Encore une fois, nous
supposons que nous obtenons des
données de la base de données. Nous écrivons donc ici,
définissons la fonction de temporisation
et passons la fonction de rappel
et 3 000 millisecondes Imaginez maintenant que nous obtenions nos
données de la base de données. Nous créons donc une
variable appelée student égale à object, disons, ID à un
et nom à Hurley Maintenant, nous appelons
Resolve parce que nous avons réussi à obtenir les données et
nous transmettons ici cet étudiant. Ici, notre promesse est prête. Faisons maintenant cette promesse invariable appelée
PR pour promesse Bien. Voyons maintenant comment nous
pouvons utiliser cette promesse. C'est très simple, nous écrivons PR, qui est cette promesse, point, et nous avons ici deux
méthodes principales, then et catch. Ainsi, lorsque nous créons une promesse, elle est par défaut
en attente. Et si nous terminons la tâche
asynchrone, promesse est à l'état résolu
ou rempli. Et s'il y a une erreur, alors la promesse est rejetée. C'est ce qu'on appelle un
cycle de vie plein de promesses. Ici, notre
promesse est tenue car nous appelons
ici la fonction de résolution. Ainsi, lorsque la promesse est remplie, nous obtenons nos données selon
cette méthode. Nous stockons maintenant nos données dans ce paramètre de résultat, puis consultons
simplement le dot
log pour ce résultat. Donc, nous allons exécuter ce fichier. Le nœud promet le point gs, vous voyez, au bout de 3 secondes, nous obtenons ce résultat. Maintenant, imaginez que
pour une raison ou une autre, nous n'obtenons pas
de données de la base de données. Ici, nous créons une
variable appelée status et la rendons fausse. Ici, nous ajoutons une condition. Si le statut et mon système s'arrêtent
automatiquement,
laissez-moi le redémarrer. Oui, je suis de retour,
alors continuons. Si le statut est vrai, alors nous exécutons cette fonction de
résolution, sinon nous appelons simplement
ici la fonction de rejet. Maintenant, pour une meilleure pratique, chaque fois que nous
voulons renvoyer une erreur, nous créons une nouvelle erreur et transmettons
notre message d'erreur ici. Il s'agit d'un message d'erreur. Enregistrez les modifications et
exécutons le fichier point js de promesses. Vous voyez, nous avons cette erreur ici. Passons maintenant à cette erreur, comme nous obtenons les données ici
dans la méthode then. Après cette méthode, nous ajoutons une autre méthode appelée
cache et à l'intérieur de celle-ci également, nous passons la fonction de rappel Ici, nous obtenons une erreur de paramètre et consultons le journal à
points pour enregistrer cette erreur. Enregistrez ce fichier et
exécutons à nouveau ce fichier. voyez, nous avons cette erreur ici, et c'est ainsi que nous pouvons consommer promesses en utilisant la méthode then
and catch. Nous pouvons voir qu'au lieu d'utiliser fonction de
rappel pour faire quelque chose après
une tâche asynchrone, nous pouvons utiliser promise pour effectuer
cette tâche asynchrone,
puis simplement consommer cette promesse cette tâche asynchrone,
puis puis En bref, si notre
promesse est résolue,
alors cette méthode s' exécutera, et si notre promesse est rejetée, alors cette méthode de cache s'
exécutera, aussi simple que cela. Si
la création de promesses vous inquiète, ne
vous inquiétez pas avec la pratique, vous vous y sentirez
à l'aise. Permettez-moi de vous dire une chose. Dans le monde réel, 99 % du temps, nous ne consommons que des promesses. Nous n'avons besoin que de quelques fois
de créer une promesse. Dans la
leçon suivante, nous allons gérer notre code de guérison par rappel à l'aide de
promesses. Ça va être amusant.
55. Remplacer les rappels par des promesses: Gérons notre code Callback
L en utilisant des promesses. Vous pouvez télécharger le code de Callback help
ci-dessous de cette leçon Ce code, nous l'écrivons
dans la leçon 4. Copiez le code et collez-le dans un autre fichier callbaclt.js ou également dans le dossier des ressources
et dans le dossier asynchrone, vous obtiendrez ce fichier Vous pouvez également l'ajouter
à votre projet. Maintenant, comme nous le savons, en guise de promesse, nous définissons notre tâche asynchrone. Et nous avons ici les
deux tâches asynchrones dans deux fonctions distinctes Maintenant, au lieu de supprimer
ces fonctions, nous pouvons simplement renvoyer une nouvelle
promesse à partir de cette fonction. Ne vous y trompez pas.
Laissez-moi vous montrer ce que je veux dire. Donc ici, dans la fonction d'
étudiant en feutre, nous renvoyons simplement
ici une nouvelle promesse. Maintenant, ce que nous transmettons
dans cette promesse, nous passons ici la fonction, qui a deux paramètres,
resolve et reject. Maintenant, dans cette fonction,
ce que nous faisons correctement, nous effectuons ici une tâche
synchrone. Nous déplaçons donc cette fonction de
temporisation définie ici en maintenant enfoncées les touches alter ou
option et archies. Maintenant, ici, nous n'avons pas
besoin de ce rappel. Au lieu du rappel, nous transmettons nos données dans
la fonction de résolution, et nous n'avons pas non plus besoin de
rappel dans le paramètre Faisons maintenant la même chose dans
cette fonction de résultat Gad. Nous renvoyons donc la promesse, et nous passons ici la fonction avec deux paramètres,
résolution et rejet. Si vous ne voulez pas
écrire toute cette ligne, laissez-moi vous montrer le
raccourci pour cela. Nous écrivons donc ici une nouvelle
promesse sans espace, et nous sélectionnons cette suggestion. Tu vois, voici
notre nouvelle promesse. Je ne l'ai pas montré
auparavant parce que je veux que tu te sentes à l'aise
avec les promesses. Maintenant, déplaçons également ce code
asynchrone dans la fonction et à
la place de callba,
nous renvoyons ces données dans la méthode de
résolution et, par le
haut, nous supprimons ce par le
haut, nous supprimons Maintenant, profitons de cette promesse. En haut, nous commentons ce code précédent dans lequel
nous vivons l'enfer du rappel Maintenant, nous appelons d'abord fair student function
et passie ID one Cette expression
renverra cette promesse. Stockons cette promesse
dans une variable appelée PR. Nous avons ici notre promesse
dans cette variable PR. Il ne nous reste plus qu'
à tenir cette promesse. Partie. Quelle méthode nous utilisons ici, nous utilisons le point puis la méthode. Ici, nous passons la fonction. Ici, nous obtenons des paramètres, des données, ou nous pouvons les appeler n'
importe quoi, fonction
flèche, et ce que nous voulons faire si nous
avons des données sur les étudiants. Nous voulons simplement appeler la fonction Obtenir les
résultats et transmettre ici inscription des
étudiants, car nous avons
ici une propriété
d'inscription. Assurez-vous d'écrire
la même propriété que vous l'avez faite et que
vous l'avez fait. C'est ainsi que nous
consommons la première promesse. De plus, au lieu de stocker
cette promesse dans une variable, nous pouvons
écrire directement cette expression
ici. Cela vous embrouille, alors ne vous inquiétez pas, vous pouvez stocker la promesse dans
une variable puis la consommer. C'est une pratique courante, et c'est pourquoi je vous montre ici. Maintenant, comme nous le savons, cette fonction de résultat
gat renverra également une promesse. Comment pouvons-nous concrétiser cette
promesse ? C'est vraiment simple. Le lieu d'écriture de la méthode
dix ici, nous pouvons l'écrire après
notre première méthode des dix. Maintenant, ce que nous obtenons de
cette promesse, du résultat, fonction de
flèche, et
simplement de la console par points , le résultat obtenu est le résultat obtenu. Enregistrez les modifications et
exécutons notre fichier d'aide au rappel. Le rappel du nœud ne va pas. Bien. Vous voyez, d'abord, il
va récupérer les données des étudiants Après cela, nous récupérons le résultat,
puis nous l'imprimons. Nous pouvons donc voir qu'en utilisant
ces promesses, notre code semble plus
propre et plus facile à lire. Maintenant, si nous avons une autre fonction dans CallBal, alors similaire à celle-ci, nous retournons ici, cette nouvelle
fonction et nous l'appelons Maintenant, lorsque nous appelons cette
fonction et que nous la renvoyons, nous pouvons ajouter ici une autre
méthode, aussi simple que cela. Certains étudiants peuvent être confus à propos de cet appel de
fonction d'obtention de résultat. Ils demandent ce qui se passe ici. Expliquez ce code en détail. Donc, encore une fois, j' appelle cette
fonction fetch student et je la transmets simplement ici et j'utilise cette
promesse en utilisant la méthode then Et ici, nous obtenons des données sur les étudiants. Lorsque nous obtenons des données sur les étudiants, nous pouvons transmettre la
fonction de flèche normale entre crochets C. Maintenant, à l'intérieur de ces crochets CL,
nous n'avons aucun code. Nous voulons simplement rétablir la fonction
Obtenir le résultat avec l'inscription par points des
étudiants. Donc, comme nous
voulons simplement renvoyer cette seule ligne, nous pouvons supprimer ces crochets C et nous pouvons également supprimer le mot-clé
return. C'est le moyen le plus court de renvoyer quelque chose à partir de
la fonction flèche. Ainsi, lorsque nous voulons renvoyer une ligne à partir de la fonction
flèche, nous écrivons
directement après la flèche. Nous renvoyons ici
cette fonction. Toute cette expression
renvoie une nouvelle promesse. Nous pouvons donc le stocker dans
une nouvelle variable appelée new PR. Maintenant, profitons également de
cette promesse. Nous écrivons newpar point the,
puis nous obtenons le résultat, la fonction
flèche, et nous avons
simplement le journal des points de la console, résultat et nous imprimons
ici ce résultat Maintenant, à la place
de ce nouveau PR, pouvons-nous écrire
toute cette expression ? Bien sûr. À la place du nouveau PR, nous collons cette expression. Et c'est ce que nous avons fait ici. Maintenant, en tant que bonne pratique, lorsque nous avons une promesse,
cette promesse peut également renvoyer une erreur
en utilisant la méthode de rejet. Il vaut donc mieux
gérer cette erreur. Pour cela, nous avons une autre
méthode, le cache. C'est également ce que nous avons vu dans
la leçon précédente. Nous
ajoutons donc ici également la méthode de cache. Ici, nous obtenons un objet d'erreur et nous nous
contentons de consolatog cette Maintenant, pour les tests, nous ajoutons simplement rejet dans la fonction de résultat gat
avant la méthode de résolution, et nous passons ici la nouvelle erreur et le message d'erreur,
résultat introuvable. Enregistrez les modifications
et jetez-y un œil. Exécutons à nouveau cette
application. Il s'agit de patcher des données. Vous voyez, nous obtenons ici un
résultat introuvable. cas d'erreur dans l'une
de ces promesses, cette méthode d'esquisse s'exécutera. est aussi simple que ça. Permettez-moi de commenter
cette méthode de rejet. C'est juste pour tester. J'espère que tous vos
doutes sont clairs. Dans la
leçon suivante, nous allons voir une autre méthode la plus simple pour
écrire ce même code.
56. Async:await en JavaScript: Maintenant, comme nous pouvons le voir dans le Calbecl après cette fonction d'
obtention du résultat, nous consommons
une autre promesse Imaginez maintenant que dans ce Colbecl après cette fonction d'obtention du résultat, nous consommons
une autre promesse Pour cela, nous devons ajouter
une autre méthode que la méthode, et cela peut également être
un peu déroutant. Simplifions ce code en utilisant async et await. Qu'est-ce que Async Awight ? Async awight est un moyen d'écrire asynchrone sous forme de code synchrone. En utilisant async awight, nous pouvons consommer les promesses de
manière beaucoup plus simple Donc, tout d'abord, nous appelons ici fonction étudiante
équitable et nous passons
simplement ici un numéro d'identification. Maintenant, cette fonction
renverra une promesse qui est initialement dans l'état en attente
car dans cette promesse, nous effectuons une tâche
asynchrone. Nous pouvons donc attendre ici que cette promesse soit résolue en
utilisant le mot clé Awight Awight suspend donc l'exécution du code jusqu'à ce que la
promesse soit résolue. Une fois la promesse résolue, elle renvoie les données. Maintenant, lorsque nous obtenons des données, nous pouvons les stocker dans la
variable const student Maintenant que nous avons un objet étudiant, nous pouvons appeler Get result et transmettre ici
student point Enrollment. Cette fonction renverra
également une promesse Nous
appliquons donc à nouveau le
mot clé Await pour cette promesse, get resolve, et cela
renverra également des données. Résultat Const. Ensuite, nous écrivons simplement le
journal CLO Parkansa avec le nom de la propriété, le
résultat, et nous appuyons sur Maintenant, vous pouvez voir
qu'en utilisant un mot clé de pondération, nous pouvons écrire du code asynchrone qui
ressemble à du code synchrone Permettez-moi de commenter
ce code précédent. Enregistrez ceci, et
exécutons à nouveau ce code. Noeud, callbull dots. voyez, ici, nous commençons à récupérer les
données de la base de données, puis nous obtenons le résultat, et à la fin, nous obtenons Notre code fonctionne donc de manière synchrone
car notre code
bloque ici à cette fin Maintenant, comme bonne pratique et pour rendre ce
code asynchrone, nous devons toujours utiliser
cette fonction
asynchrone await inside car dans une fonction normale,
elle ne fonctionnera pas Nous créons donc ici une fonction
appelée résultat d'impression. Et déplacez simplement ce code
dans cette fonction. Vous vous demandez peut-être que c'
est une fonction simple, mais un poids n'est
valide que dans la fonction ASN. Alors, comment pouvons-nous faire de notre
fonction simple une fonction active ? C'est vraiment simple. Il suffit d'ajouter le
mot-clé ASN avant la fonction. Et après cela, nous
appelons simplement cette fonction « imprimer le résultat ». Sinon, comment cela fonctionnera-t-il ? Apportez les modifications, et
vérifions-le. Exécutez à nouveau notre fichier. Bien. Il va chercher et voir ici nous obtenons un résultat et
il ne bloque pas non plus cette fin Nous pouvons voir qu'en utilisant
async et wait, nous pouvons écrire que notre code
asynchrone
ressemble à du code synchrone ressemble Ce code est plus lisible et plus
clair que le code précédent. Maintenant, et si cette promesse
écrivait une erreur en utilisant la méthode de
rejet ? Ici, nous supprimons le commentaire
de la méthode de rejet. Voyons comment gérer erreurs dans la méthode async at Donc, pour gérer les erreurs dans asyncawt, nous devons utiliser la méthode
try and catch C'est également simple.
Laisse-moi te montrer. Donc, tout d'abord, nous ajoutons try et, entre crochets Gy,
nous déplaçons notre code. Maintenant, si quelque chose ne va pas dans ce triplog, notre code est directement
transféré dans le bloc de cache Nous ajoutons donc ici un bloc de cache, et ce bloc de cache a
un paramètre appelé erreur. Et oui, c'est la même erreur
que la promesse écrite
dans la fonction de rejet. Dans le support CLI, nous pouvons simplement consulter le journal à
points de cette erreur. Voyons maintenant si cela
fonctionne ou non. Enregistrez ceci et exécutons
ce fichier une fois de plus. Vous voyez, ici nous avons une erreur. Donc, en termes simples, si une erreur se produit dans ce triplog, ce bloc de
capture s'exécutera. Maintenant, certains étudiants pourraient demander. Il semble que ce 08 bloque l'exécution
de notre code. Et oui, c'est vrai, mais cela n'est vrai que
pour cela en tant que fonction. Ici, nous avons la console et
après cet appel de fonction. Donc, dans la sortie, nous démarrons, puis notre fonction appellera. Dans cette fonction,
elle appellera d'abord fair
student function, qui renvoie une promesse. Un poids interrompra donc l'exécution du code
jusqu'à ce que la promesse soit résolue. Notre code n'
avancera donc pas uniquement dans cette fonction, mais il avancera
en dehors de la fonction. Et c'est pourquoi après le démarrage, nous obtenons N. Ensuite, si nous
avons d'autres lignes, elle les exécutera également. Ne vous inquiétez pas,
Asyncawd est un moyen d'
écrire du code asynchrone qui
ressemble à du code synchrone,
mais notre code fonctionnera mais notre code Pour récapituler rapidement, lorsque
nous avons une promesse, nous pouvons utiliser un mot clé de pondération Un poids interrompt l'exécution
jusqu'à ce qu'une promesse soit résolue et nous
ne pouvons utiliser un poids que dans
la fonction asynchrone Pour gérer les erreurs
dans une méthode syncowt, nous utiliserons le blog try and catch Nous recevons une erreur
dans le blog sec, alors notre méthode de cache
fonctionnera aussi simplement que cela. C'est ainsi que nous pouvons
utiliser les promesses de manière beaucoup plus simple que
cette méthode T and catch. C'est à vous de choisir
ce que vous voulez utiliser. Ils fonctionnent tous les deux de la même manière. C'est à vous de décider
ce que vous voulez utiliser. De plus, si dans Async et AD vous
souhaitez ajouter le blog TryCatch, écrivez simplement Tricach
et sélectionnez Tu vois, nous avons ici Tri Case Block. J'espère que
cette section vous apprendra beaucoup de choses ou que ces
concepts seront actualisés Sans clarifier ces concepts, nous ne pouvons pas passer aux applications
BG. Si vous
regardez continuellement ce cours, faites une pause de cinq à
dix minutes, prenez l'air et je vous
verrai dans
la section suivante.
57. Section 07 Bases MongoDB: Bienvenue dans la septième section du cours ultime sans JS. Jusqu'à présent, dans nos projets, nous définissions les données dans
un simple tableau JavaScript. Mais le problème avec
cette approche est que
lorsque nous redémarrons notre
serveur ou notre application, nos données sont réinitialisées à valeur
définie et nous perdons
les modifications apportées à nos données. Maintenant, à ce moment-là, la base de données
entre en ligne de compte, nous allons
donc stocker nos
données dans la base de données. Il existe de nombreux types d'options de
base de données comme
MySQL, SQL Lite, Mongo Dib, etc. Mongo DB est la base de données la plus utilisée
avec des applications de nœuds, et c'est ce que nous allons
apprendre dans ce cours Maintenant, une chose que je tiens à préciser, c'est qu'après avoir
terminé ce cours, vous ne
maîtriserez pas complètement
Mongo DB car Mongo Di B lui-même dure
quatre à cinq heures, mais je vais essayer de couvrir
autant de sujets que possible Dans cette section,
nous allons donc
commencer par les bases de données de base de données, puis nous
passerons à la création, à
la lecture, à la mise à jour et à
la suppression des données en faisant de l'exercice. Je suis très excitée, et
j'espère que vous l'êtes aussi. Passons donc à cette section.
58. Introduction aux bases de données: Maintenant, avant de commencer à
apprendre Mongo Deb, il vaut mieux apprendre quelques termes
de base de données Comme vous le
savez peut-être, une base de données est un ensemble organisé d'informations
structurées
appelées données, stockées sur l'
ordinateur ou sur le cloud. Dans les anciennes écoles, notre
professeur utilisait un livre ou un registre pour suivre
l'assiduité des élèves. C'est une base de données, mais
elle est sur papier dur. Dans le monde d'aujourd'hui, nous utilisons un système informatique pour
stocker ces données, afin de pouvoir y accéder à tout
moment et de n'importe où. Nous le savons tous, non ? Il existe maintenant deux
types de base de données. premier est une base de données SQL
ou une base de données relationnelle, et le second
n'est pas une base de données SQL ou une base de données non
relationnelle Ils diffèrent dans la façon dont
ils organisent, stockent et gèrent les données. Laissez-moi
vous expliquer cela un par un. SQL est donc l'abréviation de langage de requête
structuré. La base de données SQL est bien
organisée et remplit les armoires. Ces deux données sont présentées dans des tableaux utilisant plusieurs colonnes
et lignes de ce type. Nous pouvons voir que c'est une structure très
organisée. Chaque colonne du
tableau représente remplissage de
données
différent, comme le nom, adresse
e-mail, le
numéro de téléphone et le mot de passe, et chaque ligne du tableau
représente un nouvel ensemble d'utilisateurs. Nous devons transmettre des
données utilisateur uniques pour toutes ces colonnes, et c'est pourquoi il s'
agit d'un tableau organisé. Maintenant, d'un autre côté,
aucune base de données SQL n'est comparable tableau
flexible où nous pouvons organiser les données comme nous le voulons. Dans aucune base de données SQL, nous n'avons pas de tables
car elles ne
suivent pas une structure stricte
basée sur des tables
ou une structure basée sur un schéma. bases de données SQL stockent les données dans des formats
plus flexibles tels que des documents
DSN ou des paires
clé-valeur Par exemple, si nous avons
les mêmes données utilisateur, nous pouvons les stocker
ainsi dans une paire clé-valeur. Nous n'avons pas besoin de fournir
tous les champs pour chaque utilisateur, c'est pourquoi nous pouvons parler de schémas ou de structure
flexible de schéma Les options populaires pour SQL sont
MesquleQtoOracle, etc. Où dans le NoSQL, nous avons Mongo DIBRDS On pourrait se demander quand nous choisissons SQL et quand nous optons
pour une base de données sans SQL. Cela dépend
donc du type de données que vous traitez et des
besoins de votre application. Nous utilisons le langage SQL si nous voulons que nos données soient structurées et
organisées sous forme de tableau. De plus, si nous devons exécuter des requêtes
complexes à des fins d'analyse ou si
la cohérence des données est utilisée, nous utilisons la base de données SQL. autre côté,
nous n'utilisons pas de code SQL Si nous voulons que nos données soient
non structurées ou semi-structurées, exception d'une croissance rapide des données, nous avons besoin de flexibilité
dans notre modèle de données notre application fonctionne en temps
réel ou utilise des mégadonnées,
alors nous n'utilisons aucune base de données SQUL Par exemple,
nous créons des applications de commerce électronique dotées de nombreuses fonctionnalités, telles que la possibilité pour les
utilisateurs de télécharger des avis, suggérer des
produits dans lesquels nos données ne sont pas structurées
ou semi-structurées, et les utilisateurs peuvent également donner des
avis en grand nombre. À l'époque, quelle
base de données devons-nous choisir ? C'est vrai, nous n'utilisons ici
aucune base de données SQL. Prenons un autre exemple. Supposons que nous construisions un système
bancaire dans lequel nous avons besoin données
strictes et de transactions
financières précises. Quelle base de données choisir ? Bien, utilisez ici SQL. Cela dépend
donc vraiment du type de données que nous traitons et du type d' application que nous voulons créer. La plupart du temps, votre
équipe vous indiquera quelle base de données vous devez
ajouter dans votre application. Ne vous inquiétez donc pas pour ça. De nombreux développeurs
ne connaissent pas vraiment la différence entre SQL et aucun
SQL. Tu sais, non ? Dans de nombreuses applications de nœuds, choix par défaut des
développeurs est Mongo DB, qui est la base de données No Squal. Et si vous voulez
devenir développeur MSTech, c'est pour Mongo Dans ce cours, j'ajoute
MongoDB en tant que base de données. Ne vous inquiétez pas, nous allons apprendre
MongoDB étape par étape.
59. Installer MongoDB sous Windows: Installons Mongo
DV sous Windows, et si vous avez MG, vous pouvez ignorer cette leçon Tout d'abord, rendez-vous
sur mongodib.com. Accédez maintenant à ces produits et
sélectionnez Community Edition. Accédez à la communauté de téléchargement. Faites défiler vers le bas. Et ici, nous pouvons
sélectionner la version Mongo Di B. Dans ma recommandation,
veuillez ne pas le modifier. Ensuite, nous pouvons sélectionner
notre plate-forme, puis vous pouvez sélectionner le package. Ne vous inquiétez pas,
cliquez sur Télécharger. Vous voyez, le téléchargement est lancé. Maintenant, une fois
le téléchargement terminé, ouvrez cette configuration et il vous demandera
l'autorisation d'installation. Permets-le. Cliquez sur Suivant. Acceptez le contrat.
Cliquez sur Terminer. Ensuite, à partir de là, nous pouvons modifier notre chemin
d'installation. Mais si vous n'avez aucune
raison, ne la changez pas. Cliquez simplement sur Suivant. Assurez-vous de sélectionner
cette boussole Mongo DB, qui est l'application
pour MongoDB, dans laquelle vous pouvez afficher
toutes les tables de base et les modifier ou les supprimer Cliquez sur Suivant et installez. Cela prendra environ cinq à dix minutes car nous
installons également la boussole
Mongo DB Maintenant, après avoir terminé cette installation,
vérifions-le. Ouvrez l'invite de commande,
écrivez Mongo D et appuyez sur Entrée. Nous obtenons cette erreur,
Mongo D n'est pas reconnue comme une commande interne
ou externe Donc, pour résoudre cette erreur, nous devons à nouveau aller sur le site Web de
Mongo Db et les meilleurs produits et
voir tous les produits dans les outils Maintenant, faites défiler cette page vers le bas, et nous obtenons ici l'option cellule. Alors sélectionnez-les maintenant, cliquez
sur Télécharger, faites défiler l'écran vers le bas. Et nous
téléchargeons à nouveau cette configuration. Maintenant, une fois
le téléchargement terminé, ouvrez ce dossier de téléchargement et extrayez le zip que
nous venons de télécharger. Bien. Maintenant, ouvrez ce dossier, et dans le dossier bin, nous obtenons ce fichier Mongos Il suffit donc de les copier et d'ouvrir les fichiers du programme de
votre lecteur C. Serveur MongoDB, 8.0 B, et ici nous collons l'application
définie Ce Mongos est notre cellule
Mongo DB. Nous devons maintenant faire une dernière étape, qui consiste à définir ce chemin sur le chemin
de l'environnement. Copiez donc ce chemin dans start, recherchez la variable d'environnement et ouvrez l'édition des variables d'
environnement système. Permettez-moi de terminer. Maintenant, cliquez sur ces variables d'
environnement, et dans les variables système, sélectionnez le chemin, puis cliquez sur Modifier. Nous devons maintenant ajouter
ce chemin de corbeille ici, alors cliquez sur Nouveau et accélérez
ce chemin. Cliquez sur OK. OK, et OK. Encore une fois, ouvrez l'invite de commande. Nous écrivons des mangues et appuyons sur Entrée. Nous allons obtenir la cellule Mongo DB, nous avons
donc installé avec succès
Mongo DB dans notre système Maintenant, permettez-moi de vous donner un bref aperçu de cette boussole Mongo DB Lorsque nous ouvrons cette
boussole pour la première fois, nous devons entrer notre chaîne de
connexion, qui est notre
hôte local, la colonne 27017 Vous pouvez écrire cette chaîne de
connexion, que j'ai ajoutée, puis cliquer
sur Enregistrer et connecter. voyez, ici, nous pouvons voir notre
base de données et nous
pouvons également voir les tables et A,
nous pouvons voir les documents.
60. Connecter MongoDB avec l'application Node: Nous installons donc Mongo
Di B dans notre système. Connectons maintenant ce Mongo
Di B à l'application node. Donc, pour apprendre le Mongo Di B, nous allons créer un nouveau
projet car je ne
veux pas que vous vous confondiez avec le projet Tastak
précédent Nous ajouterons Mongo Di B comme exercice dans ce
projet. Ce sera amusant. Donc pour l'instant, dans le dossier
des projets, nous créons un nouveau dossier, disons Mongo demo, nom
bizarre, mais c'est
bon pour l'apprentissage Ouvrons ce dossier
dans le code VS. Maintenant, pour initialiser ce projet, nous ouvrons notre terminal
et y écrivons NPM. Bien. nous ouvrons notre terminal
et y écrivons NPM. Bien.
Et ici, nous créons
un nouveau fichier, index point gs. Maintenant, dans les applications de nœuds pour gérer et travailler
avec MongoDB, nous utiliserons une
bibliothèque très populaire, les mangos En termes simples, en
utilisant la bibliothèque Mongoose, nous pouvons facilement travailler
avec Mongo DB Installons cette bibliothèque
en utilisant NPM install Mongoose, si vous voulez obtenir
le même résultat que celui que j'obtiens dans ce cours, alors ici
au taux 8,13 Bien. Maintenant, pour utiliser cette bibliothèque, importons d'
abord en
utilisant la fonction requise. Ici, nous passons mongoose et nous le
stockons dans la variable
const Maintenant, cet
objet mangouste possède de nombreuses méthodes. L'un d'eux est connect, donc mongoos dot connect Ici, nous devons transmettre l'URL de la base de données
Mongo DB à laquelle
nous voulons nous connecter Nous ouvrons ici l'application de
boussole MongoDB. Ici, nous pouvons voir que nous avons une chaîne de
connexion, qui est l'
hôte local, colonne 27017 Dans notre code, nous
écrivons les codes Mongo DB,
colonne, double barre oblique, hôte
local, colonne 27017, qui représente la base de données
Mongo Deb locale, barre
oblique,
et ici nous écrivons le nom de notre collection de base de
données spécifique, disons Mongo Demo,
ce
n'est pas le nom de l'application,
c'est le nom de la base de données. Ne vous inquiétez pas, nous verrons
cela dans les prochaines sections. Maintenant, cette expression
renvoie une promesse, et vous vous souvenez, comment
pouvons-nous gérer une promesse ? Nous pouvons utiliser les méthodes then
et catch, ou nous pouvons utiliser async await Actuellement, nous n'
avons pas de promesses imbriquées, donc pour simplifier, nous pouvons
utiliser la méthode here, then Si vous souhaitez utiliser
ASN et Aviate, vous
devez créer
une nouvelle fonction ASN Nous ajoutons donc ici cette méthode dix, ce qui signifie que nous la connectons
avec succès à la fonction flèche, et nous nous contentons d'enregistrer les points de la console, Mongo Dib s'est connecté Il peut donc arriver qu'un
problème se produise, comme une perte de
connexion Internet, une base de données introuvable ou une erreur dans
la chaîne de connexion. À ce moment-là, nous aurons une
erreur dans cette promesse. Nous ajoutons donc également
ici la méthode de capture, et ici nous obtenons un objet d'erreur. Et nous avons simplement enregistré les points de la console, connexion à la base de données
Mongo a échoué Utilisez cette virgule pour cet objet d'erreur. Donc, en gros, nous
disons à Mongoose connecter notre application à cette base de données locale, Mongo demo Vous vous demandez peut-être que nous n'avons pas créé cette base de données de
démonstration Mongo Comment Mongoose peut-il connecter notre application
à cette base de données ? Cela nous donnera-t-il une erreur ? Et la réponse est non, cela ne nous
donnera pas d'erreur car si cette base démonstration
Mongo n'est pas
disponible dans notre système, Mongoose créera une nouvelle base de données
appelée Mongo demo, et si cette base de données
est déjà disponible, elle l'utilisera simplement Maintenant, si cette base de données s'
est connectée avec succès, nous enregistrons le message de réussite, et si notre connexion
échoue, nous enregistrons cette erreur. Enregistrez les modifications et exécutons notre application en utilisant
nodemon index point JS Vous voyez, ici, la
connexion est réussie. C'est ainsi que nous connectons
Mongo Di Be notre application de nœud en utilisant la méthode de connexion par points de
Mongo Maintenant, laissez-moi vous dire quelque chose. Auparavant, Mongo
Di Be utilisait une ancienne méthode de
connexion à la base de données, mais elle n'était pas parfaite, qui posait
un problème aux développeurs Dans un ancien code, vous verrez ces options transmises lors
de la connexion. Ces options servent simplement à mieux
gérer la connexion. Vous pouvez utiliser le nouvel analyseur d'
URL sur true,
ce qui indique à Mongoose d'utiliser la méthode moderne pour
se connecter à Mongo DB Nous pouvons également utiliser la
topologie unifiée de True,
qui permet à Mongos de gérer les connexions de manière plus fluide
et plus stable Maintenant, dans la nouvelle version de Mongo Di, ces options sont activées par défaut, nous n'avons
donc pas besoin
de les transmettre ici. Je vous en ai parlé, si
vous voyez ce type de code, cela ne
vous embrouille pas. Dans la leçon suivante, nous allons créer notre
premier schéma de document.
61. Importance de Schema: Avant de stocker nos
données dans notre base de données, il est préférable de définir
la structure des litières pour ces données. Par exemple, nous voulons
enregistrer un nouvel utilisateur
sur notre site Web. Il remplit donc le formulaire avec son nom, son e-mail, son numéro de téléphone
et son mot de passe. Et lorsque nous cliquons sur Enregistrer, nous stockons ces informations
dans notre base de données. Maintenant, en tant que développeur, nous savons que parfois
l'utilisateur oublie d'écrire son nom ou oublie d'écrire son
e-mail ou son mot de passe. L'utilisateur peut tout oublier. Pour éviter cela, nous
définirons une structure de litière
pour ces données, ce qui signifie que nous pouvons
définir le nom obligatoire, e-mail comme champ unique, ce qui signifie que chaque utilisateur doit
utiliser une adresse e-mail unique. Le numéro de téléphone peut être
n'importe quoi ou l'utilisateur peut également ignorer ces informations et le
mot de passe est également requis. Maintenant, si l'utilisateur ne transmet pas son
nom ou écrit un mauvais e-mail, ses données ne seront pas
stockées dans notre base de données. Nous renverrons une erreur
pour cet utilisateur, et c'est ainsi que nous pouvons empêcher données
indésirables et inutiles stockage de données
indésirables et inutiles dans notre base de données. C'est pourquoi il est
important de définir une structure et cette structure
est appelée schéma. Vous pourriez demander dans la leçon d'
introduction à la base je vous ai dit que Mongo DB or no SQL est le schéma ou la structure flexible du
schéma, et SQUL est la structure
basée sur le schéma, et maintenant je
vous demande de définir Pourquoi ? Nous savons que dans MongoDB, nous stockerons les données dans
la paire clé-valeur Supposons que dans notre exemple
précédent, un nom de
champ de passe utilisateur,
e-mail , adresse e-mail, ou
nom d'utilisateur, alors comment pouvons-nous gérer
ce type de données ? MongoDB est flexible en termes de schéma, ce qui signifie que nous n'
avons pas à définir de schéma Cependant, la définition d'un schéma
assure la cohérence, la validation et la
prévisibilité, qui sont cruciales dans la plupart des applications au niveau
de la production Un schéma nous aide à éviter les données
indésirables ou sales. De plus, en définissant le schéma, nous pouvons écrire la
logique de requête plus clairement. Vous pouvez maintenant demander à Mongo Di B s'il s'agit schémas ou d'une structure
flexible de schéma Comment définir la
structure dans MongoDB ? La réponse est que Mongo DB n'
applique pas le schéma à ses données. Mais en utilisant d'autres
outils tels que Mongoose, nous pouvons définir le schéma de
nos documents Mongo DB De plus, si vous
connaissez le langage SQL, nous avons une table, supposons un utilisateur, et dans cette table, nous avons des lignes pour chaque utilisateur. Maintenant, dans Mongo Di B, cette table s'
appelle une collection. Cette ligne peut être
appelée document. Ne vous y trompez pas lorsque j'utilise des mots tels que collection
et document. Ils sont très similaires
à la table et à la ligne. Pour récapituler, nous pouvons
définir le schéma notre collection Mongo Dew pour une meilleure utilisation de
notre Dans la leçon suivante,
nous verrons comment définir le schéma de notre collection
Mongo Dew
62. Définir le schéma pour le document: Voyons comment définir un
schéma à l'aide de mangues. Pour cela, nous utilisons nouveau schéma de points mangos,
qui est une classe Maintenant, dans cette parenthèse, nous allons ajouter un objet avec notre nom de remplissage et
la structure de ce remplissage Par exemple, nous avons d'abord besoin du nom, la colonne, et nous écrivons ici le type de données que
nous voulons stocker. Donc, pour le nom, nous
voulons stocker le flux. Assurez-vous d'écrire
en majuscules. Maintenant, après cela, nous aurons peut-être un e-mail et
nous le voulons également sous forme de chaîne. Maintenant, comme je vous l'ai déjà dit, nous voulons stocker le courrier électronique sous forme valeur
unique pour chaque
document ou ligne. Alors, comment pouvons-nous définir
cette unicité ici ? Simplement, à la place de cette
chaîne, nous passons un objet. Cet objet possède
plusieurs propriétés. abord, nous voulons définir le type de ce remplissage,
qui est une chaîne, puis nous avons
une autre propriété unique et nous lui donnons la valeur true. Donc, si nous avons déjà un
e-mail pour un utilisateur, ce même e-mail ne peut pas être
utilisé pour un autre utilisateur. Après cela, disons que nous avons téléphone et que nous passons ici l'objet, et que nous définissons le type sur le numéro. Ici, nous ne voulons pas
rendre ce remplissage nécessaire. L'utilisateur peut également ignorer
ce téléphone rempli. Donc, ici, on ne passe rien. Et si nous voulons uniquement transmettre la propriété
de type pour le remplissage, nous pouvons directement écrire
comme ce numéro. Mais j'aime suivre
une syntaxe cohérente, alors je laisse les choses telles quelles. Mais dans le champ de nom à
la place de cette chaîne, nous ajoutons simplement un objet
de type à la chaîne, et nous voulons également rendre
ce champ obligatoire. Nous ajoutons ici, required to true. Assurez-vous que nous écrivons ici
obligatoire et non obligatoire. Je ne suis pas sûr que only
require fonctionne ou non. De plus, nous stockons toujours notre identifiant
EML en minuscules, et nous pouvons également le définir
ici en minuscules pour vrai Vous pouvez voir que la définition du schéma n'
est pas difficile. C'est très simple. Maintenant, après cela, nous avons le
mot de passe et nous
voulons le stocker sous forme de chaîne.
C'est le champ obligatoire. Dites-moi quelles propriétés
nous devrions ajouter ici. Bien, nous ajoutons ici le type à la
chaîne et required à true. Tu t'en sors vraiment très bien. Maintenant, après cela, cet
utilisateur peut avoir des loisirs, qui peuvent être multiples. Nous voulons donc le stocker dans un tableau. Tapez entre crochets, qui sont un tableau, et dans ce texte, nous voulons une chaîne simple. Nos loisirs pourraient donc
ressembler à ce tableau de cordes. Ensuite, il
se peut que nous ayons vérifié quel utilisateur source
est vérifié ou non, et nous avons défini son type sur Bullion, ce qui signifie vrai ou faux Et par défaut, nous voulons
enregistrer l'utilisateur comme non vérifié. Pour cela, nous avons donc une autre
propriété appelée default. Nous passons la valeur par défaut à false. C'est ainsi que nous définissons le schéma
de notre collection Mongo DB. Dans le schéma, nous avons plusieurs types de
schéma tels que chaîne, nombre, booléen,
date, objet, tableau, ID d'
objet, que nous
verrons dans le futur, B pour stocker les données binaires
mélangées à tout type
de données , bien plus encore Si vous souhaitez connaître tous les
types de schémas et leurs propriétés, vous pouvez consulter cette documentation sur
Mongoose Sur cette page, nous obtenons
toutes les informations. Dans la leçon suivante, nous
verrons comment appliquer ce
schéma à la collecte.
63. Créer des modèles sur: Dans la leçon précédente, nous avons
créé ce schéma utilisateur. Maintenant, comment définir quelle collection doit
suivre ce schéma ? Pour cela, nous devons
créer un modèle. Donc, tout d'abord, nous stockons ce schéma dans une variable
appelée schéma utilisateur. Maintenant, pour appliquer ce schéma utilisateur, nous devons créer un modèle. Nous écrivons donc ici
Mongoose Dot Model. À l'intérieur, en
première position, nous passons le
nom singulier de notre collection, qui est ici user. Cet utilisateur deviendra donc la collection
des utilisateurs. Si nous voulons créer une collection appelée post, qui est au pluriel, alors ici, nous devons écrire nom
singulier de cette
collection, qui est post Maintenant, au deuxième argument, nous allons transmettre notre schéma
pour cette collection d'utilisateurs, qui est ce schéma utilisateur. Maintenant, cette expression
renverra le modèle pour la collecte
utilisateur. Nous le stockons donc dans
une variable appelée user. Pouvez-vous me dire pourquoi j'utilise cette convention pascal ou
pourquoi j'utilise U comme modèle d'utilisateur ? C'est parce que cet utilisateur est une classe et en utilisant cette classe ou ce modèle
d'utilisateur, nous allons faire beaucoup de choses. Simplifier le modèle, c'est
comme un plan pour créer et utiliser des documents dans une collection Mongo
Deb Définit la forme
de nos données à l'aide d'un schéma et fournit un moyen d'interagir
avec cette collection. En termes simples, le modèle
nous permet de créer de nouveaux documents
basés sur le schéma, lire les données de la collection, mettre à jour les documents existants et supprimer des documents
de la collection. Bref, sans modèle, on ne peut rien faire avec la collection
Mongo Di Bi Ne vous inquiétez pas, nous verrons tout cela dans les
prochaines leçons. heure actuelle, laissez-moi vous
montrer comment créer un nouvel utilisateur
en utilisant ce modèle d'utilisateur. Donc, pour créer un nouvel utilisateur, nous écrivons new user, et à l'intérieur de celui-ci, nous allons
transmettre notre objet utilisateur. Le premier champ de
cette collection est donc le nom et la valeur de passe sous forme de code plus U. Vous pouvez écrire votre nom Ensuite, nous avons un e-mail, disons, code à did gmail.com Actuellement, nous écrivons
ces valeurs
manuellement , mais
dans le monde réel, notre utilisateur du
front-end écrit cette valeur et la soumet
à l'aide d'une requête de publication. Et dans le back-end, nous
traiterons cette demande de publication, et dans la logique de la
demande de publication, nous écrirons cette
nouvelle expression de modèle. Donc, ne t'inquiète pas pour ça. Ensuite, nous avons le téléphone, qui peut être n'importe quoi
23, 51, 552. Ensuite, nous avons le mot de passe. Assurez-vous que nous écrivons ici le même nom de remplissage que celui
défini dans le schéma. Mot de passe pour les chaînes 123, quatre, cinq, six, 78. Et des loisirs à la gamme, et j'ajoute ici l'apprentissage,
l'enseignement et le suivi. Pour le dernier champ, nous avons déjà défini la
valeur par défaut dans notre schéma, nous n'avons
donc pas besoin de
transmettre ce champ ici. C'est ainsi que nous pouvons créer un nouvel utilisateur ou un nouveau document
de la collection. Ici, nous le stockons dans une
variable par nouvel utilisateur. À l'heure actuelle, ce nouvel utilisateur n'
est disponible que localement. Dans la leçon suivante,
nous verrons
comment enregistrer ce nouvel
utilisateur dans notre base de données.
64. Enregistrer une nouvelle donnée: Nous avons donc ici de nouvelles données utilisateur. Maintenant, stockons-le
dans notre base de données. Ces nouvelles
données utilisateur ont donc une méthode
, le point CV. En utilisant cette méthode de sauvegarde, nous pouvons stocker ces nouvelles
données utilisateur dans notre base de données. L'enregistrement des données dans la
base de données est désormais une tâche asynchrone, ce qui signifie que l'enregistrement de nouvelles
données dans la base de données peut prendre un
certain temps C'est pourquoi cette
expression renvoie une promesse. Vous pouvez adhérer, attendre et lorsque nos données seront
stockées avec succès dans la base de données, l'
objet utilisateur
stocké sera renvoyé de la base de données, afin que nous puissions le stocker
dans une variable appelée données
stockées et simplement enregistrer les
points de la console avec les données stockées. Maintenant, comme nous le savons, lorsque
nous voulons utiliser await, nous avons besoin d'une fonction acing et ce n'est
qu'à l'intérieur de cette fonction que nous pouvons utiliser await Sinon, notre code
bloquera les lignes suivantes. Ici, avant ce
nouvel objet utilisateur, nous créons une nouvelle
fonction de course appelée create user Et dans cette fonction, nous pouvons simplement déplacer ce
nouvel utilisateur et enregistrer la méthode. Et à la fin, nous appellerons
cette fonction de création d'utilisateur. Maintenant, n'enregistrez pas le fichier, il
exécutera automatiquement ce fichier. Au terminal, j'arrête notre liaison de nœuds en utilisant Control plus C.
Maintenant, enregistrez les modifications, et voyons si cela
fonctionne ou non. Sur le terminal, nous exécutons ce
fichier en utilisant node index point js. N'utilisez pas ici nodemon
car nous ne voulons exécuter ce fichier index
point js qu'une seule fois. Si nous utilisons le nœud M et que nous
modifions quelque chose dans notre fichier, un nouvel utilisateur sera
créé à chaque fois. voyez, ici, nous obtenons de
nouvelles données utilisateur avec nos remplissages et à la fin, nous obtenons
également un identifiant de soulignement, qui est l'
identifiant unique de ce document Il est généré par
Mongo DB et en utilisant cet identifiant, nous pouvons faire beaucoup de choses De plus, nous arrivons ici à
souligner jusqu'à zéro. Est-ce que c'est ça ? Ce trait de
soulignement est utilisé pour décrire la
détérioration du document dans Lorsque nous créons un nouveau document, Mongoose ajoute le trait de
soulignement rempli et le met à zéro Désormais, chaque fois que le
document en question est mis à jour, mangues augmentent le trait de
soulignement rempli d' Pour l'instant, ne t'inquiète pas pour ça. Nous pouvons également voir ces données dans l'application de
boussole Mongo DV Regardez dans la base de données locale, ici nous n'obtenons pas notre base de données, cliquez sur les points de l'arbre
et actualisez la base de données. Vous voyez, maintenant nous avons la base de données de démonstration
Mongo. À l'intérieur, nous avons une collection d'
utilisateurs, que nous avons créée à l'aide d'un modèle, et dans cette collection, nous avons notre premier document
avec un identifiant unique, ainsi que nos remplissages. Supposons que ce tableau Obs, qui est une paire clé-valeur, clé soit l'indice
de cet élément
et que la valeur soit notre chaîne. Nous obtenons les données de la base de données
dans notre fichier JS à points d'index, puis nous obtenons
un tableau normal de chaînes. Cela s'affiche simplement ici
dans la paire clé-valeur. De plus, vous voyez, par défaut, nous avons défini cette
valeur vérifiée sur false. Et oui, nous pouvons modifier les données
depuis cette application. Donc, pour récapituler rapidement,
nous créons d'abord un nouvel objet utilisateur
en utilisant ce modèle utilisateur, puis nous pouvons simplement utiliser méthode
Lots pour enregistrer
ce document Essayons maintenant de stocker les données d'
un autre utilisateur car nous
en aurons besoin pour les leçons à venir. J'ai changé son nom en Halley, e-mail à Halley sur
direct gmail.com Si vous voulez changer quelque chose, et que vous pouvez modifier le numéro de
téléphone, le mot de passe, Harley 123 et vos loisirs,
disons, le codage, le
Jimming et Enregistrez les modifications et
dans notre terminal, nous exécutons node index point js. Bien, tu vois, nous avons de nouvelles données. Si nous consultons notre boussole
Mongo Di B, nous n'obtenons pas de données ici Nous actualisons donc à partir d'ici et
voyons ici que nous obtenons nos nouvelles données. C'est ainsi que sont traitées les données
de notre base de données. Si nous suivons cette étape par étape, c'est vraiment simple.
65. Recherche de données: Voyons maintenant
comment interroger les données. Mais vous vous demandez peut-être quel
est le sens de requête ? La requête est simplement une
demande d' informations
provenant de la base de données. En termes simples, une
requête est simplement un moyen de demander à la base de données
des données spécifiques en fonction de
certaines conditions. Par exemple, à partir de la collection de nos
utilisateurs, nous voulons obtenir les
données de tous les utilisateurs. Tout d'abord, nous écrivons le
modèle de cette collection, qui est le point utilisateur. Ici, nous
obtenons plusieurs méthodes de requête. Nous avons trouvé par
identifiant, et nous en avons trouvé un. Nous avons également d'autres bonnes méthodes mise
à jour, de suppression et de remplacement. Ne t'en fais pas pour ça. Nous les
verrons dans les
prochaines leçons. Actuellement, nous nous
concentrons uniquement sur cette découverte, qui est utilisée pour trouver plusieurs documents de notre collection. Nous avons donc Fine n
qui est utilisé pour récupérer un seul document
de la collection Nous avons également Fine by ID, qui est utilisé pour récupérer
le document par son identifiant unique Actuellement, nous voulons
récupérer plusieurs documents, c'est pourquoi nous utilisons ici le point Find Maintenant, cette expression renverra
également une promesse. Nous pouvons utiliser ici alors la méthode, ou nous pouvons utiliser Ising await. Dans ce cas d'utilisation, ain await est plus simple et nous aide
à écrire clean core. Ici, nous créons une nouvelle fonction
ing appelée get
users et nous déplaçons simplement cette
wait dans cette fonction. Désormais, cela
renverra les données de tous les utilisateurs de la collection
d'utilisateurs. Nous les stockons dans une variable appelée
users et Consol
enregistre les données de ces utilisateurs par points Toujours à la place de
cette fonction creatuser, nous appelons GTUsersFunction et la
déplaçons en dessous de cette fonction Voyons maintenant si nous
obtenons des données ou non. Enregistrez les modifications. Et exécutons cette application en utilisant
node index point gs. Vous voyez, ici, nous obtenons un tableau
de données de deux utilisateurs. Le premier est Code
PlusU, puis Harley. Charmant. C'est ainsi que nous récupérons
toutes les données de la collection Maintenant, rendons cela
plus intéressant. Supposons que nous voulions trouver uniquement les utilisateurs
dont le nom est Harley Donc, pour ce faire, nous passons
l'objet dans la méthode fine. Ici, nous pouvons définir plusieurs conditions
dans une paire clé-valeur. C'est un nom que deux
encodent Harley. Cela permettra de trouver toutes les
données des utilisateurs dont le nom est Halley. De plus, ici, nous pouvons passer plusieurs conditions telles que Es
verified à false, etc. Cette requête
vérifiera si le nom est Halle et si sa
valeur vérifiée est fausse ou non. Si les deux conditions sont vraies, ce n'est qu'alors que nous obtenons les données de
ces utilisateurs. Dites ceci et
lançons notre application. voyez, ici, nous avons un tableau
vide. Pourquoi ? Comme nous pouvons le voir dans notre base de données, nous avons le nom Halle et
il est également vérifié qu'il est défini sur false. Alors pourquoi nous n'
obtenons pas ces données. Ici, dans la propriété name, nous passons Halle en minuscules. Mais dans la base de données,
H est en majuscule. Modifions donc cette condition, voyons ce qu'elle change et exécutons notre application
une fois de plus. Tu vois, c'est ici que nous obtenons nos données. N'oubliez donc pas que si nous passons
chaîne pour condition, assurez-vous d'écrire
en faisant la distinction majuscules et minuscules. Bien. Maintenant, nous
obtenons actuellement des données avec tous les remplissages. Et si nous voulions juste récupérer le nom d'utilisateur et
les loisirs ? Donc pour cela, après
cette méthode fine, on peut ajouter la méthode select
et à l'intérieur des codes, on passe le nom de nos champs
séparés par un espace. Nous écrivons Name Space Hobbies. Si nous voulons d'autres champs, nous pouvons également passer
ici avec de l'espace. Pour l'instant, ce n'est pas ce que nous voulons. Enregistrez les modifications et
lançons notre application. voyez, ici, nous n'obtenons que le nom, loisirs et l'identifiant de soulignement qui sont automatiquement
ajoutés par Mongo DB De plus, si
nous voulons simplement supprimer un
ou deux remplissages de nos données , comme ici, nous voulons que toutes les données soient vérifiées, sauf le mot de
passe. Donc, à la place de
ces noms de remplissage, nous passons moins le mot de passe, l'espace, le moins est vérifié. Enregistrez les modifications, ouvrez le terminal et exécutons notre fichier. voyez, ici, nous obtenons tous les échecs sauf le mot de passe
et la vérification. C'est simple. Faisons maintenant cette requête
un peu plus avancée. Supposons que nous ayons 100 données utilisateur et que nous voulions récupérer ces données, mais comment pouvons-nous récupérer 100
données dans un seul tableau ? Il vaut mieux récupérer les dix
premières données, puis les dix
autres Nous supprimons donc cette
condition car nous voulons toutes les données et
après la sélection, nous ajoutons une limite à l'intérieur de celle-ci, nous pouvons transmettre le nombre d'
enregistrements que nous voulons voir. Disons dix. Enregistrez les modifications, ouvrez le terminal et
lançons notre application. voyez, ici, nous avons deux records parce que nous
n'en avons que deux. Si nous avons 20 enregistrements, nous n'obtenons que les dix
premiers enregistrements. De plus, comme nous avons une limite, nous ignorons également la méthode. Ici, nous transmettons le nombre
de données que nous voulons ignorer. Si nous avons 20 enregistrements
et que nous adhérons en sautons cinq, les cinq
premiers enregistrements seront
ignorés et 6 à 20 données seront affichées. Cette méthode de limitation et d'omission
est très utile pour la
pagination et les requêtes Ne vous inquiétez pas, j'ai ajouté
une leçon séparée pour cela. Pour l'instant,
sachez simplement que Skip et Limit sont disponibles.
Supprimons donc ceci. Bien. Enfin, nous pouvons également raccourcir nos
données par n'importe quel remplissage. Supposons que nous voulions
raccourcir nos données utilisateur en
indiquant leur nom. Nous pouvons donc écrire ici un point court, et à l'intérieur, nous passons l'objet, et ici nous passons le nom de notre champ, qui est le nom, et ici nous
pouvons passer deux valeurs,
une pour l'ordre croissant et moins une pour l'ordre
décroissant Passons les deux un par un. Tout d'abord, sauvegardez ceci et
lançons notre application. Vous voyez, les utilisateurs
sont classés par ordre croissant, ce qui signifie de A à ZD si nous le
changeons par moins un, enregistrons et que nous
réexécutons notre fichier voyez, ici, nous obtenons un ordre
décroissant, qui va de Z à A, et c'est pourquoi il affiche d' abord
har, puis le
code bénisse vous Ne vous inquiétez pas, je vais vous donner PDF
détaillé de cette section. Vous pouvez modifier ces méthodes
le plus rapidement possible.
66. Opérateurs de comparaison dans MongoDB B: Découvrons les
opérateurs de comparaison dans Mongodib. Les opérateurs de comparaison sont
utilisés pour comparer les valeurs la base de données avec les valeurs
spécifiées dans la requête, et c'est très important
lorsque nous travaillons avec des données,
en particulier des données basées sur des nombres. Par exemple, imaginez que
dans les données de nos utilisateurs, nous ayons renseigné l'âge
et que nous voulions récupérer
les données des utilisateurs âgés de
18 à 30 ans, et que nous voulions récupérer
les données des utilisateurs âgés de
18 à 30 ans de plus de
18 ans ou de moins Cela peut être n'importe quoi. Lorsque nous voulons faire quelque chose comme ça, nous avons besoin d'un opérateur de comparaison. Il existe de nombreux
opérateurs de comparaison dans Mongo Deb. Tout d'abord, nous avons le dollar EQ, qui est égal à Ensuite, nous avons le dollar N, qui n'est pas égal
au dollar GT, qui est supérieur au
dollar GT E. Pouvez-vous deviner ? vrai, supérieur ou
égal au dollar LT, qui est un dollar LT inférieur ou
égal au dollar E. Ceci est utilisé pour faire correspondre l'une des valeurs
de la liste, l' âge doit être 18, 22 ou 25 ans, comme ça. Peut transmettre plusieurs
valeurs dans un tableau. Enfin, nous avons le dollar NIN qui ne correspond à
aucune valeur du tableau,
et qui est à l'opposé du dollar N.
Les opérateurs de comparaison sont vraiment simples. Laissez-moi vous montrer où nous devons écrire des opérateurs de comparaison. Donc, pour rendre les choses pratiques, ajoutons le champ H à
ces deux documents. Pan Mongo doit donc être une boussole et accéder à la collection de l'utilisateur Ici, nous pouvons modifier chaque
document à l'aide de cette icône d'édition. Sur n'importe quel terrain. Et sur le côté gauche, nous avons l'icône
Plus pour ajouter un nouveau champ. Sélectionnez Ajouter un nouveau champ, et ici nous écrivons notre nom complet, qui est l'âge, et nous passons
une valeur, disons dix. Actuellement, ce
type de valeur est une chaîne, mais nous pouvons le modifier à partir d' ici et
le définir sur un entier 32. Tu vois, maintenant c'est un entier. Nous ajoutons également un nouveau champ
pour le deuxième document, le nom de remplissage, l'âge et
la valeur, disons 20. Comme nous avons changé un type en entier
32, cliquez sur Mettre à jour. Code. Maintenant, dans notre code, auparavant, comme nous pouvons le voir, si vous souhaitez ajouter une
condition à notre requête, nous
ajoutons le remplissage
de l'objet ici, comme l'âge de dix ans. Cela permettra de récupérer les
données de tous les utilisateurs dont l'âge est de 10 à 10 ans. Permettez-moi de vous poser une
question où nous pouvons écrire notre opérateur
logique. Parce que, comme nous pouvons
le voir, pour la condition, nous devons transmettre
une paire clé-valeur dans cette méthode de recherche. La solution se trouve donc à la place de cette valeur codale
dure dix, nous pouvons écrire notre
opérateur de comparaison dans un autre objet Ne vous y trompez pas, regardez ceci. Donc, à la place de
dix, nous ajoutons un objet, et nous écrivons simplement l'opérateur de
comparaison comme
clé dans ce sous-objet. Disons le dollar GTE, qui est
supérieur ou égal à, et supérieur
ou égal à quoi ? 18. Cela signifie donc simplement trouver tous les utilisateurs dont l'âge est
supérieur ou égal à 18 ans. Nous remplaçons simplement cette valeur codée en
dur dix par l'objet, et à l'intérieur de l'objet, nous utilisons un opérateur de comparaison. Maintenant, permettez-moi de
vous confier une petite tâche. Supprimons cet
objet entier de la méthode fine. Nous voulons récupérer tous les utilisateurs âgés
de moins de 18 ans. Ici, nous ajoutons un objet, et d'abord, nous ajoutons sur quel champ nous voulons appliquer la condition, à savoir l'âge. Et au lieu d'une valeur précise, nous passons ici un objet parce que nous voulons utiliser un opérateur de
comparaison, et à l'intérieur de celui-ci, nous utilisons dollar T pour moins
de 18. est aussi simple que ça. Enregistrez ce
fichier et pour la méthode find, nous pouvons exécuter notre application en utilisant nodemon index point js car cela ne changera
rien à la base Vous voyez, nous avons ici un
utilisateur âgé de moins de 18 ans. Vous pouvez voir qu'il suffit de
passer un objet avec un opérateur de
comparaison à
la place de la valeur précise. De plus, ces six premiers
opérateurs sont très simples, mais de nombreux étudiants
s'y trompent dans l'opérateur et non dans l'opérateur. Au lieu de valeur, nous devons transmettre
ici une
liste de valeurs. Permettez-moi donc de vous montrer
ces deux opérateurs. Supposons que nous voulions
récupérer uniquement les utilisateurs âgés de 18, 20 ou 30 Ainsi, lorsque nous voulons comparer
plusieurs valeurs pour un champ, nous utilisons l'opérateur dollar in. Donc, à la place du dollar LT, nous utilisons le dollar in. Au lieu de valeur, nous passons un tableau de
valeurs, 18, 20, 30. C'est aussi simple que cela, enregistrez les
modifications et jetez-y un œil. voyez, ici, nous avons un utilisateur âgé de 20 ans parce que nous passons
20 ans dans ce tableau. Maintenant, le dollar NN est le
contraire du dollar en dollars. C'est ce que j'appelle un interne, c'
est-à-dire des utilisateurs de patchs
âgés de moins de 18, 20 ou 30 ans. Enregistrez les modifications et voyez, nous avons
ici un utilisateur âgé de dix ans. C'est ainsi que nous passons
les opérateurs de comparaison dans Mongo DV. N'oubliez pas qu'en
temps normal, nous passons ici le remplissage avec des valeurs, mais pour les opérateurs de comparaison, nous passons ici le remplissage avec l'objet, et à l'intérieur de cet objet, nous ajoutons notre opérateur de comparaison.
67. Opérateurs logiques dans MongoDB: Voyons les opérateurs logiques. Les opérateurs logiques nous
permettent donc de combiner plusieurs
conditions dans notre requête. En termes simples,
ils nous aident à demander
plus de complexes à partir de la
base de données. Ne t'inquiète pas. n'existe que peu d'opérateurs
logiques, et ils sont également simples
en tant qu'opérateurs de comparaison. premier opérateur logique
est le dollar R. Nous
utiliserons un opérateur lorsque nous
avons plusieurs
conditions et que nous voulons, si l'une d'entre elles est
vraie, renvoyer ces données. Par exemple, nous voulons
récupérer des utilisateurs âgés de
30 ans ou
s' appelant Halley Dans ce cas, nous voulons que chaque
condition soit vraie, et c'est pourquoi nous utilisons
here ou operator. Laissez-moi vous le montrer de
façon pratique. Je commente ce
code précédent et le coût d'écriture est égal à wait user point Find. Et dans cette
méthode de recherche, nous passons Object, et dans cet objet, nous ajoutons simplement un
dollar ou un opérateur. Vous pouvez penser à un opérateur de
comparaison à la place de la valeur, mais nous utilisons un opérateur
logique à la place de la condition. Laisse-moi te donner mon
truc pour t'en souvenir. Comme nous le savons, nous
comparons toujours les valeurs, et c'est pourquoi nous devons écrire un opérateur de
comparaison à
la place de la valeur. Mais nous implémentons des
opérateurs logiques pour les conditions, et c'est pourquoi nous devons écrire opérateur
logique à la
place des conditions. Quand j'ai créé Mongo Deb,
je m'en souviens de cette façon. Comme nous le savons, nous voulons ajouter ici plusieurs conditions et ce que nous utilisons pour plusieurs conditions, nous utiliserons un tableau. Maintenant, dans ce tableau, nous ajoutons nos conditions
dans un objet individuel. Donc, l'âge de l'objet est fixé à 30 ans ou nous passons un
autre nom de condition H. Si l'une des conditions est vraie, nous obtenons ces données utilisateur. Les modifications et jetez-y un coup d'œil. voyez, ici nous avons l'utilisateur Halley parce que son
nom est Halley Cet âge d'utilisateur est le même que notre état ou non.
Peu importe. Si une condition est maillée, nous obtenons ces données est aussi simple que ça. Supposons maintenant que
nous voulions répondre à notre requête. Ces deux conditions
doivent être vraies, ce qui signifie que l'utilisateur doit avoir
30 ans et que le nom
doit également être Halley Dans cette situation,
que nous voulons, toutes les conditions
doivent être vraies. Nous utiliserons l'opérateur final. Donc, à la place
de cet opérateur, on passe un opérateur. Maintenant, pouvez-vous deviner le résultat ? Bien, nous n'obtenons rien
parce que nous n'avons pas données où l'âge est 30 ans
et le nom est h. Vous voyez,
ici, nous avons un tableau vide. Maintenant, permettez-moi de vous montrer
un raccourci pour écrire ceci et cet opérateur. Lorsque nous voulons que toutes ces
conditions soient vraies, nous écrivons déjà la même requête au début du sujet de
la requête. Nous pouvons directement transmettre ces conditions dans la méthode de
recherche comme ceci. Les deux fonctionnent de la même manière. Mais lorsque nous
voulons utiliser un opérateur, nous devons
suivre cette syntaxe. Maintenant, après l'opérateur final du dollar, nous avons un autre
opérateur logique qui est le dollar NR, ou que nous appelons NR logique. Par exemple, nous
voulons trouver des utilisateurs âgés 30 ans et ne portant
pas le nom Harley,
ce qui signifie que les deux conditions
doivent ce qui signifie que les deux conditions Pour cela, à la place
de cet opérateur final,
nous dépassons l'opérateur NR. Les changements et voyez, nous obtenons
ici des données dont le nom Dieu vous
bénisse car pour ces données, les deux conditions sont fausses, et c'est pourquoi nous obtenons ces données. Mais pour les données de notre deuxième utilisateur, cette condition de nom est vraie, nous n'obtenons
donc pas
ces données aussi simplement que cela. Maintenant, le dernier opérateur logique que nous
avons est le dollar zéro
ou l'écrou logique Cet opérateur de nœud logique est
légèrement différent car nous utilisons l'opérateur not
qu'avec des opérateurs de
comparaison et des expressions
régulières Ne vous inquiétez pas pour les expressions
régulières. Nous verrons cela dans
la prochaine leçon. Pour l'instant, voyons voir, opérateur
dollar zéro. Supposons que nous voulions trouver des utilisateurs dont l'âge n'est
pas égal à 30 ans. Encore une fois, je commente cette
syntaxe et j'écris à nouveau, cost user equal to
awight user dot find Objet, et d'abord, nous ajoutons champ
rempli pour lequel nous
voulons ajouter une condition, qui est H. Maintenant,
au lieu de valeur, nous passons l'objet avec
l'opérateur dollar nu. Nous écrivons l'opérateur dollar écrou au lieu de valeur, car l'opérateur
dollar zéro est directement lié à la valeur et non
aux conditions Maintenant, ce que nous voulons, c'est que l'âge ne
soit pas égal à 30 ans, nous avons l'âge et rien, mais nous n'avons pas d'
égal ni de valeur Nous ajoutons un autre objet
avec l'opérateur dollar, ce qui signifie égal et passons
simplement ici la valeur 30 Enregistrez les modifications
et jetez-y un œil. voyez, ici, nous avons les deux utilisateurs car l'âge des deux
n'est pas égal à 30 ans. Vous pouvez voir que c'est très simple. Laissez-moi vous le montrer encore une fois. Dans l'opérateur de comparaison, nous écrivons comme ceci. Colonne d'âge, le dollar est égal
ou supérieur ou inférieur à l'opérateur nous voulons utiliser pour sa valeur. Maintenant, ici, nous voulons juste
ajouter un opérateur not, nous enveloppons simplement cet objet
avec un autre objet et ajoutons ici l'opérateur dollar zéro
et deux points, c'est aussi simple que cela Je sais que c'est un
peu confus, mais ne vous inquiétez pas si vous ne vous
souvenez pas de la syntaxe
des opérateurs, je vous donnerai mon aide-mémoire
à la fin de cette section afin que vous puissiez l'utiliser lorsque nous travaillerons sur des projets
du monde réel Tout tourne autour des opérateurs
logiques. Si vous
regardez le cours en permanence, vous pouvez faire une petite
pause loin de votre écran, écouter de la musique ou
faire une nouvelle promenade. Rendez-vous dans la prochaine leçon.
68. Expression régulière dans MongoDB: Voyons maintenant ce qu'il en est
des expressions régulières. Qu'est-ce qu'une expression régulière ? Une expression régulière permet de
définir des
modèles de recherche pour les chaînes. Par exemple, nous voulons rechercher tous les utilisateurs dont le nom
commence par edge ou rechercher tous les
utilisateurs dont l'adresse e-mail contient gmail.com à la
fin de Dans ces cas, nous utiliserons des expressions
régulières ou certains
développeurs les appelleront jx C'est vraiment utile dans les requêtes de suggestions
automatiques
ou les requêtes de recherche. Laissez-moi vous montrer de façon pratique. Je commente ici
cette précédente requête. Supprimez également les anciennes requêtes
et écrivez une nouvelle requête Cast users equals to
await user point find. Ici, nous passons l'objet, et à quelle propriété nous voulons
appliquer le modèle de recherche. Essayons le nom. Maintenant, à
la place de la valeur, nous passons une expression régulière. Voici la syntaxe de
l'expression régulière. Motif Slash Slash. Donc, sur la base de ce modèle, nous allons faire beaucoup de choses. Supposons que nous voulions
trouver toutes les données des utilisateurs dont le nom commence par Donc, à
la place de ce modèle, nous utilisons le symbole Kerat, qui signifie commencer par, et nous passons ici CPTalh Cette requête trouvera tous les
utilisateurs dont le nom commence par une majuscule. Si nous voulons trouver des utilisateurs dont le nom
se termine par une lettre quelconque, je duplique cette
ligne et à la place de ce carat, nous écrivons dollar. Ce dollar signifie « en finir avec ». Cette requête renverra donc toutes les
données dont le nom se termine par U. Maintenant, permettez-moi de
vous donner une petite tâche Nous voulons trouver les utilisateurs dont l'
adresse e-mail se termine par gmail.com. C'est vraiment simple. Nous changeons ce nom complet en e-mail et simplement à
la place de celui-ci, nous écrivons gmail.com dollar Voyons voir si nous obtenons
les résultats ou non. Voyez si cela change, et C nous aurons les deux utilisateurs car ils ont
tous les deux gmail.com Maintenant, je vais te montrer
quelque chose de cool. Dans le Mongo Di B Compass, je change l'adresse e-mail du deuxième utilisateur
à la place de gmail.com J'écris Gmail, com. Enregistrez ceci, et nous verrons
ce que nous obtiendrons. Enregistrez ce fichier. Et voyez ici, nous avons,
encore une fois, les deux utilisateurs. Même si
cet e-mail ne se
termine pas par gmail.com, vous vous demandez peut-être cet e-mail ne se
termine pas par gmail.com, pourquoi nous
recevons toujours ces données utilisateur Quel est le problème avec notre expression
régulière ? Dans une expression régulière, ce point peut
correspondre à n'importe quel caractère, ce qui signifie que JavaScript l'
associera à n'importe quel caractère. C'est pourquoi si nous
transmettons un caractère à l'endroit de cette période, nous obtenons ces données. Maintenant, nous pouvons nous demander : et si nous voulions comparer une
période par une autre ? Pas comme n'importe quel personnage. C'est vraiment simple. Juste avant le point, nous utiliserons une barre oblique inversée Maintenant, JavaScript va comparer
cette période en tant que point, et non en tant que caractère. Enregistrez les modifications et voyez, ici nous n'avons que le premier utilisateur. Ce modèle
fait également la distinction majuscules/majuscules. Si un utilisateur a un e-mail en
majuscules, comme gmail.com, cet utilisateur ne figurera pas dans cette liste Donc, pour supprimer la distinction majuscules/minuscules, nous devons simplement ajouter I à la fin de notre expression
régulière. Et si nous voulions trouver les utilisateurs dont l'e-mail
contient Harley ? Ne commencez pas par Halle
ou ne finissez pas par Halley. Harley peut être n'importe où. Dans ce cas, nous écrivons
simplement notre mot à l'endroit du motif sans
ajouter de grenier ou de dollar Donc, si nous voulons trouver des
utilisateurs avec le mot exact, disons développeur
dans la description, non une partie d'un autre
mot comme développeur, nous voulons uniquement développeur. Dans ce cas, nous écrivons
un modèle comme celui-ci. Ici, à la place de ce
modèle, nous écrivons ce mot, qui est développeur, et
avant et après ce mot, nous ajoutons en arrière B, arrière B, ce qui représente
la limite de Voici quelques expressions régulières courantes et
utiles. Si vous souhaitez
en savoir plus sur les modèles d'expressions régulières, vous pouvez utiliser cet
article et en savoir plus sur d'autres modèles, car
il s'agit de pur JavaScript. De plus, dans la version actuelle de
Mangodib, peu de développeurs utilisent
dollar RejxOperator ajouter
des modèles directs comme celui-ci Les deux fonctionnent de la même manière. J'aime bien cette version de Sater, mais vous pouvez également utiliser
ce Rjxoperator Cela dépend entièrement de vous.
69. Comprendre et estimer le nombre de documents: Supposons que nous voulions
compter le nombre de documents disponibles dans la collection de
nos utilisateurs. Je duplique cette requête et je
commente la requête précédente. Maintenant, lorsque nous voulons uniquement compter
le nombre de documents, alors à la place de
cette méthode fine, nous passons la méthode Count Documents. Cette requête fonctionne
de la même manière qu'auparavant. Nous obtenons un certain nombre de
données en sortie. Dans la méthode Count documents, nous transmettons nos conditions ou nous transmettons
également des opérateurs logiques, des opérateurs de
comparaison, des expressions
régulières, même manière que la méthode find. méthode Find renvoie
les données réelles, tandis que la méthode Count documents renverra le
numéro du document. Vérifions-le. Regardez les
modifications et jetez-y un coup d'œil. C, ici nous obtenons zéro car il n'y a aucune donnée
pour cette condition. Parfois, nous ne voulons pas
ajouter de conditions, nous voulons
seulement le
nombre total de documents. À ce moment-là, nous pouvons
supprimer cet objet, les
enregistrer et voir,
ici, nous obtenons le
nombre total de données des utilisateurs. À l'heure actuelle, nos
données sont très petites. Imaginons que nous voulions
compter le nombre de produits pour les grandes applications de
commerce électronique. Vous souhaitez afficher le nombre
total de produits disponibles sur la plateforme
dans le tableau de bord d'administration. À l'heure actuelle, nous n'avons pas besoin du décompte suivant qui indique le nombre
total de produits. À ce moment-là, nous pouvons utiliser une autre méthode pour compter le nombre estimé
de documents, le nombre estimé de documents. Comme son nom l'indique, il s'agit d'un décompte estimatif. Comme pour le comptage des documents, nous pouvons transmettre cette méthode de comptage de
documents estimé juste après le nom du modèle. Maintenant, vous vous demandez peut-être quelle est la différence
entre les deux ? La première est que le nombre de documents
renvoie le nombre exact, mais le nombre estimé
affiche le nombre approximatif. Une autre différence
est que nous pouvons passer des conditions ou des filtres dans
la méthode de comptage des documents. Mais dans la méthode
du nombre estimé de documents, nous ne pouvons passer aucune condition. Il ne peut compter que la collection
complète. Le comptage des documents est donc un peu plus
lent que
le nombre estimé de documents. Donc, pour résumer, nous utilisons des documents de
comptage lorsque nous devons appliquer des filtres ou lorsque
nous voulons obtenir le nombre de sorties. D'autre part,
nous utilisons une estimation du nombre de documents lorsque nous avons besoin d'une estimation rapide et approximative
du nombre total de
documents de la collection.
70. Pagination et requête infinie: Voyons comment créer une
pagination ou une requête infinie. Avant de voir la requête, il est préférable de comprendre fonctionnement de la pagination et du défilement
infini Supposons que nous travaillions sur
une grande application de commerce électronique. Dans cette application,
nous pouvons avoir 1 000 ou 10 000
produits comme Amazon. À l'époque, nous obtenons tous les produits détaillés
en un seul appel d'API. Cela prendra plus de temps et
la charge de notre
serveur augmentera également . Ainsi, au lieu d'
obtenir toutes les données en une
seule demande en tant que développeur Bond, nous pouvons les diviser
en pages, comme si nous n'
obtenions que huit ou dix
données en une seule demande. Si l'utilisateur a besoin de plus de données, nous récupérons les dix données suivantes Ne vous inquiétez pas de la façon dont nous
allons créer cette API. Pour l'instant, il suffit de comprendre comment fonctionnent la pagination et le défilement
infini Voici un
exemple de pagination sur le front-end. Sur la première page, nous n'avons que
huit données, puis lorsque nous cliquons sur le bouton de la
deuxième page, nous obtenons les huit
données suivantes. C'est aussi simple que ça. Permettez-moi de vous montrer également un exemple de défilement
infini. Ici, nous avons huit données, et lorsque nous arriverons
au bas de la page, huit autres
données seront chargées depuis le backend. Tu vois, c'est vraiment cool. Maintenant, pensez simplement en langage
humain ce qui se passe ici. Ne vous inquiétez pas pour le code. Il suffit de penser à ce qui se passe. La pagination et le défilement infini fonctionnent presque de la
même manière. Dans les deux techniques,
nous récupérerons les données en petite
quantité selon nos besoins Juste en défilant à l'infini, nous conservons nos données précédentes Dans le cas de la pagination, nous
remplacerons les données précédentes. Mais le backend des deux
techniques restera le même. Laissez-moi vous expliquer avec un exemple de
20 enregistrements. Il s'agit de 20 enregistrements à la fois, nous voulons
n'en montrer que quatre. Nous pouvons définir une
page variable par donnée à quatre. Nous obtenons quatre enregistrements à partir d' ici et nous pouvons
le marquer comme page 1. Maintenant, si les utilisateurs font défiler ou
même passent à la deuxième page, nous ignorerons les données de
cette page, qui signifie que nous sautons
quatre données par page , puis que nous récupérerons quatre
autres enregistrements à partir d'ici Ensuite, lorsque l'utilisateur fait à nouveau défiler
ou passe à la troisième page, nous ignorons les données de la
première et de la page deux. Mathématiquement, nous allons
ignorer la page en cours, qui correspond à trois moins
un dans les données par page, ce qui signifie que deux sur
quatre sont égaux à huit Nous ignorons les huit premières données
et en récupérons quatre autres, qui sont des données par page Chaque fois que nous augmentons
notre numéro de page, nous sautons
la page en cours moins une dans données
par page et en récupérons une autre, qui est le
nombre de données par page Dites-moi combien nous en
sauterons lorsque nous passerons
à la quatrième page. Bien, nous allons sauter
quatre moins un
, soit trois en
quatre, soit 12. Nous ignorons les 12 premiers enregistrements et récupérons quatre autres
données. C'est aussi simple que ça. Dans Mongoose, nous
avons la méthode skip, que nous avons déjà vue, et nous avons également une
limite pour la récupération et le nombre de données Nous supprimons donc ici cette requête car elle
peut créer de la confusion. Maintenant, nous écrivons const
users equals to await user point. Trouvez ici nous ne
voulons passer aucune condition Maintenant, après la méthode fine, nous adoptons la méthode Skip, et à l'intérieur de celle-ci, nous devons transmettre nombre de
données que nous voulons ignorer. Pour l'instant, nous passons directement zéro car pour la première page, nous voulons ignorer zéro donnée. Après cela, combien de données
voulons-nous sur notre page unique ? Bien, nous voulons
envoyer quatre données. Nous ajoutons donc ici une autre méthode appelée limit et en passons ici quatre. Cette requête fonctionne pour la première page. Faisons en sorte que cette requête
fonctionne pour chaque page. Ainsi, lorsque vous recherchez une page
à deux et que vous appelez cette API, nous ignorons simplement les quatre
premières données Et pour cela, nous avons créé une
formule dans notre exemple. Donc, en haut, nous
définissons la variable. La page en cours est
égale, disons, à deux. Ensuite, une autre variable appelée « données par page »
est égale à quatre. Actuellement, comme nous pouvons le constater, nous avons codé ces valeurs en dur. Mais dans le monde réel, ces valeurs sont transmises par le front-end. Et savez-vous par quelle
interface envoyer ces informations ? Des suppositions ? C'est vrai, le front-end enverra ces informations
à l'aide des paramètres de requête. Supposons que
l'API de nos produits ressemble à ceci, l'API
barre oblique, que les
produits soient marqués d'un point d'interrogation, page en
cours soit égale à deux et que les données par page
soient égales à quatre ou dix, tout ce que souhaite notre développeur
frontal Mais pour l'instant, je ne
veux pas ajouter cette complexité. C'est pourquoi nous avons codé
ces valeurs en dur ici. Maintenant, dans cette méthode kip,
nous passons entre parenthèses, page en
cours moins un
dans les données par page. Et dans la limite,
ce que nous allons transmettre, vrai, nous transmettons des données par
page et c'est fait. Laissez-moi enregistrer ceci pour que nous
puissions le voir clairement. Génial. Maintenant, si nous
vérifions notre terminal, nous obtenons un plateau parce que
dans notre base de données, nous n'avons pas
plus de quatre données, donc nous n'obtenons pas de
données par page deux. Si nous changeons la page
actuelle en une, enregistrez-la et voyez
où nous arrivons aux données. Nous avons créé une requête pour la pagination
et le défilement infini. Cette requête unique
fonctionnera pour les deux fonctionnalités. J'espère avoir bien expliqué cela. Si la confusion persiste, essayez de mettre des
valeurs différentes dans ces variables. Je parie que tu comprendras.
71. Mettre à jour les données: Voyons maintenant comment
mettre à jour les données dans Mongo DB. Il existe donc deux
manières de mettre à jour les données. Dans la première méthode, nous allons d'abord trouver le document que
nous voulons mettre à jour. Ensuite, modifiez sa propriété,
et enfin, nous enregistrons les données
mises à jour dans notre base de données. Et la deuxième méthode consiste à utiliser des méthodes de mise à jour des mangues et à mettre à jour directement
le document dans la base de données Ensuite, nous avons la
possibilité de renvoyer des données
mises à jour en
fonction de nos besoins. Maintenant, que pensez-vous
de la méthode la plus rapide ? Maintenant, que pensez-vous de la méthode
qui est utile ? Oui, la deuxième méthode est plus utile car dans
la première méthode, nous devons effectuer plusieurs étapes, ce qui peut prendre
peu de temps. Mais dans la seconde méthode, nous utiliserons des méthodes
définies par les mangues, nous n'avons
donc pas à nous soucier de la
mise à jour des données par nos propres moyens De plus, nous utiliserons la première méthode
en fonction de nos besoins. Il existe maintenant quatre méthodes pour mettre à jour le document.
Ne t'inquiète pas. Chaque méthode est très
simple et facile. Laisse-moi te montrer ça. Ici, j'
ouvre le projet de démonstration de MongoDB Et ici, supposons que
nous voulions mettre à jour notre adresse e-mail utilisateur dont le
nom est code bless. Nous créons donc ici une
fonction d'écriture appelée Update User. Et dans cette fonction, nous allons écrire notre logique de mise à jour. Donc, pour Update, nous
utilisons le module utilisateur point. Ici, nous avons la méthode Update One. Maintenant, comme pour la méthode fine, nous pouvons passer ici un objet de
requête dans lequel nous appliquerons des filtres ou
nous pouvons dire condition. Alors, quelle est la condition ici ? Le nom d'utilisateur doit être code plus. Nous avons donc déclaré quel
utilisateur nous voulons mettre à jour. Il ne nous reste plus qu'à transmettre la propriété
que nous voulons modifier. Donc pour cela, nous passons un autre objet au
deuxième paramètre, et à l'intérieur de celui-ci, nous avons un opérateur
dollar set
et nous passons à object. Maintenant, dans cet objet, nous allons spécifier la propriété que
nous voulons modifier avec
sa valeur mise à jour. Nous voulons donc remplacer l'e-mail par update at the red gmail.com Nous pouvons donc adhérer à
plusieurs propriétés. Mais pour l'instant, nous
voulons simplement changer d'e-mail. Maintenant, comme nous le savons, cette
expression est la tâche d'Asnruners. Nous pouvons donc adhérer et attendre. Laissez-moi enregistrer pour que nous
puissions voir correctement. Bien. Désormais, cette expression ne
renverra pas l'objet
mis à jour. Voyons ce que nous allons obtenir ici. Nous le stockons donc dans
une variable appelée résultat, et simplement en bas, la console enregistre ce résultat par point. Également à la place de
cette fonction utilisateur Gate,
nous appelons fonction Update User. Maintenant, avant d'enregistrer les modifications, assurez-vous d'arrêter
l'application. Enregistrez maintenant les modifications
et jetez-y un œil. Exécutez cette application
à l'aide de node index point js. voyez, ici, nous n'obtenons pas de données utilisateur
mises à jour, mais nous obtenons des
informations de base sur la tâche DDT. Voyons comment les données sont mises
à jour dans la
base de données ou non. Alors, Pamongo, sois
compas et vois ici notre e-mail est changé
en updated@gmail.com C'est ainsi que nous
mettons à jour les données. Au début, nous passons
l'objet de requête avec des conditions, et au deuxième argument, nous passons l'opérateur dollar set, et nous passons l'objet avec des propriétés et des valeurs
mises à jour. est aussi simple que ça. Mais gardez
également à l'esprit que cette méthode de mise à jour
ne mettra à jour qu'un seul document, pas tous les documents qui
remplissent cette condition. Parfois, nous voulons également
obtenir le document mis à jour. Ne vous inquiétez pas, c'
est très simple. À l'endroit de la première mise à jour, nous passerons « find
one » et « update ». Cela renverra l'ancien
document avant la mise à jour. Mais ici, nous voulons obtenir
le document mis à jour. Oubliant le
document mis à jour, nous passons ici troisième objet, et dans celui-ci
nous passons du nouveau au vrai. De plus, comme bonne pratique, nous allons passer une autre
option ici, qui consiste à exécuter les validateurs sur True Maintenant, vous pourriez vous demander ce que
sont les validateurs d'exécution ? Nous ne
disons rien à notre requête pour nous assurer que ces valeurs mises à jour doivent suivre le schéma du modèle. Permettez-moi également de remplacer cette
valeur d'e-mail par blessthergml.com. Les modifications et jetez-y un coup d'œil. Exécutons à nouveau cette
application. Vous voyez maintenant que nous obtenons ici une valeur
mise à jour. C'est ainsi que nous pouvons
mettre à jour les valeurs en utilisant Update One, en trouver
une et mettre à jour la méthode. Les deux sont très similaires. Mettez-en un à jour, ne renvoyez pas
le document mis à jour. Lorsque vous utilisez find one et update, nous obtenons le document mis à jour, mais ces deux outils ne mettent
à jour qu'un seul document. Maintenant, permettez-moi de vous confier
une petite tâche. Nous voulons mettre à jour le nom de
l'utilisateur dont l'identifiant est celui-ci. Peux-tu écrire la requête ?
C'est vraiment simple. Ici, dans l'objet de requête
à l'endroit du nom, nous passons l'ID de soulignement, et nous passons ici notre ID
utilisateur sous forme de chaîne Vous pouvez copier votre nom d'utilisateur
depuis le Mongo DB Compass et également modifier cette valeur d'e-mail en XYZ
sur Enregistrez les modifications
et jetez-y un œil. Exécutez cette application. Voyez ici que nous obtenons le document mis à jour. Charmant. C'est donc très simple. Souvent, nous voulons
trouver notre document uniquement en fonction de son
identifiant unique, comme nous le faisions actuellement. Nous ne voulons pas passer
d'autres conditions car cet identifiant est unique et il est inutile de passer d'
autres conditions. Lorsque nous voulons
mettre à jour des données en utilisant leur identifiant à la place de la méthode
find one et update, nous avons une autre méthode de raccourci, qui consiste à rechercher par identifiant et à mettre à jour. Ici, nous n'avons pas besoin de
transmettre cet objet de requête. À la place de cela, nous transmettons
directement notre identifiant sous forme de chaîne. Les modifications et jetez-y un coup d'œil. Exécutez cette application. Vous voyez, nous recevons
à nouveau un document mis à jour. Ainsi, lorsque nous voulons
trouver un utilisateur par son identifiant, nous utiliserons fine
par identifiant et mettrons à jour. Nous avons maintenant vu ces
trois méthodes de mise à jour. Mettez-en un, trouvez-en un, mettez-le à jour, recherchez
par identifiant et mettez à jour. Si vous remarquez, toutes ces méthodes ne
mettent à jour qu'un seul document
qu'elles ont trouvé en premier. Deuxièmement, mettez à jour un document, trouvez-en un et mettez à jour leurs noms
indiquent qu'ils ne mettent à jour qu'un seul document. Et si nous parlons de
fin par identifiant et de mise à jour, ce que nous transmettons
ici comme condition, nous transmettons un identifiant unique, ce qui signifie qu'il ne mettra également à jour qu'un seul enregistrement
dont l'identifiant est celui-ci. Mais que se passe-t-il si nous voulons mettre
à jour plusieurs documents ? Pour cela, nous avons une quatrième
méthode de mise à jour, qui consiste à mettre à jour plusieurs. À la place de cette
amende par identifiant et mise à jour, nous ajoutons de nombreuses mises à jour. Nous devons donc à nouveau transmettre votre objet de requête dans lequel
nous définirons les conditions. Vous passez donc votre âge à 20 ans. Nous demandons donc de
mettre à jour nos dossiers dont l'âge est de 20 ans et de mettre à jour
leur adresse e-mail à cette valeur. Permettez-moi de modifier cette
valeur d'e-mail en tant que hegmil.com. Nous n'avons pas besoin de ce
troisième argument, qui est une option, car
cela ne fonctionnera pour Fine One, ainsi que pour les mises à jour
, les recherches par ID et les mises à jour. Regardez les modifications et
exécutons cette application. Vous voyez, encore une fois, le document n'est
pas mis à jour, mais si nous consultons notre base de données, notre valeur est mise à jour. Donc, pour résumer rapidement, nous avons quatre méthodes pour
mettre à jour les données dans Mongo DB Mettez-en un pour mettre à jour
un seul document, mettez-en plusieurs pour mettre à jour
plusieurs documents, trouvez-en un et mettez-le à jour pour rechercher et mettre à jour un seul
document en une seule étape, dernière étape, recherchez par ID et mettez à jour pour trouver un document
par ID et le mettre à jour. De plus, dans find one and update,
et find by ID et
update method, nous passons à l'objet Option dans lequel nous définirons new sur true pour obtenir
de nouvelles données mises
à jour et
exécuterons également les validateurs sur
true pour suivre le schéma du modèle pour les valeurs mises à jour.
C'est aussi simple que ça.
72. Opérateurs de mise à jour dans MongoDB: Parlons maintenant des opérateurs de
mise à jour. Les opérateurs de mise à jour sont utilisés pour modifier les documents lors
d'une opération de mise à jour. En termes simples, les opérateurs de
mise à jour nous
permettent de mettre à jour
des remplissages spécifiques, d'incrémenter des valeurs, de définir de nouvelles données, supprimer des remplissages, etc. Laisse-moi te dire quelque chose. Nous utilisons déjà un opérateur de
mise à jour, défini en dollars, mais nous avons de nombreux autres opérateurs de
mise à jour. Rendez-vous donc dans le navigateur et
tapez les opérateurs de mise à jour
dans Mongo DB. Ouvrez ce premier lien, et nous pouvons voir ici que nous avons
des opérateurs de mise à jour tels que date actuelle du
dollar pour définir la valeur du champ rempli
à la date actuelle. Encre dollar pour augmenter
la valeur du remplissage
d'un montant spécifique Supposons que quelqu'un aime le message Nous pouvons
donc utiliser l'opérateur
dollar ink pour augmenter la
valeur du remplissage. Dans l'opérateur d'encre,
nous pouvons également transmettre des valeurs négatives
qui peuvent diminuer le nombre. Ensuite, nous avons la valeur mean, max, ML pour la multiplication, renommage, le set, le set lors de l'insertion, set pour supprimer le
champ du document Toujours en bas, nous avons des opérateurs pour array, pull, push, pull all, etc. Ne vous inquiétez pas pour
ces opérateurs. Nous en utiliserons un grand nombre
dans nos futurs projets. Pour l'instant, je veux juste vous
présenter ces opérateurs de
mise à jour. Dans la leçon suivante,
nous verrons
comment supprimer un document
de MongoDB ?
73. Supprimer les données: Voyons maintenant comment supprimer les
données de la Mongo Div. Cela ressemble beaucoup à la
mise à jour des données. Nous disposons de quatre méthodes
pour supprimer les données. Supprimez-en un, supprimez-en plusieurs, trouvez-en un
et supprimez-le , et le dernier, recherchez
par identifiant et supprimez. Vous comprenez maintenant pourquoi je prends plus de temps pour expliquer les méthodes de
mise à jour. Elles sont très similaires
aux méthodes de suppression. Voyons rapidement
ces méthodes de suppression. Ici, nous créons une nouvelle
fonction ASN appelée delete user. Maintenant, à l'intérieur de celui-ci, nous utilisons user point Delete one et ce que
nous allons transmettre dans cette méthode. Nous transmettons simplement l'objet de requête car ici nous
voulons simplement supprimer le document. Nous n'avons pas besoin de spécifier
ce que nous voulons mettre à jour, nous pouvons transmettre quelque chose comme cet identifiant ascore à un identifiant utilisateur, j'ai copié à partir de
la boussole Mongo Dib Cela supprimera cet utilisateur
unique avec son identifiant. Nous pouvons maintenant adhérer à wait, comme avant, et simplement
stocker son résultat de manière invariable Ce résultat est l'objet
doté d'une propriété de suppression. Nous n'avons pas reçu ce document. Maintenant, permettez-moi de vous demander une chose. Et si nous voulions que ce document supprimé apparaisse
dans le résultat ? Quelle méthode utiliserons-nous ? Nous pouvons l'utiliser ici, en trouver
un et le supprimer. Et ici, il n'est pas nécessaire de
changer quoi que ce soit. Ainsi, à la place de la méthode fine
one et de la méthode delete, nous pouvons utiliser la méthode fine by ID
et la méthode delete. Mais lorsque nous utilisons fine
by ID et delete, nous n'avons pas besoin de transmettre ici
l'objet avec la propriété ID. On peut passer directement comme ça. Je ne veux pas
emprunter en montrant ces méthodes, car elles
sont presque identiques, n'est-ce pas ? Imaginons que nous voulions
supprimer tous les
utilisateurs âgés de plus de 15 ans et qu'ils ne soient pas
non plus vérifiés. C'est vraiment simple. Nous utilisons ici, supprimez de nombreuses méthodes, et à la fin de cet identifiant,
nous passons l'objet de requête, et à l'intérieur de celui-ci, âge doit être supérieur Et une autre propriété
est vérifiée comme fausse. Maintenant, enregistrons ce résultat par
points sur la console. Et au lieu d'appeler la fonction utilisateur de
mise à jour, nous appelons fonction utilisateur supprimée. Enregistrez les modifications et
exécutons cette application. voyez, ici, le compte
est
supprimé jusqu'à un car un seul document un car un seul document remplit cette condition. Et si nous consultons notre base de données, nous constatons que nous
n'avons qu'un seul document. Tout dépend donc de l'opération
de suppression. C'est vraiment simple
que de mettre à jour les données.
74. Exercice 01 - Configurer MongoDB: Maintenant c'est l'heure de faire de l'exercice, vous pouvez pratiquer vous-même ce que vous avez
appris dans cette section. Ouvrez notre premier projet, Task Track, que nous avons laissé
dans la section 5. Nous pouvons nous entraîner sur ce projet. Si vous n'avez pas de code de projet
précédent, ne vous inquiétez pas, vous pouvez
le télécharger ci-dessous de cette leçon. Maintenant, je conçois cet exercice pour que vous puissiez
suivre les différentes étapes de Mongo DB Tout d'abord, étape 1, je veux que vous connectiez
ce projet à la base de données
Mongo DB Vous pouvez donner un nom à cette base de données, une piste de tâches ou autre. Après avoir réussi
à vous connecter à la base de données à l'étape 2, vous devez créer un
schéma pour stocker Tudous Dans votre projet,
créez un nouveau dossier appelé models et dans ce
dossier, créez un nouveau fichier
appelé Tudous point js. Dans ce fichier, vous devez
définir le schéma et modèle de la collection Tudos
séparément de notre autre code, et les remplissages devraient être comme ceci Tout d'abord, nous avions pour tâche définir le
texte de ce Tudo Assurez-vous que ce remplissage
est obligatoire. Ensuite, nous avons le statut, qui peut être Tudo en train de faire ou terminé Vous devez réfléchir au
type de champ que vous souhaitez utiliser. De plus, la valeur par défaut de
ce champ doit être do. Maintenant, le dernier champ est le texte, qui est la zone de
valeurs dans laquelle nous pouvons ajouter des
textes linguistiques connexes tels que SDML, CSS, JavaScript, react, node, etc., et
c'est tout pour ce schéma Maintenant, la troisième étape,
basée sur ce schéma, à définir un modèle
pour la collection de Tudou C'est simple. Je sais que tu peux le faire. J'ajoute également cette
instruction d'exercice PDF ci-dessous de cette leçon. inquiétez pas non plus si vous
ne vous souvenez pas des
méthodes de Mongo DB Vous pouvez utiliser le
résumé PDF que j'ai ajouté à la fin
de cette section. Le but de cet
exercice est de suivre étapes de la base de
données Mongo Alors, donnez-vous à 100 %
, puis observez la solution. J'espère que vous avez résolu cet
exercice ou que vous essayez de le résoudre et que vous vous
en tenez à l'une de ces étapes. Ne t'inquiète pas, au moins
tu essaies de le résoudre. Alors attribuez-vous le
mérite de cela. Voyons maintenant la solution. Tout d'abord, dans notre projet, nous devons installer des
mangues, car sans Ted, nous ne pouvons rien
faire d'autre NPM installe donc les mangues
au rouge 8.8 0.0. Dieu. Minimisons
ce terminal. Maintenant, dans notre
fichier JS à points d'index, tout en haut,
nous saisissons const mangos is
equal to require Et après cette route de Studos, nous écrivons mangos point Connect Au premier argument, nous passons un anneau excédentaire, qui est Mongo DV deux-points
avec double barre oblique, Colonne 27017 slash, et
nous écrivons ici le nom de notre base de données, qui est TAS TAG Maintenant, comme nous le savons, cette
expression renvoie une promesse. Nous utilisons donc la méthode art then et à l'intérieur de celle-ci, nous
consultons simplement point log La base de données Mongo s'est connectée avec succès. Maintenant, et si
nous avons une erreur à ce sujet ? Nous ajoutons donc également une méthode de cache. Ici, nous obtenons un objet d'erreur, une fonction d'erreur et un journal de points de
la console. Connexion MongoDB remplie. Et imprimez cette erreur. L'étape numéro un est donc terminée. Maintenant, étape numéro deux, nous devons
définir le schéma de la tâche. Nous créons donc un nouveau dossier dans
notre projet appelé models. Et dans ce dossier, nous créons un nouveau fichier
appelé todos point js Maintenant, vous vous demandez peut-être pourquoi nous
devons créer un nouveau fichier ? Nous ne pouvons pas le définir dans
notre fichier index point js. Oui, nous pouvons définir le schéma et les modèles dans le fichier JS à points d'index. Mais imaginez que notre projet
comporte cinq modèles différents. Imaginez à quel point notre
code devient compliqué. Nous ajoutons cinq schémas et
modèles différents dans notre fichier JS à points d'index C'est la pratique du monde réel. Nous allons définir tous les modèles et leurs schémas dans le
dossier séparé, les modèles Et quel que soit le modèle que
nous voulons créer, nous donnons son nom au fichier. Dans ce cas, il s'
agit de Tudos point js. Ici, nous importons d'abord des mangues
Cs, ce qui équivaut
à requérir des mangues Ensuite, nous créons un
nouveau schéma de points Mongoose, dans lequel nous transmettons
notre objet de remplissage La première est la tâche, et nous l'avons définie sur string. Mais nous voulons également rendre
ce remplissage obligatoire. Donc, à la place de cette chaîne, nous passons différentes
propriétés dans l'objet. Supposons que le type soit envoyé à la chaîne
et que le paramètre required soit vrai. Ensuite, nous avons des statistiques pour objecter, encore une fois, tapez deux chaînes. Et ici, nous voulons
donner les valeurs des champs. Nous écrivons donc la
propriété Enum dans le tableau, et ici nous passons des valeurs La première consiste à faire, puis
nous pouvons avoir à le faire, puis nous écrivons terminé. Donc, si nous essayons de saisir
une quatrième valeur, alors ces valeurs,
cela ne fonctionnera pas. De plus, nous voulons donner
sa valeur par défaut, donc default, et nous
lui donnons la valeur todo. Bien. Maintenant, nous avons le texte, qui est un tableau de chaînes. Nous pouvons directement passer ici le
tableau et à l'intérieur de celui-ci, nous passons la chaîne Done. Notre schéma est prêt. Stockons-le dans une variable
appelée schéma Tds. Passons à la troisième étape. Vous souvenez-vous
comment définir le modèle ? Nous utilisons le modèle mangos dot. Ici, nous passons d'abord le
nom singulier de notre collection, qui est Todo, qui
deviendra la collection Todos Au deuxième argument,
nous passons le schéma de Todos. Maintenant, cela renverra
le modèle todo. Stockons-le dans
une variable appelée todo. Assurez-vous que nous utilisons
votre case Pascal car ce todos fonctionne
comme une classe JavaScript Nous avons terminé notre premier exercice. Dans la prochaine leçon, nous
avancerons peu.
75. Exercice 02 - Pour stocker les données: Passons maintenant au deuxième
exercice dans lequel nous allons rappeler l'insertion de
données dans Mango Div Voici donc l'exercice
d'instruction PDF. Vous pouvez également le
télécharger sur le côté droit. J'ai également ajouté un fichier JSON dans lequel j'ai ajouté huit
enregistrements pour Todos Maintenant, dans ce projet, nous avons déjà une API
pour créer un nouveau todo Mais dans cette API, nous transmettons simplement de nouvelles données à
notre réseau local. Au lieu de cela, nous voulons stocker des données dans notre collection
Todos Permettez-moi de vous
donner un petit indice. Nous pouvons faire n'importe quoi dans la
collection en utilisant le modèle. Vous devez obtenir le modèle dans le dossier
des modèles et l'utiliser ici. Voici une petite démo pour vous. Lorsque nous envoyons une demande d'API de publication avec cet objet JSON,
dans le back-end, nous stockons ces données dans notre base de données et renvoyons les données
stockées dans la réponse. Nous l'avons déjà fait
dans cette section. Vous pouvez également utiliser le code de
section actuel à titre de référence. Essayez de résoudre ce problème
, puis observez la solution. J'espère donc que vous le résoudrez
ou que vous essayerez de le résoudre. Voyons maintenant la solution. Tout d'abord, nous devons insérer des enregistrements dans notre collection todos Mais nous savons que nous faisons
tout en matière de collection, nous avons besoin de ce modèle. Comment pouvons-nous obtenir le modèle Tudo ici dans ce fichier de routes de Tu Dos Bien, nous devons exporter notre
modèle depuis le modèle 5 de Tudos. Nous écrivons donc ici que le
module point Exports est égal à ce modèle Tudo Cela exportera ce
modèle Tudo par défaut. Sauvegardez ceci. Dans le TudosRout en haut, nous importons Const Tudo est égal
à require . Maintenant, nous
sommes dans le dossier routes
et nous voulons accéder au dossier et nous voulons accéder au Nous devons donc retourner
dans notre dossier en utilisant modèles de barre oblique à
double point, et dans ce fichier
todos point js Bien. Nous avons donc le
modèle Todo dans ce fichier Stockons maintenant rapidement ces données
Todos dans la collection Nous passons donc à la requête post, que nous créons pour ajouter de nouvelles tâches à faire dans notre tableau local. Tout d'abord, nous pouvons commenter cette méthode de poussée
par
points du tableau Tudos, et à la place de celle-ci, nous pouvons écrire Nu to do Et ici, nous nous
évanouissons pour faire objection. La première propriété est la tâche, et comment pouvons-nous obtenir la tâche ? Tout en haut, nous obtenons le corps de la requête et le
stockons dans la variable do. Donc, en bas, nous
écrivons pour faire le point Task. Ensuite, nous avons le statut, que nous obtenons à nouveau du statut à points
Tudos et également des
tags aux tags à points Todo Ici, nous n'ajoutons pas d'identifiant car il sera
généré automatiquement par MongoDB. Auparavant, dans cette section, nous utilisions ici des valeurs codées en dur, mais ici nous utilisons des valeurs que nous obtenons
dans le corps de la requête. est aussi simple que ça. Maintenant,
cela renverra un objet New to do
et pour l'enregistrer, nous écrivons ici Nut point save. Comme nous le savons déjà, il s'
agit d'une tâche d'exécution asynchrone. C'est pourquoi nous utilisons Hereaway. Mais voyez ici, nous
obtenons une erreur d'exécution. Pour utiliser Avid, nous devons
rendre notre fonction asynchrone. Mais dans cette API, notre fonction est la suivante : cela commence à partir de la demande et de la réponse
à ce support CR. Maintenant, pour rendre cette fonction asynchrone, avant cette parenthèse, nous passons un mot clé. C'est aussi simple que ça. Tu vois, l'erreur a disparu. Maintenant, cette expression renverra les données stockées
depuis la base de données. Nous le stockons donc dans des données stockées variables
const. Ensuite, nous envoyons ce
magasin pour qu'il réponde. Voyons maintenant si cela
fonctionne ou non. Enregistrez les modifications et exécutons cette application en utilisant
nodemon index point js bon serveur fonctionne, et nous
connectons également Mongo Db avec succès Parfait. Maintenant, en utilisant notre extension client
d'appel d'offres, nous enverrons une demande par courrier. Nous avons déjà enregistré
cette API create to do, nous l'
utiliserons
donc directement ici dans le
corps de la requête Au lieu d'utiliser un formulaire codé, nous utiliserons JS et format. Cela nous facilitera la tâche. Ouvrez maintenant JSNFle que je
joins à cette leçon. Vous pouvez le télécharger au fur et à mesure que vous téléchargez le
PDF sur le côté droit. Maintenant, il suffit de copier
le premier
objet à faire et de le coller
dans le corps de la requête. Assurez-vous également d'avoir un préfixe API dans l'URL et
envoyez la demande Vous voyez, nous obtenons ici nos nouvelles
données avec un identifiant généré automatiquement. Nous pouvons également vérifier que dans
le Mongo DBCompass, nous obtenons
ici les données todos Maintenant, j'avance rapidement cette leçon et, un par un, j'
insère tous les todos Bien. Vous pouvez voir comment nous progressons et résolvons
chaque exercice étape par étape Dans le monde réel, vous
devez également travailler étape par étape. De cette façon, vous êtes moins
confus et vous travaillez facilement.
76. Exercice 03 - Récupérer les données: Il est maintenant temps de passer
au troisième exercice, que j'ai conçu pour
récupérer les données Après avoir ajouté plusieurs
valeurs dans la collection, je souhaite que vous écriviez une requête
pour cette collection. Nous avons déjà une méthode G
pour récupérer toutes les tâches. Vous pouvez écrire toutes les requêtes une par une ici et terminer
l'exercice. Exercice 3 La première requête est que nous voulons récupérer
toutes les données vers DOS Après cela, la deuxième requête est
Fatudos qui a un tag, react. Troisième question, c'
est un peu délicat. Les étudiants qui ont un tag STML et un statut
devraient Tudo. Ensuite, la quatrième
requête compte le nombre de Tudos dont le statut
est défini sur Terminé La cinquième dernière requête est faz
tudos dans laquelle tâche, il y a le mot créer, seul le mot Cela ne doit pas inclure la
recréation créée, uniquement la création et
assurez-vous également de ne pas tenir compte de la distinction
majuscules/minuscules ici Comme vous le savez, vous pouvez
utiliser mon résumé PDF si vous ne vous souvenez pas des méthodes
et ne résolvez pas cet exercice. Cela augmentera votre confiance en vous, et c'est ainsi que vous apprendrez sur quelles choses vous
devez vous concentrer davantage. De plus, si vous êtes
confus dans une requête, vous pouvez passer à d' autres requêtes et
résoudre d'autres requêtes. J'espère donc que vous allez essayer de
résoudre cet exercice. Voyons maintenant rapidement
la solution. Pour la première requête, pour récupérer toutes les tâches de la base
de données, nous avons
ici ce GPI dans
lequel nous
renvoyons directement ce tableau todos nous avons
ici ce GPI dans lequel nous
renvoyons directement ce tableau todos Mais maintenant, nous voulons récupérer
les données de la base de données, puis nous les
renverrons Nous écrivons donc ici todo dot find. Nous voulons tout faire, donc ici nous ne remplissons
aucune condition. Maintenant, cette expression est prometteuse. Nous pouvons attendre ici et stocker ces données dans une variable
appelée todos Nous obtenons maintenant une erreur d'exécution. Pouvez-vous me dire comment
pouvons-nous le résoudre ? Nous rendons notre fonction
asynchrone, et à la fin, nous enverrons
ce todos en réponse Enregistrez les modifications et
appelons-le GTI PI. Ici, nous n'avons pas ce GIPI, nous créons
donc une nouvelle demande,
et dans l'URL, nous transmettons la colonne d'hôte local 3 000 API SLAStudos
et Vous voyez, nous avons ici
la liste des Tudos. Nous résolvons donc la première requête. Passons maintenant à la deuxième requête. Dans ceux-ci, nous devons patcher les
toudos qui ont le tag react. Je duplique cette ligne et je
commente la première requête.
Maintenant, pour trouver,
une seule chaîne est-elle disponible
dans le tableau ou non ? Nous n'avons
rien à faire de spécial. Nous passons directement ici,
object, et ajoutons ici la condition, le texte, et dans une chaîne, nous écrivons notre mot-clé,
qui est react. Si dans le tableau de texte
il y a un élément, identique à cette réaction, alors c'est ce que nous faisons. Nous pouvons également faire de même
en utilisant l'opérateur in. Les deux fonctionnent de la même manière.
Enregistrez les modifications et envoyons cette demande. voyez, ici, nous en avons trois à faire et tous contiennent une balise
React. Passons maintenant à la troisième requête, qui est fast todos, qui possède le tag STML et dont le
statut devrait être à faire Donc, à la place de
cette balise react, nous passons le code STML et nous passons une autre condition
status to to do Nous pouvons donc utiliser votre opérateur
dollar, mais nous savons déjà qu'il
fonctionne également de la même manière que cet opérateur. Enregistrez les modifications
et jetez-y un œil. Envoyez la demande. Tu vois,
nous arrivons à Tudos Génial. Passons maintenant à la
quatrième requête dans laquelle nous devons compter le nombre de tudos dont le statut
est défini sur Terminé Permettez-moi de vous demander quelque chose. Devrions-nous utiliser votre
bonne méthode ou compter le nombre de tudos Non, nous avons autre chose. Vous souvenez-vous que oui, nous utilisons la méthode du comptage des documents. Nous remplaçons donc cette
méthode fine par des documents de comptage, et nous passons ici statut de l'
état à D. Enregistrez
les modifications et jetez-y un coup d'œil. voyez, ici, nous en avons cinq, ce qui signifie que le statut de cinq
tâches est terminé. Nous avons maintenant la dernière requête, qui consiste à récupérer vers DOS dans quelle tâche se trouve Word Create Ici, nous ajoutons à nouveau une méthode
fine et à la place
de cette condition d'état, nous sommes une tâche et ici
nous devons utiliser expression
régulière car
nous travaillons avec une chaîne de caractères. Maintenant, vous souvenez-vous de la
syntaxe des expressions régulières ? Oui, c'est Pattern Slash. Maintenant, pour rechercher un mot spécifique, nous utilisons Backwards B, nous
créons Bwards B. Pour rendre cette
majuscule insensible,
nous utilisons ici, I, enregistrons les modifications
et jetons un coup d'œil Envoyez la demande
et voyez ici
trois enregistrements dans lesquels nous
avons créé Word dans la tâche. C'est ainsi que nous récupérons les données de
la base de données dans le monde réel. J'espère que vous avez une
idée de ce que nous apprenons.
77. Exercice 04 - Mise à jour et suppression des tâches: Passons maintenant
au quatrième exercice. Ne vous inquiétez pas, vous pouvez le
résoudre en seulement deux à trois minutes. Dans ce projet,
nous avons également mis en place une méthode de mise à jour
spécifique à effectuer par son identifiant. La première requête de cet exercice
est mise à jour d'une tâche spécifique par son identifiant et change uniquement le texte de la
tâche en actualisé pour effectuer. Comme vous devez renvoyer cette
mise à jour dans la réponse. Ici, vous pouvez copier
n'importe quel identifiant d'objet de la passe Mongo Di BC et le transmettre dans
le paramètre de requête Ensuite, la deuxième requête est que vous devez mettre à jour
tous les documents
dont le statut actuel est et mettre à jour
ce statut avec De. De plus, ici, vous n'avez pas besoin
de créer une nouvelle API. Vous pouvez simplement écrire
uniquement une requête de mise à jour et la vérifier lorsque je
montre la solution. Enfin, la troisième requête est que vous devez supprimer une tâche
spécifique par son identifiant. Ici, vous pouvez également utiliser n'importe quel identifiant de la boussole
Mongo Divi Et une fois le
processus de suppression terminé, vous devez renvoyer l'objet avec propriété du
message pour que la
suppression soit réussie. Et pour la requête de suppression, vous pouvez
utiliser l'API de suppression dans notre code. Ce sont des exercices assez
simples. Vous pouvez utiliser le PDF récapitulatif
ou regarder la syntaxe. Ne vous inquiétez pas si vous devez
surveiller la syntaxe des méthodes. J'
oubliais même parfois la syntaxe. Donc pas de souci avec la pratique, vous connaîtrez cette syntaxe. J'espère donc que vous résoudrez cet exercice ou que vous
essaierez de le résoudre. Donnez-vous le mérite pour cela. Voyons maintenant rapidement
la solution. La première requête est donc que nous devons
mettre à jour la tâche spécifique par son identifiant et modifier uniquement le
texte de la tâche pour la mettre à jour todo Nous avons donc ici un identifiant, que nous obtenons
à partir des PAM à points de demande. Maintenant, à partir du corps, nous avons juste besoin d' une tâche pour pouvoir
supprimer les autres remplissages. Nous n'avons pas besoin de ce
code car nous
écrivons cette logique
pour le tableau local. Mais maintenant, nous avons les méthodes MongoDB. Nous pouvons écrire ici pour faire un point. Maintenant, quelle méthode utilisons-nous ici ? Devons-nous utiliser la première mise à jour
, en trouver une et la mettre à jour, selon leur identifiant,
et en mettre à jour ou en mettre à jour plusieurs ? Oui, nous pouvons utiliser
n'importe lequel de ces quatre. Mais ici, nous devons renvoyer
le document mis à jour. Deux options sont donc
simplement supprimées, Mettre à jour une
et Mettre à jour plusieurs car ces deux options ne
renverront pas le document mis à jour. Nous n'avons plus que deux options. Lequel est le plus simple ? Nous devons effectuer une mise à jour pour ce qui est de l'identifiant. Nous utilisons donc ici, trouvons
par identifiant et mettons à jour, et ici nous transmettons cet identifiant. De plus, nous n'avons pas besoin de
convertir cet identifiant en entier car l'identifiant de l'
objet Mongo DV est une chaîne Maintenant, dans le deuxième argument, nous passons un objet avec un opérateur
dollar set et nous passons ici un objet
avec une tâche à une autre, que nous obtenons à partir du
corps de la requête. Maintenant, voici une
chose. S'il s'agit d'un objet, le nom de
notre propriété et le nom de notre
valeur sont identiques, c'
est-à-dire ici tâche et tâche. Nous pouvons simplement l'écrire sous forme de tâche. Mais pour avoir donné ce code, je le garde comme ça. Maintenant, vous souvenez-vous que
nous devons transmettre troisième argument dans ce vent
par identifiant et méthode de mise à jour ? Ici, nous passons new à true et exécutons également
les validateurs à true Sauvegardons ceci pour que
nous puissions voir clairement. Sympa. Nous savons maintenant que cette
expression est une tâche asynchrone. Nous passons donc ici un poids, et nous stockons la valeur mise à jour
dans la variable updateto do. De plus, pour un poids, nous devons passer ici de manière asynchrone, et en bas, nous renvoyons simplement
cette mise à jour pour faire Enregistrez les modifications et
lançons cette application. Bien. Ouvrez le test d'API mis à jour. Ici, le corps est prêt. Juste en haut, nous devons passer le vrai
identifiant de l'objet à faire en tant que paramètre. Nous copions donc n'importe quel identifiant à faire
du pass Mongo Di,
et ici, à la
place de cet identifiant,
nous transmettons notre identifiant et nous nous
assurons également d'ajouter le préfixe d'API le
moins important Envoyez cette demande. Bien,
nous avons reçu nos données mises à jour. Passons maintenant à la deuxième requête, qui consiste à mettre à jour
tous les documents
dont le statut actuel est et le
statut mis à jour avec terminé. Je duplique cette requête et je la commente
simplement. Nous devons maintenant mettre à jour
ici plusieurs documents. Ainsi, au lieu de
rechercher par identifiant et de mettre à jour, nous utilisons Update Many. Ici, au lieu de l'ID, nous devons passer l'objet de requête
avec le statut de condition à faire et nous voulons
modifier les données une fois terminées. Nous supprimons également ce
troisième argument. Nous n'en avons pas besoin,
enregistrez les modifications et ne vous inquiétez pas pour l'
ID et le corps de la tâche. Nous ne les utilisons pas dans notre
requête. Envoyez la demande. voyez, ici, le nombre de
modifications est passé à un, ce qui signifie que nous l'avons mis à jour
avec succès. Vous pouvez également le vérifier à
l'aide de la boussole Mongo Di B. C'est vrai, il s'agit d'une méthode qui fonctionne
avec des données. J'adore ça. Passons maintenant à la troisième requête. Permet de supprimer une tâche
spécifique par son identifiant. Nous sommes donc déjà en train d'obtenir un identifiant à partir du point de demande PRMs De plus, nous supprimons cette
ancienne méthode des entiers car nous n'en avons pas besoin. Il ne nous reste plus qu'à écrire une requête. Supprimez ce code précédent, et nous utiliserons le point, méthode
que nous utilisons.
Pensez-y. Nous devons supprimer
une tâche spécifique par son identifiant. Oui, nous pouvons utiliser Dilt one, fine one et delete, ou nous pouvons également utiliser
fine par identifiant et supprimer Ici, je ne précise pas, nous devons renvoyer le document
supprimé ou non. Donc, pour la première représentation, nous utilisons ici le DLT one Si nous voulons supprimer le document, nous l'utilisons ici, affiner
par identifiant et supprimer. Ici, nous passons l'objet de requête avec la
propriété ID de soulignement à ID Maintenant, au début, nous ajoutons await et le stockons
dans une variable appelée result. Maintenant, pour wait, en haut, nous ajoutons Async et en bas,
nous renvoyons ce résultat dans
cet objet JSON avec
cette propriété de message Enregistrez les modifications
et jetez-y un œil, copiez n'importe quel identifiant de la
base de données et ouvrez la demande de suppression.
À W de cet identifiant, nous collons notre identifiant, nous adhérons au
préfixe de l'API Slash et envoyons la Vous voyez, nous sommes supprimés
jusqu'à un, ce qui signifie que nous avons correctement
supprimé le todo Si nous actualisons notre base de données, C, nous n'avons que sept todos L'une d'entre elles est supprimée
de la base C'est
ainsi que nous effectuons la
mise à jour et la suppression dans Mongo DB Je sais que cette section est un peu
longue par rapport aux autres sections, mais comme vous pouvez le constater, il
est très important d'apprendre Mongo Deb C'est pourquoi j'ai conçu ces exercices spécifiques à l'apprentissage
de Mongo Deb Si vous regardez ce
cours en continu, faites une petite pause
loin de l'écran. Buvez de l'eau et
prenez soin de vos yeux. Rendez-vous dans la
section suivante où nous apprendrons des
sujets avancés sur Mongo Deb
78. Section 08 - Créé dans des validateurs: Bienvenue dans la huitième section du cours ultime de Node JS. Dans cette section, nous allons apprendre les
concepts avancés de Mongo DB. Nous commençons par appliquer des
validateurs dans le schéma du modèle, renvoyant des erreurs personnalisées
pour ces validations Ensuite, nous verrons comment établir une relation
entre les collections, différents types de conception de structure de
base et comment créer des correctifs très rapidement. Ces concepts sont très utiles lorsque nous voulons créer des applications du monde
réel. Commençons cette section. Dans la section précédente
du projet de démonstration Mongo, nous avons créé ce schéma pour notre modèle utilisateur,
et dans le schéma, nous définissons le type de remplissage
et d'autres propriétés
, le cas échéant Il s'agit d'un type de
validateur requis pour ce schéma. Auparavant, nous les définissions simplement, mais nous ne voyons pas vraiment l'implémentation pratique
du validateur pour le schéma Voyons ce qui s'est passé
lorsque nous essayons d' ajouter des données sans
saisir le nom. Nous définissons cette propriété
de nom à partir d'ici et en bas, à la place de la fonction utilisateur
relative,
nous appelons fonction utilisateur créative Enregistrez les modifications,
et dans le terminal, exécutons cette application
node index point js. Vous voyez, ici nous avons une erreur. Faisons défiler la page vers le haut. Ici, nous pouvons voir que nous obtenons erreur
de validation, la
validation utilisateur est remplie. Nom : le nom du chemin est obligatoire. Vous vous demandez peut-être pourquoi
nous recevons ce
type d'erreur longue. La raison en est donc que nous ne
gérons pas correctement les erreurs. Nous savons donc ici que cette nouvelle méthode user point cv renvoie une promesse, et c'est pourquoi nous utilisons await. Mais ici, nous faisons
semblant d'obtenir toujours des données dans cet objet et nous avons
oublié de gérer les erreurs Vous souvenez-vous donc, dans la section JavaScript
d'Asynrna, comment nous gérons les erreurs
dans les méthodes Asnawt C'est vrai, nous utilisons le blog try
and catch. Nous ajoutons donc ici également un blog Tr pour y
déplacer notre tâche de course. Maintenant, si vous rencontrez une erreur
lors du stockage de cet utilisateur, notre code, passez à Catch Blog. Ici, nous obtenons
un objet d'erreur, et pour l'instant, nous consultons simplement
cet objet d'erreur par point, et il possède une propriété
appelée message dans laquelle nous
obtiendrons un message d'erreur. Enregistrez les modifications, puis
réexécutez cette application. Vous voyez, nous avons maintenant
notre message d'erreur. Mais ici, je reçois également
ces informations de mise à jour. Laissez-moi voir ce qui ne va pas. Oui, en bas de page, j'ai oublié de commenter
cette fonction utilisateur de mise à jour. Enregistrez NGs, et relançons
cette application. Vous voyez, nous recevons ici
notre message d'erreur. C'est clair et clair. Dans le monde réel, nous pouvons renvoyer ce message d'erreur en réponse
avec le code d'état 400. Maintenant, ne t'inquiète pas pour ça. Maintenant, que se passe-t-il si nous voulons transmettre un message d'erreur
personnalisé pour
ce champ obligatoire ? À la place de cette valeur
true, nous passons array. En premier lieu, nous transmettons notre valeur pour le montant
requis, ce qui est vrai. En second lieu, nous transmettons
notre message d'erreur sous forme de chaîne. Supposons que vous
saisissiez le nom d'utilisateur. Enregistrez les modifications
et jetez-y un œil. Vous voyez, nous recevons ici notre message d'erreur
personnalisé. Les validateurs nous aident à maintenir la qualité et l'
exactitude des données En utilisant des validateurs,
nous vérifions si
les valeurs du document respectent les règles que nous avons
définies pour chaque remplissage Il existe deux types de
validateurs dans les mangues. Le premier est constitué de validateurs intégrés
, qui sont les
validateurs prédéfinis par Ensuite, nous avons
des validateurs personnalisés
, que nous pouvons définir nous-mêmes. Required fait partie des validateurs
intégrés. Permettez-moi de vous montrer un autre validateur intégré
de mangues. Pour la chaîne, nous avons la longueur minimale, qui vérifiera la
longueur minimale de la chaîne, et nous passons la longueur
minimale ici. Après cela, nous avons la longueur maximale qui vérifiera la
longueur maximale de la chaîne. Ensuite, nous avons match qui valide la chaîne à l'aide
d'une expression régulière, et sa syntaxe est la suivante développeur de
barres obliques utilise ce validateur
de correspondance Pour l'instant, ce n'est pas ce que nous voulons. Supposons maintenant que pour chaque utilisateur, nous devions mentionner le
rôle de cet utilisateur, qui peut être un utilisateur simple
ou un administrateur,
et que la chaîne autre que
celle-ci ne soit pas valide. À ce moment-là,
nous avons défini le type sur
string pour définir les
deux possibilités, nous utilisons ici la propriété num
et nous l'avons définie sur array, et vous l'avez bien deviné, nous transmettrons nos
valeurs dans ce tableau Le premier peut être utilisateur et le
second, peut être administrateur. Nous pouvons adhérer à autant de
valeurs que nous le souhaitons, mais nous devons transmettre l'une de ces valeurs lorsque
nous enregistrons un nouvel utilisateur. Nous l'avons déjà constaté
dans notre exercice. N'oubliez pas que ce sont les
validateurs pour les chaînes de caractères. De plus, il existe également deux validateurs
pour le nombre, moyenne et le maximum, mais nous ne
voulons pas les ajouter ici. Tout cela est intégré à des validateurs.
Ils sont très utiles. De plus, une chose que je
tiens à préciser est que les validateurs sont
une fonctionnalité de mangouste Cela ne fait rien
avec Mongo DB. Si dans la base de données Mongo Debi, nous supprimons le
champ de nom d'un enregistrement, alors Mongo Deb ne s'en
soucie pas dans notre schéma, nous définissons le champ
de nom comme obligatoire Mongoose nous fournit ces
fonctionnalités afin que nous puissions valider les valeurs des utilisateurs avant de les
stocker dans la base de données Si ce n'est pas valide, Mongoose ne stocke pas
ces données dans la base de données, et si elles sont valides, Mongo les stocke dans la est aussi simple que ça.
Dans la leçon suivante, nous verrons comment créer des données valides
personnalisées
79. Validateurs personnalisés: Voyons maintenant comment définir validateurs
personnalisés dans notre schéma Nous avons donc ici des loisirs remplis
, à savoir le tableau des cordes. Nous voulons nous assurer que l'utilisateur
doit ajouter plusieurs loisirs. Pour cela, nous devons
définir des validateurs personnalisés. C'est vraiment simple. Donc, après cette propriété de type, nous avons
ici une autre
propriété appelée validate, et nous passons ici un autre objet. Maintenant, à l'intérieur de cet objet, nous avons la propriété du validateur, la colonne et la fonction de
validation Here Pass Ici, nous voulons vérifier. La valeur passée pour ce champ
comporte deux éléments ou non, mais pour cela, nous avons
besoin de la valeur ici. Nous obtenons cette valeur en tant que paramètre, et nous l'appelons V pour valeur. Maintenant, dans cette fonction, nous pouvons simplement renvoyer la condition. Permettez-moi de vous demander, comment
pouvons-nous vérifier cela ? V comporte deux éléments ou non ? Oui, nous pouvons écrire ici, longueur du
point doit être
supérieure à un. Et c'est tout. Voyons voir si cela fonctionne ou non. Pour cela, nous commentons ce domaine des loisirs et je change
également l'
e-mail en Harley One Enregistrez les modifications et
exécutons cette application. voyez, nous avons ici deux erreurs, une pour le nom et
une autre pour le hobby. Le validateur a échoué
pour les loisirs de chemin
dont la valeur était une chaîne vide Imaginez maintenant que nous renvoyons
cette erreur avec notre API. Presque personne ne peut
comprendre cette erreur. Nous devons donc donner un message d'erreur
significatif pour modifier ce message d'erreur Après cette fonction de validation, nous avons la propriété du message et
nous passons ici un message personnalisé, veuillez saisir deux loisirs
différents Assurez-vous que cette propriété de
message était présente dans cet objet de validation, non dans la
fonction de validation, car j'
ai commis cette erreur lors
de l'enregistrement de cette leçon Enregistrez ceci et exécutons cette
application une fois de plus. Vous voyez, nous recevons ici notre message d'erreur
personnalisé. Maintenant, testons d'autres
choses pour ce remplissage. Et si quelqu'un
ne passe qu'un seul hobby ? Vérifions-le.
Supprimez la commande, et nous supprimerons deux autres
loisirs de notre tableau. Enregistrez les modifications et
exécutons cette application. Bien, nous recevons ici le message d'erreur,
cela fonctionne. Maintenant, que se passe-t-il si quelqu'un
passe ici une valeur nulle ? Enregistrez ceci et exécutons notre
application une fois de plus. voyez, nous obtenons ici des
propriétés impossibles à lire dont la longueur de
lecture est nulle. Maintenant, pourquoi
obtenons-nous cette erreur ? Parce que dans nos validateurs
personnalisés, nous essayons d'obtenir la
longueur de cette valeur Mais si l'utilisateur passe null comme valeur, nous ne pouvons pas accéder à la propriété
length. Nous pouvons adhérer à une autre
condition : le
type V est égal à array. Et sa longueur doit
être supérieure à un. Si ces deux
conditions sont vraies, ce n'est qu'alors que nos données sont validées. Nous pouvons également modifier le
message pour
saisir un tableau de loisirs avec
deux loisirs différents. Enregistrez les modifications et
exécutons cette application. voyez, ici, nous recevons également
le message personnalisé pour la valeur
nulle. Donc, pour récapituler rapidement l'
ajout de validateurs personnalisés, nous avons une propriété valide
après la propriété type Et dans cette validation, nous
pouvons ajouter deux propriétés. L'un est le validateur, qui
possède une fonction de validation, et l'autre est un message personnalisé Et à partir de cette fonction de
validation, nous renverrons la
condition de validation Vous pourriez vous demander si nous
voulons renvoyer la condition, alors pourquoi avons-nous besoin de cette fonction ? Nous pouvons directement ajouter une
condition ici, mais vérifiez-la une fois de plus. Dans cette condition, nous avons toujours besoin de la
valeur actuelle de ce remplissage, et nous ne l'obtenons que dans
la fonction de validation C'est pourquoi nous avons besoin de
cette fonction. C'est ainsi que nous définissons des
validateurs personnalisés pour le schéma.
80. Validateurs async: Parfois, dans notre projet, notre validation peut impliquer des opérations
asynchrones, ce qui signifie que l'opération
peut prendre Par exemple, nous voulons récupérer
des données de la base de données, et sur la base de ces données, nous voulons valider notre remplissage Dans ce cas, nous pouvons
appliquer des validateurs asynchrones. Laisse-moi te montrer. Pour appliquer les validateurs asynchrones de
la version précédente Ici, dans l'objet validateur, nous devons ajouter une propriété
appelée async à true Mais dans la dernière version de
Mongoose, cette option est activée par défaut
. Nous pouvons le supprimer. Maintenant, nous pouvons simplement rendre cette fonction asynchrone et
à l'intérieur de cette fonction, nous pouvons effectuer notre tâche
asynchrone Nous ne voulons pas cette
complexité ou ce modèle, donc pour démontrer le délai, nous utilisons ici la méthode set timeout Le premier paramètre est la fonction de
rappel,
et deuxièmement, nous ajoutons
3 000 millisecondes Maintenant, avant cette fonction de
délai d'expiration définie, permettez-moi de
récupérer les données pour validation par le journal des points sur console Supposons maintenant qu'après
3 000 millisecondes, nous obtenions des données de la base de données et
que, sur
la base de ces données, nous puissions renvoyer N'oubliez pas que nous devons renvoyer l' état tel que nous
l'avons fait précédemment, ce qui signifie qu'il doit
être vrai ou faux. Enregistrez les modifications et
exécutons cette application et voyons, nous obtenons
ici notre erreur. C'est ainsi que nous pouvons appliquer des validateurs
asynchrones. Personnellement, je ne l'utilise
jamais dans mon projet car les opérations acyc
pour la validation sont rares, mais ce sujet peut
aider certains d'entre vous, et c'est pourquoi j'
ajoute cette leçon Dans la leçon suivante, nous allons voir quelques options schématisées.
81. Options utiles de SchemaTypes: Voyons maintenant les
options des types de schéma dans Mongoose. Nous les utilisons déjà
dans notre schéma, qui va de minuscules à vrai. Cela stockera notre
chaîne en minuscules. De même, nous avons une
majuscule pour dire vrai. Cela stockera toute notre
chaîne en majuscules. Et après cela, nous avons
une autre option utile, qui est stream to true. Cela supprimera les espaces
vides inutiles de notre chaîne. Par exemple, cela convertira cette chaîne en
ce type de chaîne. Nos données semblent donc bien
organisées et propres. Ce n'est pas nécessaire,
nous devons utiliser toutes ces
options de schéma dans notre projet. Nous pouvons utiliser tout ce qui est nécessaire
selon notre modèle. Il n'y a pas de règles pour cela. En fin de compte, les validateurs ne
servent qu'à maintenir la qualité
et l'exactitude des données
82. Relation entre les modèles: Donc, jusqu'à présent, dans ce cours, nous avons vu des modèles ou des
collections
simples qui n'ont aucun
lien avec un autre modèle. Mais dans le monde réel, la plupart de nos modèles sont connectés les uns
aux autres. Laissez-moi vous expliquer à l'
aide d'un exemple. Imaginons donc que nous travaillions sur application de réseau
social
telle que Twitter. Nous avons donc
une collection pour les utilisateurs dans laquelle nous stockerons
toutes les données des utilisateurs telles que le nom, e-mail, le mot de passe, etc. Ensuite, nous avons
une collection pour courrier dans laquelle nous
stockerons toutes les données relatives au courrier. Dans le document de publication,
nous avons du contenu, qui est la date du texte du
contenu de l'article laquelle ce message a été créé. Après cela, nous avons un utilisateur qui a téléchargé ce message,
disons Harley Maintenant, ces deux documents,
ou plutôt des collections, ne sont pas liés l'un à l'
autre. Nous devons les connecter. C'est ce qu'on appelle une
relation de modèle. Maintenant, vous vous demandez peut-être pourquoi nous devons connecter
les modèles entre eux ? Pourquoi avons-nous besoin de cette relation ? Donc, si nous n'utilisons pas la relation, nous risquons de stocker
les mêmes données utilisateur à plusieurs reprises
pour chaque publication qu'ils publient. Supposons qu'un utilisateur publie
dix publications différentes. Si nous n'utilisons pas la relation, nous devons stocker
les mêmes données utilisateur dix fois pour chaque publication, et cela ne représente qu'un seul utilisateur. Imaginez que sur notre application de réseau
social, il y ait 100 000 étudiants
ou plus que cela. Pensez à la quantité de données qui
doivent être répétées dans notre base de données, et cela est également
plus difficile à gérer. Nous devons donc utiliser les relations entre
les modèles associés. Il existe maintenant deux approches
pour mettre en œuvre la relation. La première consiste à utiliser des références, et une autre consiste à intégrer
des données dans un autre document. Voyons d'abord comment implémenter une relation à
l'aide de références. Dans le document postal, nous avons cet utilisateur et nous passons le nom d'utilisateur. Désormais, cet utilisateur
est déjà disponible dans la collection de l'
utilisateur. Au lieu de stocker le nom d'utilisateur
dans la collection de publications, nous pouvons utiliser le nom
d'utilisateur de cet utilisateur. Par identifiant unique de l'utilisateur, nous pouvons exécuter une autre
requête pour obtenir les données utilisateur telles que
le nom et la photo
de profil de la collection des utilisateurs. Maintenant, pour chaque publication, nous avons juste un identifiant utilisateur à
la place du nom d'utilisateur. Mais nous pouvons voir qu'il faut
exécuter une autre requête
dans cette approche, qui pourrait entraîner des problèmes de
performances. Je ne dis pas que cela entraînera certainement des problèmes de
performances, mais parfois c'est le cas. L'autre approche
qui peut résoudre ce problème consiste à intégrer des
données dans un autre document. Au lieu de
transmettre ici l'identifiant utilisateur, nous pouvons transmettre ici l'objet utilisateur et supprimer la collection de notre
utilisateur. Avec cette approche, nous n'
avons pas à exécuter de requêtes, nous ne sommes
donc pas confrontés des problèmes de
performances,
mais voici une chose. Imaginez que l'utilisateur dispose de
20 à 40 informations. Cela rendra notre
document postal beaucoup plus volumineux. De plus, cela entraînera une duplication
des données
car pour chaque publication, nous devons stocker l'objet utilisateur. Aujourd'hui, certains développeurs disent que stockage de base de données est bon marché de
nos jours. Nous pouvons nous permettre de
dupliquer les données et c'est vrai. Mais que se passe-t-il si notre utilisateur souhaite mettre
à jour son
nom d'utilisateur ou son adresse e-mail ? Cette fois-là, nous devons
mettre à jour plusieurs
articles et si deux ou trois documents
ne sont pas mis à jour, cela entraînera une incohérence des données Mais lorsque nous utilisons des références, nous ne devons mettre à jour les données
qu'à un seul endroit. En résumé, lorsque nous
utilisons des références, nous obtenons une cohérence des données car celles-ci sont stockées
à un seul endroit, mais nous pouvons rencontrer des problèmes de
performances car nous
devons exécuter plusieurs requêtes. D'un autre côté, lorsque nous intégrons des données dans un autre document,
nous obtenons des performances Nous obtenons nos données plus rapidement car nous n'avons pas besoin d'
exécuter plusieurs requêtes. Nous avons nos données dans un seul
document, mais cela entraîne des incohérences car nous avons les mêmes
données à plusieurs endroits C'est achetez-en un, obtenez-en un gratuitement. Nous devons nous prononcer
sur notre candidature. Nous avons besoin de cohérence
des données ou de performances. Si nous voulons de la cohérence des données, nous utilisons des références, et si nous voulons des performances, nous avons intégré les données
dans un autre document. Différents projets ont des exigences
différentes. En tant que développeur,
vous devez décider
quelle approche convient
le mieux à votre projet. De nos jours, les développeurs
utilisent une approche hybride, qui combine
ces deux approches, et nous le verrons
dans la prochaine leçon.
83. Approche hybride pour les Relations: Nous avons constaté que lorsque
nous utilisons des références, nous obtenons de la cohérence des données, et lorsque nous intégrons des données dans un autre document,
nous obtenons des performances Permettez-moi de vous montrer l'approche
hybride utilisée
par les développeurs de nos jours. Supposons que nous
ayons des utilisateurs dotés de 20 à 30 propriétés, nous stockerons les
détails de ces utilisateurs dans la collection de
l'utilisateur. Maintenant, pour la publication, nous avons
ces autres champs, comme nous le voyons dans l'approche de
référence. Mais dans l'approche de référence, nous stockons ici l'ID utilisateur. À la place de cela, nous pouvons
utiliser ici, un petit objet utilisateur, qui ne contient que les propriétés
nécessaires que nous voulons
afficher avec post. Il se peut que nous ayons un ID utilisateur, qui est la référence à la collection de l'utilisateur
et au nom d'utilisateur. Nous ne stockons pas ici les
20 à 30 propriétés, mais nous n'intégrerons
que cette quantité de données Nous voulons afficher avec publication. Avec cette approche,
nous pouvons rapidement récupérer message car nous n'avons pas besoin
de récupérer plusieurs requêtes Nous avons toutes les
données nécessaires dans un seul objet. Cette approche fonctionne mieux lorsque notre collection
a besoin de petits détails fréquemment consultés. Par exemple, dans notre
projet de commerce électronique, où nous avons des produits, des commandes, un panier, etc. chaque commande, nous voulons utiliser petits détails de nos
produits tels que l'identifiant, nom, l'image de couverture et le prix car nous voulons afficher détails de
cette commande
avec les produits. Nous avons donc une
collecte séparée pour les données sur les produits, mais nous intégrerons tout quelques petites données sur les
produits dans chaque commande Ainsi, lorsque nous voulons
accéder rapidement à de petits détails, mais que nous voulons également référencer
des données volumineuses ou complexes, nous utilisons une approche hybride. Encore une fois, je vous le dis, vous
n'êtes pas obligé de vous en tenir
à une seule approche. Certaines applications fonctionnent
mieux avec des références. fonctionne donc mieux avec les données
intégrées, et certaines fonctionnent mieux dans
cette approche hybride. Vous devez décider en fonction
des besoins de votre projet. Ne vous inquiétez pas lorsque nous construirons deux
autres projets, je vous montrerai comment nous pouvons
décider de l'approche relationnelle. Je parle de relation
entre les collections, pas d'autres types
de relations.
84. Appliquer l'approche de référence: Voyons comment appliquer approche de
référence à
la relation. Pour mettre en pratique ce concept, j'ai créé ce nouveau
fichier parce que je ne veux pas que vous soyez embrouillé
par ce noyau désordonné. Je vais vous expliquer ce que
j'ai ajouté dans ce fichier. Tout d'abord, nous connectons ce fichier à base de données
Mongo DB appelée
Mongo qui est une Ensuite, comme nous le
voyons dans l'exemple, nous définissons ici un
schéma utilisateur simple avec seulement trois remplissages, nom, e-mail et âge. Ensuite, nous définissons
un nouveau schéma pour la publication. En cela, nous avons un contenu à
deux remplissages, qui peut être du texte puis de la date, qui est la date actuelle en temps
réel. Nous avons un utilisateur que nous
ajouterons dans une minute. Ensuite, nous créons
deux modèles pour les
utilisateurs et pour la collecte des publications.
Nous l'avons déjà fait. Je ne veux pas vous ennuyer en écrivant le même code
encore et encore. Maintenant, après avoir créé
ces deux collections, je définis quelques fonctions. L'une concerne la création
d'un utilisateur dans laquelle nous pouvons créer un nouvel utilisateur et le
stocker dans la collection de l'utilisateur. Ensuite, nous avons la
fonction Créer une publication dans laquelle nous créons une nouvelle publication en utilisant le
contenu et les données de l'utilisateur, qui a créé cette publication. La dernière fonction consiste à récupérer
tous les messages de la base de données. Nous avons déjà vu tout cela. Créons le premier utilisateur
avec ces valeurs. Exécutez cette application en utilisant
node, point de référence JS. Bien. Essayons maintenant de créer une nouvelle publication sans
ajouter de données utilisateur. Ici, je commente cette fonction de création d'utilisateur et je supprime le commentaire de la fonction Create
Post. Exécutons
à nouveau cette application et voyons ici
créer un nouveau message. Nous avons du contenu et nous voyons, nous n'obtenons aucune donnée utilisateur, même si nous transmettons les nouvelles données utilisateur telles que
renseignées. Nous pouvons voir que les mangues n'
ajouteront que les remplissages que nous avons
définis dans le schéma Il n'ajoutera pas tous les autres remplissages. Maintenant, dans ce modèle de publication, il faut ajouter le champ
utilisateur et nous donnons la référence utilisateur
de la collection des utilisateurs. Laissez-moi vous montrer ce que je veux dire. Ici, nous ajoutons un utilisateur. Maintenant, chaque fois que nous
voulons donner une référence, nous pouvons la donner en utilisant l'identifiant de l'
objet car il est unique. Nous transmettons son type au schéma de points
de Monaco (
types de points, point Object ID Oui, nous devons transmettre
cette expression pour définir l'
ID d'objet en tant que type rempli. Après la propriété type, nous devons indiquer quelle autre référence de
modèle nous ajoutons. Nous passons RF deux et nous passons
ici le
nom de notre collection au singulier. Identique à cette
méthode de modélisation par points de mangouste, qui est user Passons maintenant notre nom d'utilisateur
dans la fonction de création de publication. Dans le Mongo D BCMEpass, nous obtenons la nouvelle base de données appelée Dans ce cas, nous obtenons la collection des
utilisateurs, copions cet ID utilisateur, que nous venons de créer, et
le collons à la place de
cette chaîne d'utilisateurs. Dans la fonction Créer une publication, nous avions cet identifiant sur
le site de l'utilisateur. Nous allons également changer ce
contenu en contenu. Donc, les changements, et
lançons cette application. Vous voyez ici, nous recevons également un nouveau
message avec du contenu, et nous obtenons également ici un ID utilisateur, qui est la référence
au modèle utilisateur. L'ajout d'une référence est très simple. Nous devons définir ce type de remplissage sur le schéma de points
Mongos point
Types point Object ID, et nous passons la
propriété ref pour ajouter le
nom du modèle de référence au singulier. Maintenant, si nous essayons d'obtenir un message, commentez-le et supprimez le commentaire de
cette fonction G post. Enregistrez les modifications
et jetez-y un œil. Tu vois, ici, nous avons deux articles. Le premier, que nous avons
créé sans utilisateur et second dans lequel nous
définissons l'ID utilisateur comme référence. Maintenant, vous vous demandez peut-être que nous
obtenons ici un identifiant utilisateur simple. Comment pouvons-nous obtenir les données
utilisateur telles que le nom d'utilisateur ou l'e-mail
à partir de cette référence ? C'est ce que nous verrons dans
la prochaine leçon.
85. Comment extraire les données de la référence [Populer]: Voyons comment extraire données à l'aide de cet identifiant de référence ? C'est vraiment simple. Pour obtenir les
données par référence, nous utilisons une méthode
appelée populate. Après cette méthode fine, nous ajoutons un point populate
et à l'intérieur de celui-ci, nous devons passer le
nom du remplissage qui est la référence Oui, il est utilisé ici. Enregistrez les modifications
et jetez-y un œil. Exécutez à nouveau ce fichier. Tu vois, nous voilà de nouveau en train de poster. Dans le deuxième article, nous obtenons
tous les détails de cet identifiant utilisateur. Maintenant, imaginez que nous
voulions juste obtenir le nom d'ici. Nous n'avons pas besoin d'autres remplissages. Pouvons-nous le faire ? Oui, nous le pouvons. Au deuxième argument, nous transmettons le nom des pilules que nous voulons obtenir à partir de notre collection de
référence. Dans les codes, nous ajoutons un nom, enregistrons et exécutons cette
application une fois de plus. Vous voyez, ici, nous n'avons que
le nom et l'identifiant de soulignement. Maintenant, au lieu de simplement
afficher le nom, nous voulons tous les détails sur l'utilisateur, mais nous n'avons pas besoin de cet
âge. Comment pouvons-nous le faire ? Tout nom de lieu,
nous voulons le supprimer, moins être très simple. C'est ainsi que nous étendons les
données de référence en utilisant la méthode populaire. Maintenant, laissez-moi vous dire quelque chose. Nous avions une référence dans notre modèle, seules les mangues utilisent cette référence Mongo Deb s'en fout. Même si nous transmettons ici un ID utilisateur
non valide, Mongo DB ne
vérifie pas si l'ID utilisateur est disponible ou non dans la collection de
l'utilisateur Il stocke les données sans
s'en soucier. Laisse-moi te montrer ça. Nous
créons ici un autre article. Commentez cette fonction de publication
Gad et supprimez le commentaire de
cette fonction de création de publication Changeons ce
contenu à trois, et nous modifierons simplement le dernier caractère de cet ID
utilisateur. Dans notre collection d'utilisateurs, aucun utilisateur ne
possède cet identifiant. Lancez maintenant cette application. Tu vois, notre troisième utilisateur
est créé ici. Maintenant, nous allons obtenir la liste des publications, commenter cette fonction et appeler cette fonction Gad Post Les modifications apportées et
pour le troisième article, nous mettons l'utilisateur à null
parce que nous n'
obtenons pas de référence pour
cet identifiant d'objet non valide, ce qui prouve que MGB
ne vérifie pas si l'identifiant utilisateur est disponible ou non dans la collection de
l'utilisateur Dans la
leçon suivante, nous allons voir une autre approche
intégrée dans un autre document.
86. Appliquer l'approche embarquée: Pour appliquer une approche intégrée, je ne supprime pas le code précédent car je souhaite vous donner
ce code à titre de référence. Nous téléchargeons le fichier Embedded
point JS ci-dessous, ou vous l'obtiendrez dans
le dossier
8 de la section des ressources. Maintenant, dans l'approche de référence utilisée
ici pour les champs remplis par l'utilisateur, nous passons le type à l'
identifiant de l'objet et le référençons
avec la collection des utilisateurs. Mais dans l'approche embarquée, nous ajoutons directement ici
un objet utilisateur avec toutes les propriétés. Nous ne créons pas ici de modèle utilisateur, supprimons cette ligne, nous ne
créons qu'un seul modèle qui est publié. Nous pouvons également supprimer la fonction de
création d'utilisateur par le bas, car
chaque document
contient un objet utilisateur pour chaque publication. Nous pouvons maintenant ajouter un objet ici
et nous devons transmettre ici les propriétés dont nous avons
besoin pour cet objet utilisateur. Nous pouvons dire nom à chaîne, e-mail à chaîne
et âge à numéro. Maintenant, l'inconvénient de cet objet
utilisateur est que notre utilisateur peut transmettre aucune valeur pour
le nom, l'e-mail ou l'âge. Nous devons passer les
validations pour ces remplissages car nous avons besoin
d'un objet utilisateur dans chaque publication Donc, au lieu d'ajouter
ici une validation, nous avons déjà un schéma utilisateur. Donc, au lieu de passer
cet objet simple, nous passons ici le schéma utilisateur. Dans ce schéma, nous pouvons ajouter tous nos validateurs tout comme
nous avons une collection séparée De plus, définir le schéma séparément présente un autre avantage. Nous pouvons également utiliser ce schéma
utilisateur pour une autre collection dans laquelle nous souhaitons
également intégrer les données de l'utilisateur Créons maintenant une nouvelle publication
avec ces données utilisateur intégrées. Je supprime donc cet appel de fonction de création
d'utilisateur, et nous appelons la fonction Create
Post. Maintenant, à la place de cet utilisateur, nous devons transmettre
l'objet utilisateur car cet objet utilisateur sera directement stocké
dans le document post. Pour l'utilisateur, nous transmettons l'objet
avec le nom des propriétés au code e-mail au code
etheridgmil.com Age, disons 25 ans. Enregistrez les modifications et
exécutons ce fichier intégré. Alors notez, intégrez et appuyez sur Entrée. C, nous recevons un nouveau message avec un objet
utilisateur qui a un
nom, un e-mail et un âge. Et si nous consultons également notre
base de données en bas, nous recevons un message avec un objet utilisateur. Ainsi, dans la référence,
nous transmettons simplement l'ID de l'objet et ajoutons une référence
à une autre collection. Mais dans l'approche intégrée, nous ajoutons directement des données utilisateur
complètes dans le document unique. Maintenant
j'ai une question. Et si nous rendons ce champ de
nom obligatoire et que nous ne transmettions pas le nom
dans l'objet de l'utilisateur ? Notre publication créera-t-elle ou non ? Cela ne fait pas partie de la leçon
que j'ai vraiment envie de voir. Allons voir ça. Ici, à la
place du nom dans la chaîne, nous ajoutons l'objet, le type dans la chaîne et required la valeur true. Maintenant, en bas, supprimons ce champ de nom et changeons ce contenu en erreur d'essai. Enregistrez les modifications
et jetez-y un œil. Oh, nous obtenons une erreur de validation, ce qui signifie qu'aucun nouveau message n'
est créé, et nous pouvons également le vérifier
dans notre base de données. Imaginons maintenant que nous voulions stocker 20 à 30 propriétés
pour les données des utilisateurs. Nous ne pouvons pas ajouter tous ces remplissages
dans chaque document de publication. R, supposons que nous voulions obtenir
les données des utilisateurs telles que l'e-mail et passe, alors comment pouvons-nous obtenir ces données séparément
sans récupérer tous les messages ? Cette méthode intégrée n'
est pas vraiment pratique pour les applications
de réseaux sociaux. C'est pourquoi les développeurs utilisent une approche
hybride pour
équilibrer l'application, et nous allons implémenter
une approche hybride dans la prochaine leçon.
87. Appliquer l'approche hybride: Implémentons l'approche
hybride dans le même modèle de code. J'ajoute à nouveau le même code
dans le fichier hybride point js. Vous pouvez également
le télécharger ci-dessous de cette leçon. Désormais, dans l'approche intégrée, nous avons ajouté toutes les propriétés des utilisateurs dans une seule collection et nous ne créons même pas de collection
utilisateur. Maintenant, dans l'approche hybride, nous créons une collection d'utilisateurs dans laquelle nous pouvons ajouter
toutes les propriétés. Mais ce que nous allons ajouter dans le champ utilisateur de la collection de
publications, car ce document nécessite
les données des utilisateurs qui ont créé ce message. Au lieu de transmettre
ici toutes les propriétés des utilisateurs, nous n'ajoutons que quelques propriétés
dont nous avions besoin pour le message. Par exemple, avec la publication, nous voulons afficher le nom d'utilisateur
et l'adresse e-mail de cet utilisateur. Nous n'en voulons pas Nous ajoutons
donc le nom,
qui peut être une chaîne, et nous voulons afficher la photo de
profil de cet utilisateur, qui peut être une chaîne d'URL de la photo
de profil Nous appliquons donc uniquement les
remplissages nécessaires pour l'utilisateur. Pas le document dans son intégralité. Maintenant, cela fonctionnera
parfaitement bien. Mais que se passerait-il si, dans certains cas, nous voulions plus d'informations
sur l'utilisateur avec le message. Certains développeurs
adhèrent également à l'utilisateur Rf, qui est la référence utilisateur. Il s'agit de la même référence que nous avons ajoutée dans la leçon
de référence précédente. Nous avons dit que c'est du type de schéma de points de Monaco, des
types de points, des points, des ID d'objet Ce que nous ajoutons ici
est une référence à l'utilisateur. Nous pouvons également changer le nom de ce
champ en résumé utilisateur. Je pense que c'est bien mieux. Maintenant, changeons un
peu la fonction de création de publication. Ici, nous ajoutons un ID utilisateur dans le
paramètre, et dans cet article, changeons ce champ
utilisateur en résumé utilisateur, puis autre propriété utilise une
référence à cet ID utilisateur. Maintenant, en bas, nous appelons
cette fonction create post. Ici, nous pouvons modifier le contenu. Il s'agit d'une méthode hybride qui
transmet le nom de votre objet aux codes et votre photo
de profil au point de profil JPG. Pour l'ID utilisateur, je copie l'
ID de la base de données. Et collez l'identifiant ici. Enregistrez les modifications
et jetez-y un œil. voyez, ici, nous recevons un nouveau message avec un résumé de
l'utilisateur et un
représentant de l'utilisateur. Nous arrivons ici tous les deux. Si vous souhaitez afficher rapidement données sans appeler
plusieurs requêtes, nous utiliserons
ce résumé utilisateur et si nous voulons
plus de données sur l'utilisateur, qu'alors que nous utilisons
cette référence utilisateur. De cette façon, nous pouvons optimiser les performances et obtenir les données que nous voulons. Utilisez ce qui convient le mieux
à votre application. Au final, ce n'est pas le tien.
88. Index dans MongoDB B: Parlons maintenant des
index dans Mongo DB. Les index sont un sujet très intéressant et important de Mongo DB L'index est utilisé pour accélérer les requêtes de
notre base de données, et nous en verrons également
la démonstration. Même Mongo DB affirme
qu'avec les index, notre requête de recherche dans la base de données peut exécuter Tenex
plus rapidement qu'auparavant, ce qui est vraiment
avancé Vous pouvez maintenant vous demander comment l'index accélère notre requête
de recherche. Laissez-moi vous expliquer à l'
aide d'un exemple. Imaginez que nous ayons ici une liste de cent données d'utilisateurs
et que nous voulions trouver un utilisateur dont l'adresse e-mail est
ceci y123 atgmil.com Maintenant, comment fonctionne une vraie requête, je prends un objet de document, vérifie que son adresse e-mail est 123
aterra gmail.com Si ce n'est pas le cas,
il sera déplacé vers un autre objet du document et vérifiera
à nouveau cet e-mail. Il poursuivra
ce processus jusqu'à ce que les
documents des cent utilisateurs soient numérisés. Comme vous pouvez le constater, c'
est un peu lent. Quelle est la solution ici ? Nous allons créer un index pour notre e-mail rempli de
collections. En créant simplement l'
index des e-mails remplis, notre requête de recherche d'
e-mail deviendra plus rapide. Voyons cela dans la pratique. Dans notre collection d'utilisateurs, nous n'
avons
actuellement qu'un seul utilisateur. Ajoutons de fausses
données d'utilisateurs à notre collection. Nous pouvons donc pratiquement voir notre requête fonctionne
mieux ou non. Pour cela, dans le dossier de la
section 8 des ressources, j'ai ajouté un fichier, testant index point js. Il suffit d'utiliser ce fichier
dans notre projet. Et dans ce fichier, j'ai
presque ajouté le même code que précédemment. Tout d'abord, collection Mogadbi, vous devez
écrire
ici le nom de votre base de données que vous utilisez
pour cette section Ensuite, nous créons le schéma
utilisateur avec le nom, e-mail et le mot de passe, afin de
pouvoir nous concentrer sur notre requête. Ensuite, en bas,
nous avons les fonctions. La première consiste à insérer des données aléatoires dans
la collection de l'utilisateur. voyez, en utilisant cette simple boucle
for et ce faux package, nous pouvons générer un nom d'utilisateur, un
e-mail et un mot de passe
aléatoires pour les tests Pour cela, dans notre projet, nous devons installer NPM
sur le faker Red Faker Js, au taux de 9,6 0,0 Et appuyez sur Entrée. Bien.
Maintenant, appelons simplement cette fonction pour
générer 100 000
données d'utilisateurs , car ici nous
exécutons cette boucle 100 000 fois. Et ici, nous ne voulons pas qu'il y ait
d'erreur lors de l'ajout d'un e-mail J'ai
donc supprimé le
remplissage unique sur true de notre schéma juste pour permettre à
100 000 utilisateurs d'entrer. de votre base Supprimez également cette collection d'utilisateurs afin que nous obtenions toutes les données les plus récentes. Déposez la collection, tapez ici utilisateurs et supprimez
la collection. Maintenant, dans notre fichier de test iXis, nous appelons ici la fonction Insérer les utilisateurs de
test Enregistrez ceci et exécutons
simplement ce fichier. Test du nœud dans axis
point js et appuyez sur Entrée. Cela prendra peu de temps et nous verrons ici nous obtenir un message de
réussite. Si nous consultons notre base de données, actualisons la collection, S
dans la collection de l'utilisateur, nous obtenons les données de 100 000 utilisateurs. Charmant. Tout d'abord, nous commentons cet encart de
cette fonction de données. Nous ne voulons plus le gérer. Voyons maintenant ce que cela prend de
trouver un utilisateur par e-mail, combien de temps cela prend. En bas, nous avons une
fonction appelée find user. Dans cette fonction, je déclare d'
abord l'heure. Après cela, nous exécutons requête
user point Fine dans laquelle nous passons le paramètre e-mail
à e-mail. Après avoir terminé cette requête, nous déclarons à nouveau le timer, qui est l'heure de fin, et ici
nous affichons simplement l'
heure de fin moins l'heure de début. Nous verrons
ainsi combien de temps prend cette
fine requête. De plus, le
point de performance est désormais plus précis et plus fiable pour
mesurer le temps d'exécution. Appelons maintenant cette fonction utilisateur
fine. Ensuite, à partir de la collection de nos utilisateurs, copions n'importe quel e-mail et
transmettons-le dans notre fonction
utilisateur fine avec des codes. Enregistrez ceci et dans le terminal, nous terminons le code et
réexécutons notre point d'
index de dégustation JSFle Vous voyez, ici, nous avons un temps de
130 millisecondes. Créons maintenant un index pour le remplissage de
nos e-mails et
découvrons la rapidité de notre requête. Pour créer un index,
avant de créer une collection, nous ajoutons userschema point
index et à l'intérieur de celui-ci, nous passons l'e-mail de l'objet, qui est le nom complet, nous voulons marquer comme index, et comme valeur, nous pouvons transmettre deux
choses une et moins une Maintenant, vous vous demandez peut-être quelle est la signification de un
et de moins un ? C'est vraiment simple. Un est pour l'
ordre croissant et moins un
pour l'ordre décroissant Lorsque nous créons un index, Mongo DB capture les
données par ordre croissant
ou décroissant Cela aidera Mongo Deb
à trouver des données rapidement. Ne vous inquiétez pas, je
vous expliquerai cela après la dégustation. Ici, nous en passons un
par ordre croissant et c'est fait. C'est ainsi que nous créons un index pour les e-mails remplis, d'une ligne de code. Tout le reste du code de ce
fichier est destiné à la dégustation, ne vous inquiétez pas pour ça. Nous voulons juste voir
en créant un index, notre requête devient
rapide ou non. Nous exécutons donc à nouveau cette même fonction de
recherche d'utilisateur et
exécutons ce fichier. Vous voyez, ici, nous avons
133 millisecondes. Laissez-moi exécuter ce
fichier une fois de plus. Tu vois, maintenant ça ne prend que
76 millisecondes. Je dispose de ce temps
parce que dans mon système, nombreux
logiciels volumineux sont
actuellement en cours d'exécution Auparavant, lorsque je goûtais
cela sans aucun logiciel, cela prenait 60
millisecondes avant ajouter l'index et
après l'ajout de l'index, cela ne prenait que Est presque 15 ng plus rapide
que sans requête d'index. C'est vraiment intéressant. De plus, nous obtenons le temps de requête en millisecondes
car actuellement notre application s'exécute
localement et notre
base de données est également Si nous déployons les deux
éléments sur Internet, les 130 millisecondes peuvent devenir 1,3 seconde avec l'index, nous exécutons la même
requête en Imaginez la rapidité de notre site
Web , c'est pourquoi l'
indexation est très utile Permettez-moi de vous montrer l'index
que nous avons créé. Ouvrez la boussole Mongo Divi, on passe aux index Dab Vous voyez, nous avons ici deux index. Le premier est pour l'identifiant de soulignement, et le second pour le courrier électronique Ainsi, dans la collection Mongo Di B, Mongo DB crée toujours un index
pour les fichiers contenant un identifiant de soulignement. C'est pourquoi, lorsque
nous recherchons des données par leur identifiant, nous obtenons ces Maintenant, en bas, nous avons une autre fonction
appelée indice de largeur. Dans cette fonction, nous créons d'
abord un index manuellement en utilisant cette ligne, puis nous écrivons une requête fine. À la fin de la requête, j'utilise cette méthode expliquée. La méthode explain vous aide à
analyser la manière dont Mongo
DB exécute une requête Il indique si
Mongo DB utilise un index ou effectue
une analyse complète de la collection Dans cette explication, nous transmettons les statistiques d'exécution des chaînes et déconnectons simplement ces utilisateurs Voyons ce qu'il y a
là-dedans. Ici, à la place de la fonction utilisateur
fine, nous ajoutons la fonction d'index B et permettez-moi simplement de la déplacer
en bas. Les modifications et jetez-y un coup d'œil. Exécutons cette
application en utilisant node,
tasting indexes point js Ici, nous obtenons tous les détails sur la requête, tels que les statistiques
d'exécution, les commandes, les
informations sur le serveur, etc. Ici, nous avons juste besoin de
voir les statistiques d'exécution. Ici, nous pouvons voir
et revenir à un, ce qui signifie qu'une donnée
est renvoyée par la requête si nous voyons le
nombre total de documents examinés, ce qui en est également un. Si nous ne
créons pas ici d'index
pour le champ e-mail,
le nombre total de documents examinés sera beaucoup
plus élevé que cela Permettez-moi de vous le montrer également. Ici, nous n'avons pas de fonction d'
index. Tout d'abord, dans cette fonction, je supprime tous les index de
notre collection d'utilisateurs, puis nous exécutons la même
requête avec la méthode expliquée. Ne vous inquiétez pas dans notre
véritable application de nœud, nous n'utiliserons la méthode d'index
point userschema lorsque nous définirons le schéma
de la collection J'ai ajouté ces deux
méthodes pour simplement supprimer et ajouter un index à
l'aide de la fonction. Appelons maintenant cela sans fonction d'
index et transmettons
ici le même e-mail. Encore une fois, exécutez ce fichier, node testing indexes point js Regardez ici, dans les états
d'exécution, le nombre revient à un et le nombre total de documents
examinés à 100 000. C'est pourquoi cela prend
plus de temps qu'avec l'index. Auparavant, si nous
vérifiions avec un index, nous obtenions un total de documents
examinés à un, et c'est pourquoi en
créant un index, notre requête devient rapide. Maintenant, vous pourriez vous demander comment, grâce aux index, notre requête
devient aussi rapide ? Que se passe-t-il ici ? Nous verrons cela dans
la prochaine leçon.
89. Comment fonctionnent les index dans MongoDB: Donc, auparavant, nous avons un problème. Notre requête de base analyse les cent
mille documents un par un pour trouver e-mail
spécifique,
ce qui ralentit notre requête. Et nous résolvons ce
problème en
appliquant simplement un index pour les e-mails remplis. Mais la principale question est de savoir comment ? Que se passe-t-il dans les
coulisses lorsque nous appliquons un indice ? Laissez-moi vous expliquer à l'aide d'un exemple
intéressant. Imaginez que vous êtes dans une
bibliothèque contenant 100 000 livres. Maintenant, vous devez trouver
un livre intitulé Harry Potter. Maintenant, si les livres ne sont pas
classés dans un ordre quelconque, vous devez commencer
par le premier livre, vérifier chaque titre
un par un et continuer ce processus jusqu'à ce que
vous trouviez le livre Harry Potter. Cela revient à numériser
les 100 000 documents de Mongo Di B sans index, ce que nous pouvons
considérer comme lent Supposons maintenant que la bibliothèque
crée un index, quelque chose comme la liste pour
stocker les informations sur les livres. Cette liste, ou nous pouvons
dire que dans cet index, nous avons des titres de livres, que nous avons triés par ordre alphabétique, et nous ajoutons également un pointeur vers le nom exact ou l'endroit
où le livre est placé Maintenant, lorsque vous
recherchez Harry Potter, vous accédez à l'index, trouvez Harry Potter en quelques secondes car il est
trié par ordre alphabétique, puis avec le titre du livre, nous ajoutons le pointeur Vous utilisez ce pointeur pour accéder
directement au livre. Au lieu de numériser
100 000 livres, vous trouvez votre livre en une milliseconde
seulement Dans Mongo DB,
lorsque nous créons un index,
Mongo Di B crée également une structure
arborescente, que nous
appelons arbre B ou arbre équilibré, et
raccourcit nos données ordre croissant ou décroissant
selon que nous transmettons la valeur
comme un ou moins un Avec ce remplissage, c'est le
pointeur stocké qui indique l'emplacement
original du document. En créant un index, nous réduisons le nombre de documents
numérisés et, de ce fait, notre requête fine devient
f pour ce remplissage. Maintenant, vous pouvez vous demander pourquoi cela prend moins de temps que de
vérifier tous les
documents un par un en raison des données
abrégées.
Nous devons également trouver nos données prend moins de temps que de
vérifier tous les
documents un par un en raison vérifier tous les
documents un par un C'est vraiment
une excellente question. Laisse-moi t'expliquer
ça. En fait, supposons que si vous avez tableau
non trié et un tableau
court dans les deux, vous vouliez trouver l'élément 60 Alors, dans les deux tableaux,
nous n'avons pas besoin de scanner chaque nombre. Comment ce tableau
trié peut-il prendre moins de temps ? Comme nous l'avons vu précédemment, lorsque nous créons un index, Mongo B crée une structure arborescente de batterie
ou d'équilibre avec un pointeur attaché
à chaque donnée Mais dans cette batterie, Mongo Dib doit
également rechercher des données, et pour rechercher les données, Mongoi utilise une autre technique de
recherche, nous avons
appelée Ainsi, lorsque nous ne créons pas d'index, Mongo Db utilise une technique de
recherche linéaire, ce qui signifie que Mongo Db vérifie données une par une
pour tous les documents Et si nous créons un index, alors Mongo Dib utilise une technique de recherche
binaire Permettez-moi de
vous expliquer rapidement comment fonctionne la recherche
binaire afin que
vous puissiez mieux comprendre. Imaginez ici que nous ayons un
tableau abrégé de nombres dix, 20, 30, 200 Dans ce tableau, nous
voulons en trouver 60. Maintenant, il y a deux façons. Tout d'abord, on vérifie
que dix c'est 60, non, 20 non. 30, n° 40, non. 50, non. 60, oui. Ici, nous recherchons tous les
éléments un par un, ce qui est l'exemple
de la recherche linéaire. Maintenant, laissez-moi vous expliquer
ce qu'est la recherche binaire. Dans la recherche binaire, on
fait des jerms sur la moitié. Donc, au lieu
de cocher dix, 20, 30, nous passons directement à la
moitié de la liste, qui est 50 Ici, nous vérifions que 50 est
supérieur à 60 ou inférieur à 60. Oui, 50 est inférieur à 60, nous passons
donc au
côté droit de la liste. Maintenant, notre liste est de 50 à 100. Dans ce cas, nous
sautons à nouveau sur la moitié. Dites-moi sur quel
objet nous allons sauter. Bien, on saute sur 80. En cela, nous vérifions à nouveau 60 est supérieur à 80 ou
inférieur à. C'est inférieur à. Donc, si notre nombre est inférieur à, nous nous déplaçons vers la gauche. Maintenant 50-70, nous
sautons à nouveau sur la moitié, qui est 60, et nous
obtenons l'élément Donc, au lieu d'obtenir 60 atomes sur six
en recherche linéaire
, nous en obtenons 60 trois ou quatre atomes.
C'est vraiment rapide. Qu'est-ce que tu en dis ? Et
ce ne sont que dix données. Imaginez que nous ayons 1 million de données, alors combien de temps nous
pouvons économiser en utilisant l'index. C'est pourquoi l'index
rend notre recherche plus efficace et prend moins de
temps que la recherche linéaire. Notez également que la recherche binaire ne
fonctionne que sur un tableau trié, et c'est pourquoi, lorsque
nous créons un index,
nous indiquons s'il
doit s'agir d'un tableau ascendant ou d'
un tableau descendant un ou moins Vous
comprenez maintenant bien ce qu'est un index et pourquoi il
fonctionne très rapidement. Maintenant, cela signifie-t-il que nous
devons créer un index pour chaque champ de notre
base de données ? La réponse est non. Nous devons créer un index
uniquement pour les remplissages
que nous voulons rechercher. Supposons que nous ayons des données sur les utilisateurs et que nous voulions rechercher
les utilisateurs par leur nom. En cela, nous pouvons créer un
index avec un nom rempli. Donc, Mongotbcmmand,
n'utilisez l'index que pour les grandes collections dans lesquelles nous
allons stocker des milliers
ou des millions Vous vous demandez peut-être pourquoi
nous ne pouvons pas créer index pour une petite collection
ou pour chaque champ. La raison en est que lorsque nous
créons un index, comme nous le savons, Mongotb crée une structure Btree, mais Bitr est également
stocké dans notre base de données,
ce qui Mongotb crée une structure Btree,
mais Bitr est également
stocké dans notre base de données,
ce qui nécessite de l'espace. Laisse-moi te montrer.
Ouvrez la boussole Mongoib et accédez à notre base de données Vous voyez, nous avons ici la collection
des utilisateurs. Voici la
taille de stockage de notre collection, qui est de 6,65 B sur
le côté droit, C, taille totale des index
est de 3,86 B,
ce qui signifie que nos données ne sont que de trois Mo et que 3,86 B
restants sont simplement Plus de 50 % sont donc
acquis par des indices, ce qui est vraiment énorme, et il ne s'agit que de deux indices Si nous créons un index
pour tous les champs, combien
cela
prendra de notre stockage. De plus, lorsque nous avons de
petites
collections, notre recherche linéaire
sera également rapide. La différence est
ignorable et c'est pourquoi nous ne créons pas d'index
pour les petites collections Lorsque nous devons
appliquer un index, d'abord, lorsque nous avons de grandes collections, indexation permet d'utiliser des ensembles de données
tels que des millions d'enregistrements Sans index, Mongo Di B vérifie chaque document un par un Deuxièmement, lorsque les recherches
sont fréquentes. Si nous recherchons souvent
un remplissage tel qu'un e-mail, nom
d'utilisateur, un numéro de commande, nous pouvons l'indexer. Par exemple, dans le système de journalisation des
utilisateurs dans lequel nous recherchons un
utilisateur par e-mail. Cela augmente considérablement la
vitesse de lecture. Ensuite, troisièmement, lorsque le
court-circuit est courant. Si nous utilisons souvent la
méthode abrégée par prix, nous pouvons indexer
ce prix plein. Par exemple, dans la liste des produits de
commerce électronique. L'heure, nous voulons raccourcir les
produits par prix ou par date. Index : évitez le scan complet
de la collection. Numéro quatre, lorsque nous utilisons les méthodes de remplissage ,
de recherche, de mise à jour
et de suppression. L'index accélère
ces opérations. Voyons maintenant également quand nous
n'avons pas besoin d'appliquer l'index. Premièrement, lorsque notre
collection est petite. Si nous n'avons que quelques
centaines de documents, la recherche sans
index est déjà rapide. Deuxièmement, nos données sont
en constante évolution. Indexes ralentit, insère, méthode Indexes ralentit, insère,
met à jour et supprime, car Mongo Di B doit mettre
à jour l'
arbre d' index Par exemple, un système de journalisation. Dans ce cas, de nouveaux journaux sont
ajoutés chaque seconde, et cela ralentira si
nous créons un index pour la journalisation. Troisièmement, lorsque nous
avons déjà trop d'index, chaque index utilise du stockage, trop d'index équivaut
à de l'espace disque investi. La solution est donc d'indexer uniquement
les remplissages les plus importants. Quatrièmement, lorsque nous interrogeons de nombreux remplissages différents, nous devons éviter les index Donc, si nos recherches varient
beaucoup en fonction de champs tels que le nom, l'
adresse e-mail, l'âge, la ville, l'indexation, chacune d'entre elles risque de ne pas nous aider La solution est donc d'
indexer uniquement les remplissages fréquemment utilisés. Donc, pour récapituler rapidement, nous créons un index dans Mongodi B
lorsque nous avons une grande collection Nous voulons que notre
requête soit très rapide. Ne vous inquiétez pas, nous appliquerons ces index dans notre
projet lorsque nous en aurons besoin Maintenant, à partir de la section suivante, nous allons commencer à créer
notre deuxième projet, qui est le backend d'une
application de commerce électronique
90. Section 09 - Projet 02 et planification: Il est temps de créer
notre deuxième projet. Dans ce projet, nous allons
créer l' application de commerce électronique Ben. Nous ne créerons pas de front-end car ce n'est pas
le but de ce cours. Pour cela, j'ai un cours Reac JS
séparé. Maintenant, lorsque je commence un nouveau projet, j'aime le
planifier grossièrement. Cela me donnera de la clarté, et je
vous recommande également de faire de même. Donc, tout d'abord, nous devons visualiser le front-end de base, pas le design parfait,
simplement le visualiser. Par exemple, nous
créons ici une application de commerce électronique. Sur ce site Web, l'utilisateur peut créer un compte ou
se connecter au site Web. Ensuite, ils
peuvent voir la liste des produits et lorsqu'ils
cliquent sur ce produit, ils peuvent voir tous les détails
sur ce produit, plus d'images et une description. Peu importe que l'utilisateur
soit connecté ou non. Tous les utilisateurs peuvent voir les produits. Après cela, l'utilisateur peut voir l'historique de
ses commandes. Ils peuvent également ajouter un
produit à la carte, retirer le produit de la carte et passer la commande par paiement. Voici donc les fonctionnalités dont
nous avons besoin pour notre projet. Ne vous inquiétez pas si vous ne
connaissez pas toutes les fonctionnalités
de votre projet, comme je vous l'ai dit, c'
est juste prévu. À l'avenir, nous pourrons ajouter ou supprimer des fonctionnalités
de notre application. Nous allons donc d'abord
commencer par créer
l'API de création du modèle utilisateur
pour l'authentification des utilisateurs. Ensuite, nous
passerons aux produits, puis aux cartes, puis aux commandes. Vous allez adorer cela
et vous aurez également la confiance nécessaire pour
ne créer aucun projet par vous-même. Commençons ce projet
incroyable.
91. Créer un nouveau serveur: Maintenant, dans notre dossier de projets, créons un nouveau dossier pour notre deuxième
projet de commerce électronique appelé
cart Wish Backend et ouvrons cart Wish Backend et simplement ce
projet dans le code VS Bien. Maintenant, lorsque nous créons un nouveau projet,
que devons-nous faire ? C'est vrai. Nous allons initialiser
le projet à l'aide de NPM int Y. Cela créera un
package, des points et un fichier Ici, nous créons un nouveau
fichier appelé index point js. Créons un serveur Express
pour cette application. Const Express est égal au package Express
requis. Ensuite, nous
créons l'application Express, l'application Const est égale à, et nous appelons ici cette fonction
Express Maintenant, écoutons ce serveur, donc app point LISN ici, nous passons d'
abord le port, mais au lieu de
transmettre la valeur codée en dur, nous créons ici la variable
const port égale à process point nv point
Port Donc, si nous avons un port
dans l'environnement, il utilisera le
reste, nous en avons 3 000, et nous passerons simplement par le
port d'ici. Et ce que nous allons transmettre
au deuxième paramètre, passer ici la fonction de rappel
et simplement consol point log Le serveur écoute sur le port, les paquets
dollar Ci, le port. Maintenant, lançons cette
application et vérifions que nous l'avons
fait correctement ou non. Pourquoi je pense que nous pourrions
obtenir une erreur ? Voyons voir, l'erreur dans la vie des
développeurs est constante. Ne t'en fais pas peur. Ouvrez le terminal et exécutez
ici nodebn index point js. Vous voyez, ici nous avons une erreur. Oh, nous avons oublié d'installer le package
Express. NPM installe donc Express. Et si vous voulez utiliser
la même version que la mienne, écrivez au taux
5,1 0,0 et appuyez sur Entrée. Bien. Maintenant, nous allons réessayer. Vous voyez, ici, le
serveur écoute. Dans la leçon suivante,
nous allons connecter cette application
à la base de données.
92. Connexion à la base de données ase: Connectons cette application à une base de données car nous
devons stocker des informations sur
les utilisateurs, les produits, etc. Tout d'abord, dans notre projet, nous devons installer des mangues Nous ne répéterons pas
la même erreur. Ouvrez le terminal et créez
un nouveau terminal à partir d'ici. De cette façon, nous n'avons pas besoin
d'arrêter notre application. NPM installe donc Mongoose
à la version rouge 8.13 0.2. Bien. Minimisons cela. Maintenant, dans notre fichier index point s, nous importons const mangos, c'est
égal à require Et après cette application, nous écrivons Mongos point connect Au premier argument, nous transmettons notre chaîne de connexion. Si vous ne vous souvenez pas de la chaîne de
connexion de Mongo Di B, vous pouvez l'obtenir à partir
du Mongo DB Compass Ici, dans la barre latérale, nous avons cette connexion
hôte locale, et sur le côté droit, nous
avons l' option à trois points. Ici, nous obtenons Copy
Connection String. Et collez-le en
première position. Maintenant, à la fin de cette chaîne de
connexion, nous ajoutons le nom de notre base de données, qui est Card fish. Maintenant, comme nous le savons, cette
expression renvoie une promesse. Nous utilisons donc ici la méthode point TN et à l'intérieur de celle-ci, nous utilisons simplement le journal des points de
la console. MongoDB s'est correctement connecté. Maintenant, après cette méthode, nous ajoutons également la
méthode de cache de points pour gérer les erreurs. Ici, nous obtenons
un objet d'erreur, une fonction d'erreur et un journal à points gonsol, connexion
MongoDB a échoué,
et nous imprimons cet objet d'erreur Maintenant, testons cette
implémentation, enregistrons les modifications, et dans le terminal, voyons,
ici, et dans le terminal, voyons,
ici, la base de données Mongo
est correctement connectée Dans la leçon suivante, nous allons
concevoir notre modèle utilisateur.
93. Exercice - Création d'un modèle utilisateur: Permettez-moi de vous faire un peu d'exercice car nous l'avons
déjà fait. Vous devez donc créer un
modèle utilisateur pour ce projet. Vous devez décider quels utilisateurs nous voulons
remplir pour ce projet. Ne vous inquiétez pas si vous ajoutez
plus ou moins de remplissages, mais l'important est penser aux remplissages. N'oubliez donc pas quelles sont les
fonctionnalités liées aux utilisateurs
et, en fonction de cela,
décidez du remplissage par l'utilisateur. Définissez un schéma pour ces remplissages ,
puis créez un modèle
avec ce schéma. Après avoir terminé cet exercice, vous pouvez voir la solution. Voyons maintenant la solution. Tout d'abord, nous
allons créer ici un nouveau dossier appelé models. Et dans ce dossier, nous allons créer un nouveau fichier
appelé users point js. Bien. Ici, tout d'abord, nous importons des Const Mongos
équivalant aux mangues requises. Parce que sans mangues,
comment créer un schéma ou un modèle ? Le schéma utilisateur des coûts est égal
au nouveau schéma de points mangos. Entre crochets Cali, nous transmettrons notre schéma
en paire clé-valeur Tout d'abord, le nom de l'objet, nous avons défini son type sur chaîne, obligatoire pour dessiner, et nous avons
défini la longueur moyenne sur trois. Après cela, nous pouvons définir le champ
Emil et définir
son type sur chaîne,
également requis sur
true, nous avons également besoin unique sur true car tous les utilisateurs ne doivent avoir
qu'un seul e-mail unique Et pour les meilleures pratiques, nous ajouterons également des
minuscules à true Après cela, quel
champ nous pouvons ajouter, oui, nous pouvons ajouter un mot de passe, type à une chaîne, et nous
devons également exiger que ce soit vrai. Ensuite, pour les utilisateurs du commerce électronique, nous avons besoin d'une adresse
de livraison pour livrer le produit. Donc, tapez la chaîne
requise sur true, et nous fixons également la
longueur moyenne à cinq. Ensuite, nous pouvons spécifier
le rôle de chaque utilisateur, qu'il
soit utilisateur ou administrateur. Nous avons donc défini son type sur string. Nous ne pouvons restreindre le champ de rôle que de deux options en utilisant la propriété
Enum pour créer un tableau Ici, nous transmettons nos
valeurs user ou admin. Nous pouvons également définir sa valeur
par défaut sur user. Si nous voulons changer
le rôle en administrateur, nous devons
accéder à la base de données. Par défaut, le
rôle de tous les utilisateurs est défini sur utilisateur uniquement. Je pense que ce sont à peu près
tous les champs du modèle utilisateur. Si à l'avenir, nous avons besoin de
plus de fonctionnalités, nous pouvons également
modifier le schéma. Ne t'inquiète pas pour ça. De plus,
si pendant l'exercice, vous donnez
des noms différents à ces remplissages, vous pouvez
les modifier, comme le mien. Sinon, cela pourrait vous
donner un bogue à l'avenir. Maintenant que le schéma utilisateur est prêt, nous pouvons créer un modèle à
l'aide de ce schéma. Const user est donc égal
au modèle à points de Mongo et à ce que nous passons en première
position Bien, nous passons le nom singulier du modèle qui est user. Au deuxième argument, nous transmettons le schéma utilisateur. Exportons également
ce modèle utilisateur. Nous en aurons besoin pour
le trajet de l'utilisateur. Le module dot exports
est égal à user. Parfait. Dans la leçon suivante, nous allons créer le premier itinéraire de ce projet pour
créer un nouvel utilisateur.
94. Créer un nouvel utilisateur: Créons maintenant une API
pour créer un nouvel utilisateur. Ici, nous créons un nouveau
dossier appelé routes. Dans ce dossier, nous allons créer tous nos itinéraires dans des fichiers
séparés. Créez un nouveau fichier users dot js. Maintenant, vous souvenez-vous comment créer une API dans un fichier séparé ? Si nous devons créer une API dans
notre fichier d'index principal point js, nous pouvons utiliser
cette variable d'application. Mais comment créer une
API dans un fichier séparé ? Bien, nous allons créer un
routeur pour cela. Donc, d'abord, nous saisissons que Express est
égal à Express requis. Après cela, cet express dispose d'une méthode de routeur
que nous pouvons appeler. Cela nous donnera un routeur. Stockez-le sur un routeur invariable. Bien. Créons maintenant une API
pour créer un nouvel utilisateur. Quelle méthode nous pouvons utiliser ici, get ou put, nous
utiliserons la méthode post. Router a donc reçu un message. Ici, nous écrivons notre point de terminaison, qui est une barre oblique, et après ce point de terminaison, nous ajouterons une fonction de rappel, qui s'exécutera lorsque quelqu'un
appellera l'API avec ce Cette fonction comporte deux
paramètres : demande et réponse, et fonction
d'erreur. Maintenant, tout d'abord,
dans cette fonction, nous voulons des valeurs que l'utilisateur
transmet dans le corps de la requête. Les données utilisateur const sont donc
égales au corps du point de demande. Const enregistre
ces données utilisateur par points. Ensuite, il suffit de
ResponsDTSN ou nous pouvons utiliser ici le point de réponse JSON car
nous envoyons des données JSN,
qui sont ces données qui sont Voyons maintenant si notre API est correctement
définie ou non. J'aime faire de petits pas car cela ne
créera pas de confusion. Cela fonctionne, alors nous
pouvons passer à la logique principale. Actuellement, nous définissons l'API ici, mais nous devons ajouter cette route
dans notre fichier index point js. Dans le cas contraire, cela ne fonctionnera pas. Nous le savons bien.
Exportons donc ce routeur en utilisant module point exports
is equal to Router. Enregistrez ce fichier et rendez-vous
dans le fichier d'index point js. Ici, après la connexion
Mongo DV, nous pouvons ajouter l'application point U et
à la première position, nous ajouterons notre préfixe d'API,
slash API slash user, et à la deuxième position, nous devons passer le routeur, que
nous exportons des Donc, en haut, nous
ajoutons le coût des itinéraires des utilisateurs c'est égal aux périodes requises
ici. Ici, nous allons dans le
dossier routes et à l'intérieur duquel
se trouve la route des utilisateurs. Maintenant, nous pouvons simplement suivre itinéraire de
cet utilisateur ici.
Nous l'avons déjà fait. N'oubliez pas, et ne vous inquiétez pas si vous ne vous
souvenez pas de la syntaxe, elle est parfaitement correcte. J'ai également
oublié la syntaxe à de nombreuses reprises. Pour le moment, concentrez-vous sur
le développement de l'application. Enregistrez les modifications et
testons cette API utilisateur. Donc, sur Tender
Client , nous pouvons voir notre activité
précédente, mais je ne veux pas mélanger les choses
avec le projet précédent, nous passons aux collections
et, du côté droit,
nous avons l' option nouvelle collection
et nous lui donnons le nom Cartwis Nous ajouterons tous nos
goûts en matière d'API à cette collection. Sur le côté droit, nous
avons plus d'options. Cliquez sur Créer un nouveau dossier
et donnez-lui le nom des utilisateurs. Donc, dans ce dossier d'utilisateurs, nous allons enregistrer tous nos
goûts d'API liés à l'utilisateur. Vous pouvez voir à quel point cela semble
systématique, et si à l'avenir, nous visitons ce projet, nous ne nous y tromperons pas. Nous créons donc une nouvelle demande
et lui donnons un nom. Créez un nouvel utilisateur. Sélectionnez la méthode à publier, et nous entrons notre
URL d'API qui est DTP,
Column Abo forward slash
Local host, Column 3,000, ou tout autre élément que vous utilisez
comme utilisateur de l'API de port N'oubliez pas d'ajouter ce préfixe. Pour envoyer des données dans le
corps de la demande, nous sélectionnons votre corps et nous transmettrons les données ici
au format JSON. Objet, nom du premier champ, assurez-vous d'écrire
en double code. De la valeur au code plas Ensuite, nous avons un e-mail pour coder
sur le gmail.com rouge Après cela, quel remplissage nous ajouterons, permettez-moi de vérifier
le schéma de l'utilisateur. Oui, nous avons le mot de passe
et le statut de livraison et les deux sont obligatoires. Mot de passe, et en chaîne,
un, deux, trois, 45678 et adresse de livraison, disons XYZ,
à XYZ Assurez-vous que nous utilisons le même nom complet que celui que
nous avons utilisé dans le schéma. Sinon, nous obtenons une erreur. Maintenant, envoyons cette demande. Qu'est-ce que tu en penses ?
Cela fonctionnera-t-il ou non ? Voyons voir. Envoyez la demande. voyez, ici, nous obtenons le statut 200, ce qui signifie OK,
mais nous n'obtenons pas nos données dans
la réponse à cette demande. Examinons la console A. Vous
voyez aussi que nous ne sommes pas définis Pouvez-vous deviner pourquoi
cela se reproduit ? N'oubliez pas que lorsque nous voulons
obtenir des données à partir d'une
demande du corps, nous devons utiliser un
intergiciel pour
convertir les données en Maintenant, vous vous souvenez que dans le fichier index point js,
avant cette route, nous ajoutons app point ug pour
ajouter un intergiciel et nous passons simplement ici
express Nous obtiendrons ainsi des données à la demande de l'organisme.
Vérifiez si les modifications sont apportées. Envoyons à nouveau la demande. Vous voyez, maintenant que nous obtenons
les données de la réponse, notre implémentation actuelle
fonctionne. Sauvegardons maintenant ces données
dans la collection de nos utilisateurs. Mais avant d'enregistrer les données
dans la collection de l'utilisateur, nous devons vérifier
si cet utilisateur existe déjà dans
notre base de données ou non. Ne vous y trompez pas, regardez ceci
et vos lots seront effacés. Ici, nous avons besoin d'un modèle utilisateur
pour exécuter la requête. Le coût par utilisateur est égal à l'exigence. Ici, nous devons accéder
à un dossier
, point, point, barre oblique, modèles
et nous passons au modèle utilisateur Maintenant, après ces données utilisateur, nous pouvons faire quelque chose comme
ce point utilisateur Fine. Ici, nous passons objet pour filtre. Ici, nous trouverons l'utilisateur par son adresse e-mail
unique et, pour plus de valeur, nous transmettons ici userdata point email Nous trouvons donc un utilisateur, dont l'e-mail est le même que
cet e-mail userdata point En outre, voici une chose. Si aucun utilisateur n'a même
e-mail que
cet e-mail userdata point, cette méthode de recherche
renverra un tableau vide Donc, au lieu de cette méthode de recherche, nous pouvons utiliser ici la méthode Find one. Si l'utilisateur n'existe pas, cette méthode find one
renverra undefined, ce qui nous aidera à
écrire la condition Nous allons donc utiliser ici la méthode
Find one. Comme nous le savons, cette expression
renverra une promesse, nous devons
donc attendre ici, et pour utiliser await, nous devons faire de cette fonction de
Cavey Bien. Maintenant, stockons le résultat dans la
variable appelée user. Maintenant, vous pouvez simplement
mettre ici la condition. Si l'utilisateur est disponible, nous renverrons
une erreur dans la réponse. Donc, répondez au statut Dodge à 400 pour une mauvaise demande et aussi dans la réponse,
vous voulez envoyer des données, donc point Json, et
ici nous passons l'objet avec le message que l'utilisateur existe
déjà. Maintenant, voici une chose. Si
l'utilisateur est déjà disponible, nous ne voulons pas exécuter
cette logique inférieure. Pour ce faire, nous devons passer ici retour avant ce point de
réponse Status. Dans le cas contraire, il
exécutera le code. Que faire si l'utilisateur n'est pas disponible
dans la collection de l'utilisateur ? Bien sûr, nous stockerons les données de
l'utilisateur dans la collection. Donc const new user est
égal à new user, et ici dans l'objet, nous transmettons nos données Donc, nom vers nom de point de données utilisateur et e-mail vers adresse e-mail de point de données d'utilisateur Attendez, ici nous devons écrire les données
utilisateur plusieurs fois. Au lieu de cela, nous pouvons
déstructurer notre objet ici. Ainsi, à la place des données utilisateur, nous ajoutons un objet et transmettons nom
de remplissage que nous obtenons
à partir du corps du point de demande. C'est ce que l'on appelle la déstructuration
d'objets. Nous avons donc le nom, l'e-mail, le mot de passe et la dernière adresse
de livraison. Assurez-vous d'écrire ici le même nom complet que celui que nous avons
transmis dans le corps du point de la demande. Maintenant, à la place du nom du point
userdata, nous ne pouvons écrire que le nom De plus, si le nom de la propriété et nom
d'une variable de valeur sont identiques,
nous pouvons le supprimer. Mais pour votre compréhension, je ne vais pas le supprimer. E-mail à e-mail, mot de passe à mot de passe et
adresse de livraison à adresse de livraison. De plus, nous devons changer ici
la méthode fine, d'e-mail à e-mail. Nous avons maintenant un nouvel objet utilisateur, nous pouvons
donc l'enregistrer
dans notre base de données, new user point c, et voici l'opération Async C'est pourquoi nous adhérons et attendons. Maintenant, cela renverra l'utilisateur
enregistré depuis la base de données. Si nous ne voulons pas renvoyer
les données utilisateur stockées, nous pouvons également utiliser
ces nouvelles données utilisateur. Ne vous inquiétez pas, nous obtenons un
identifiant dans les deux objets. Donc, en bas, nous appliquons le statut des points de
réponse.
Dites-moi le code de statut que nous
utiliserons pour les nouvelles données. vrai, nous utilisons 201 points Json, et ici nous passons un
nouvel objet utilisateur. Parfait Nous allons maintenant tester
cette implémentation. Enregistrez les modifications et
envoyons la demande de publication. Vous voyez, ici, nous avons un nouvel
utilisateur avec son identifiant unique. Et si nous consultons notre base de données, actualisons la base de
données, nous obtenons Cardwish À l'intérieur, nous avons des utilisateurs, et ici nous avons notre premier utilisateur. Et si nous envoyons la même
demande avec les mêmes informations utilisateur ? voyez, ici, l'utilisateur existe
déjà avec une erreur, 400 mauvaises demandes.
95. Le hachage du mot de passe pour des raisons de sécurité: Actuellement, dans nos données d'utilisation, nous stockons le mot de passe
dans une chaîne simple. Mais que se passe-t-il si quelqu'un
accède à notre base de données, alors tout le monde peut voir les mots de passe réels de
l'utilisateur. Pour résoudre ce problème, nous pouvons avoir le mot de passe dans
une chaîne aléatoire, ce qui le rend illisible Pour hacher le mot de passe, nous utilisons une
bibliothèque très populaire appelée BCrypt NPM installe BCRP. Ne t'inquiète pas pour ça.
C'est vraiment simple. Nous comprendrons le
hachage du mot de passe dans un fichier séparé, et à la fin, nous l'
ajouterons au parcours de notre utilisateur Ici, nous créons un nouveau fichier
appelé points de passe. Bien. Maintenant, tout d'abord,
nous importons const, Bcrypt est égal
à require Bcrpt Maintenant, Bcrpt est particulièrement fort
parce qu'il avait du SLD. Vous vous demandez peut-être ce qui est vendu ? SALT est une donnée
aléatoire supplémentaire ajoutée à un
mot de passe avant qu'il ne l'ait. Laissez-moi vous expliquer
en termes simples. Supposons que nous ayons deux utilisateurs, l'utilisateur A et l'utilisateur B, qui choisissent
tous les deux le mot de passe. Disons un, deux,
trois, quatre, cinq. Supposons maintenant que notre package BrP possède ce mot de passe qui
pourrait ressembler à ceci Si nous n'avons qu'un, deux, trois, quatre, cinq,
sans aucun sel, l'utilisateur A
et l'utilisateur B ont un mot de passe. Regardez la même chose dans la base de données. C'est un problème car cela signifie
que ces deux utilisateurs
ont le même mot de passe. Si les pirates informatiques voient le même mot de passe
HEED, ils peuvent deviner que les deux utilisateurs ont le
même mot de passe simple. Nous avons donc besoin de SLT pour
résoudre ce problème. SALT n'est rien,
juste une donnée aléatoire, ajoutée à un mot de passe
avant qu'il ne le signe. Donc, avant UseraPassword,
nous ajoutons des données aléatoires,
donc le mot de passe ressemble Pour le mot de passe de l'utilisateur B, nous ajoutons des données aléatoires ou vendues. Donc, le mot de passe ressemble à ceci. Ce n'est pas nécessaire, Bcrypt
conserve le même mot de passe. Je te montre juste
pour te faire comprendre. Laissez-moi vous le montrer de
façon pratique. Ici, nous pouvons utiliser crypt point et cette fonction à
l'exception de deux arguments premier est le mot de passe
d'origine, qui est le mot de passe
saisi par l'utilisateur. Par exemple, nous
passons ici un, deux, trois, quatre, cinq, et le deuxième
argument est vendu. Cela permet de contrôler le coût du hachage. Une valeur élevée signifie plus
de sécurité mais un chauffage plus lent. Habituellement, une valeur de dix est considérée comme sûre
et relativement rapide. Maintenant, au troisième paramètre, vous voyez, nous
devons passer la fonction de
rappel car il s'agit d'une opération
asynchrone Mais au lieu d'utiliser le callback, nous pouvons utiliser here awight
au début Pour utiliser un poids, nous devons écrire
cette expression avec une fonction de synchronisation appelée passe. Et nous déplaçons simplement cette
ligne dans cette fonction. Maintenant, stockez cet invariable appelé st pass et enregistrez simplement ce st pass par
point sur la console Maintenant, appelons cette même
fonction deux fois pour
voir si le mot de passe est similaire
ou si SALT fonctionne. Ouvrez le terminal et
exécutez simplement node spass point js. Tu vois, ici nous avons deux mots de passe ST
différents. Même si nous passons le même
mot de passe un, deux, trois, quatre, cinq, pour un, c'est
la puissance du SLT. Implémentons ce code
dans l'itinéraire de notre utilisateur. Coupez cette ligne à partir d'ici et collez-la avant
notre nouvelle variable utilisateur. Apportons maintenant quelques
petits changements ici. Tout d'abord, nous changeons ce mot de passe codé en dur
un, deux, trois, 45 avec notre mot de passe, que nous obtenons
dans le corps de la demande. Cela générera un
mot de passe pour cet utilisateur. Au lieu d'enregistrement du mot
de passe d'origine, nous enregistrons ce premier mot de passe. De plus, nous devons importer
Bcrt en haut. Const Bcrypt est égal
à require BCR. Saisissez les modifications
et jetez-y un coup d'œil. Dans notre base de données, nous avons
utilisé les données sans hachage. Nous pouvons donc supprimer cet enregistrement
d'ici, le supprimer. Exécutons maintenant notre application
en utilisant l'index normon dot js. Bien. Encore une fois, envoyez la demande de publication
avec les mêmes données. Vous voyez, maintenant nous avons avec succès le mot de passe et nous l'
avons enregistré dans notre base de données. Même si quelqu'un entre
dans notre base de données, il ne peut pas voir le
mot de passe tel quel.
96. Validation de l'entrée utilisateur à l'aide de Joi: Maintenant, notre
itinéraire utilisateur fonctionne correctement. L'utilisateur Web est déjà
enregistré ou non, et nous utilisons également le mot de passe, mais il existe une règle pour
les développeurs de Bend. En tant que développeur de Bend, nous jamais confiance aux données
envoyées par le client. Nous devons toujours
valider ces données. Supposons qu'à l'endroit du nom, le mot passe
client, la propriété du nom d'utilisateur. De plus, ils ont parfois oublié d'envoyer un e-mail ou même un mot de passe. À l'heure actuelle, nous ne pouvons pas stocker la moitié des informations
dans notre base de données. Maintenant, vous pourriez dire que nous avons déjà configuré la validation dans notre schéma. Si nous devons ajouter
une validation supplémentaire,
oui, c'est souvent une
bonne idée d'ajouter plusieurs couches de validation au-delà de ce qui est
configuré dans le schéma. Nous allons effectuer la
validation des données du backend dans cette leçon. Il s'agit
d'un autre niveau de validation. Si Acker contourne d'une manière ou d'une autre
cette couche de validation, nous avons déjà une
validation dans le schéma qui empêchera l'
entrée de données invalides dans notre base de données. Ici, nous avons deux options. Peut être effectué manuellement ou nous pouvons utiliser un
package très populaire appelé Joy. Nous avons également d'autres validateurs
comme Express validator, Yup et validator Tu peux utiliser ce que
tu veux. J'adore Joy parce qu'il est
polyvalent et facile à utiliser et qu'il s'intègre bien
à de nombreux frameworks nodejs, en particulier Express point Laisse-moi te montrer ça.
Ouvrez le terminal et écrivez NPM, installez Joy ethert
17.13 0.3. Bien. Maintenant, utiliser la joie est très simple. Tout d'abord, nous allons
importer de la joie dans ce dossier. Donc, la joie constante avec J
équivaut à exiger de la joie. Vous savez déjà
pourquoi nous écrivons ici J car ce
package Joy renvoie une classe. Maintenant, avec joie, nous devons définir schéma pour les données du corps de la demande. Dans ce schéma de joie,
faites beaucoup de choses, comme nous l'avons fait
dans le schéma utilisateur. Nous définissons ici
une nouvelle variable appelée schéma
utilisateur ou créons un schéma
utilisateur égale à, et ici nous passons Joy point
Object et à l'intérieur de celui-ci, nous passons notre objet de schéma. Dans cet objet, nous transmettons nos
champs avec le schéma Joy. Quel est le type de
propriétés ? Est-ce obligatoire ? Quelle est la valeur moyenne, la valeur
maximale ou la longueur moyenne de la
chaîne de tri, et
bien plus encore Tout d'abord, nous avons besoin de
name to joy ici, nous pouvons spécifier le type
de champ qui est une chaîne. Assurez-vous d'appeler
cette fonction ici. Maintenant, nous pouvons également ajouter ici un
moyen à trois caractères, et nous voulons également que ce champ
soit rempli comme obligatoire. Il existe de nombreuses méthodes, Joy. Vous pouvez voir toutes les méthodes en
utilisant sa documentation. Ensuite, nous avons ici une chaîne de points email
fill joy. Maintenant, pour Email Joy, nous avons une méthode de courrier électronique, valide également le courrier électronique et épingle ce formulaire si nécessaire. Ensuite, nous avons un mot de passe pour Joy point string point Min
26 lettres de mot de passe, et nous en avons également besoin. Dernière volonté, nous voulons valider
son adresse de livraison à joy point point Min to
Pi et obligatoire. Bien. Nous avons ici ce schéma
Joy. Maintenant, nous voulons appliquer ce schéma aux données que nous obtenons dans le corps de
ce point de requête. C'est pourquoi nous écrivons le même nom de champ que celui que nous
transmettons dans le corps du point de la demande. Pour valider les données à l'aide de Joy, nous devons utiliser cette méthode de validation par
points du schéma des utilisateurs
créatifs . À l'intérieur de celui-ci, nous devons
transmettre les données que nous voulons valider et celles que nous voulons
valider, le corps du point de demande. Maintenant, cela renverra
l'objet que nous stockons dans la variable appelée validation
Joe. Laissez-moi vous montrer ce que nous obtenons dans cette variable de
validation Joy. Je commente ce code inférieur et je valide simplement le corps de
ce point de demande ici et je renvoie simplement le
point de réponse json, validation Joy. Dites ceci en JS et jetez un œil. Envoyez la demande de publication. Voyez ici que nos données sont validées. C'est pourquoi nous remplissons
la valeur. Si je supprime ce mot de passe du corps du point de demande
et que je l'envoie à nouveau. voyez, ici, nous obtenons un objet d'erreur et nous avons
ces détails, qui est un tableau, et nous obtenons un message d'erreur. Le mot de passe est obligatoire. En utilisant cet objet d'erreur, nous pouvons renvoyer une erreur
dans notre réponse. Ne vous y trompez pas.
Laisse-moi te montrer ça. Supprimez cette méthode JSN par
points de réponse. Nous n'en avons pas besoin et nous
écrivons simplement ici je conditionne et vérifions si une
erreur de validation Joy est disponible, puis nous renvoyons simplement
une erreur dans la réponse. Renvoie le statut du point de réponse, 400 pour le point de demande incorrect Json, et nous renvoyons ici Joy
validation point error Object. Maintenant, comme bonne pratique, les développeurs ne transmettent pas l'objet
d'erreur complet à partir d'ici. Ils aiment envoyer
uniquement un message d'erreur. Nous ajoutons des points, c'
est-à-dire le tableau, et nous
accédons à son premier élément
par des crochets, message à
zéro point d'index.
Testons cela, envoyons la demande sans
mot de passe renseigné. Vous voyez, ici, le mot
de passe est requis. Si nous transmettons le mot de passe
rempli à nouveau, annulez, mais dans le nom, nous ne passons que deux caractères. Et envoyez la demande. Vous voyez, nous avons ici un
beau message d'erreur. Le nom doit comporter au moins
trois caractères. Lors de la validation du schéma Mongo, nous ne recevons pas ce type
de message d'erreur, et c'est pourquoi
les développeurs aiment Joy Maintenant, j'ai une question. Si nous ne passons pas ici, deux
échouent, ce que nous obtiendrons. Supprimez donc ces deux premiers
remplissages. Envoyez la demande. Vous voyez, ici nous n'avons qu'une seule erreur. Joey exécute la validation
ligne par ligne. Si la première ligne n'est
pas validée, elle
renverra immédiatement une erreur. C'est pourquoi nous renvoyons toujours les détails du premier
élément à points. C'est ainsi que nous validons les données
d'entrée que nous obtenons
du corps de la demande. Vous pouvez supprimer le commentaire
d'un autre code. Dieu. Pour récapituler rapidement, il existe trois niveaux de
validation dans le monde réel, validation côté
client, les développeurs
frontaux
effectuent sur le navigateur Les utilisateurs peuvent le voir
sur le formulaire frontal. Ensuite, nous avons la validation
côté Bacon
, que nous
venons de faire avec joy. Dans ce cadre, nous validons les données, que nous recevons du
front end dans le corps du point de demande Ensuite, nous avons le schéma Mongo, qui est la validation finale Empêchera la
saisie de données non valides dans la base de données. Si quelqu'un réussit la validation
côté client, alors nous avons une validation
côté wagon, et si quelqu'un la passe également, alors le schéma Mangus
est toujours là L'ajout de ces couches constitue une approche robuste
pour
empêcher l'entrée de données invalides dans notre base de données et garantit une application sécurisée et
fiable. Maintenant, vous pouvez voir que nous
travaillons en tant que professionnels. Dans la leçon suivante, nous verrons comment
fonctionne
l'authentification des utilisateurs dans le monde réel.
97. Comment fonctionne l'authentification: Parlons maintenant de l'
authentification des utilisateurs dans node js. L'authentification des utilisateurs joue un rôle
très important
dans n'importe quelle application. Dans nodejs, nous effectuons l'
authentification en utilisant JWT, ou nous pouvons le dire Maintenant, vous pourriez vous demander, qu'est-ce que
ce JWT ou JSN WebTken ? Ne t'inquiète pas pour ça.
C'est vraiment simple. Le jeton Web JSON est une longue chaîne de jetons
qui ressemble à ceci. En utilisant ce jeton, que nous allons générer
dans le back-end, nous pouvons
authentifier l'utilisateur. Permettez-moi de vous expliquer
par exemple comment fonctionne
l'authentification avant
JWT et comment elle fonctionne maintenant Voici une Harley à laquelle il se connecte avec ses informations de compte, son
e-mail et son mot de passe Maintenant, notre serveur
vérifie d'abord les informations, et si elles sont vraies
, le serveur renvoie
son ID utilisateur en réponse et l'enregistre
dans la session ou ooki Maintenant, chaque fois qu'il envoie des
demandes pour des informations
sécurisées, disons, toutes ses informations
bancaires. Ainsi, le serveur
demande d'abord l'ID utilisateur, et s'il a un ID utilisateur, puis le serveur envoie
les informations sécurisées. Mais voici un gros problème, le SSN ou cookie dans lequel
nous stockons notre identifiant d'utilisateur peut être facilement
modifié dans le navigateur Supposons que je change cet
identifiant d'utilisateur en un autre identifiant d'utilisateur, puis que nous obtenions les informations
sur cet utilisateur. Cette approche n'est pas sécurisée. Maintenant, pour résoudre ce problème, nous introduisons le jeton Web JSN Maintenant, Harley se connecte à nouveau avec
son e-mail et son mot de passe. Maintenant, notre serveur
vérifie d'abord les informations, et si elles sont vraies, serveur renvoie le jeton unique crypté
depuis longtemps en réponse et le stocke
dans le stockage local. Maintenant, l'avantage de
ce jeton est qu'il est créé avec détails
d'utilisation et une clé secrète que nous sommes les seuls à
définir sur le serveur. Personne ne connaît la clé secrète
sauf vous et votre équipe. Ainsi, chaque fois que Harley
envoie
une demande d'informations sécurisées,
nous demandons d'abord le
jeton JWT sur le serveur et le vérifions à l'
aide de notre clé secrète Si elles sont vérifiées, ensuite ces informations
sécurisées depuis le serveur enverrons ensuite ces informations
sécurisées depuis le serveur. Et si nous changeons quoi que ce soit
dans les informations utilisateur, notre jeton changera également. En tant que développeur de Bend, notre travail consiste à envoyer un
jeton Web JSN lorsque les utilisateurs
s'inscrivent ou se connectent et à vérifier
le jeton lorsque nous en avons besoin Le stockage du jeton dans
le stockage local et tout le reste relève
du travail du développeur frontal. Définissez une somme, lorsque les utilisateurs se connectent ou s'enregistrent
avec succès, nous envoyons un jeton Web JSON, qui fonctionne simplement
comme une carte de sécurité. Lorsque l'utilisateur demande des données accessibles uniquement
par un utilisateur connecté, serveur vérifie
d'abord
la carte de sécurité, qui est notre jeton Web JSON, et valide avec
la clé secrète JWT Ce jeton est vérifié, ce
n'est qu'alors que le serveur renvoie les données à cet
utilisateur. C'est aussi simple que ça. Dans la leçon suivante,
nous allons générer un jeton
Web JCN et l'envoyer
en réponse
98. Générer le jeton JWT pour l'utilisateur: Nous comprenons donc le jeton Web JN. C'est comme une carte de sécurité. Générons maintenant un jeton
lorsque l'utilisateur s'est
enregistré avec succès et envoyons un
jeton dans la réponse. Donc, pour générer un jeton Web JSN, nous avons besoin d'un package
de jeton Web JSN, ouvrir le terminal et d'écrire NPM, installer le jeton Web JSN Et si vous voulez installer
la même version que la mienne, écrivez au taux
9.0 0.2 et appuyez sur Enter Bien. Maintenant, dans le
fichier de notre utilisateur en haut, nous importons ce
package à l'aide de require et le stockons simplement dans
une variable appelée JWT Maintenant, lorsque nous voulons
créer ce jeton, au tout début
ou enfin, nous voulons créer un jeton lorsque nos données utilisateur sont stockées
avec succès. Après cette même méthode, nous écrivons JWT point Sign
In dans la méthode sign, nous devons passer deux arguments Dans un premier temps, nous devons transmettre les données que nous voulons
envoyer dans le jeton. Pour l'instant, nous voulons simplement
envoyer un identifiant utilisateur avec notre jeton. Objet et première propriété, soulignement à l'identifiant de soulignement
nwuser Assurez-vous d'écrire
ici, soulignez l'ID. J'ai déjà commis cette erreur. Je souhaite également envoyer
la propriété name de ce nom d'utilisateur à l'utilisateur point N.
Maintenant, au deuxième argument, nous devons passer une chaîne, qui est notre clé de sécurité Pour l'instant, nous passons
GWT, clé de sécurité. Nous pouvons transmettre n'importe quelle chaîne. Il n'y a aucune règle pour la clé. De plus, actuellement, nous
transmettons directement cette clé. Mais dans la leçon suivante,
nous l'ajouterons dans la variable d'environnement.
Ne t'inquiète pas pour ça. Maintenant, cela va générer un jeton Web
JSN, stockons
donc dans
une variable appelée jeton Simplement sur le lieu d'
envoi des nouvelles données utilisateur, nous ne transmettons que des jetons. Laissez-moi vous montrer à quoi ressemble
ce jeton. Enregistrez les modifications et,
depuis le client Thunder, nous envoyons les nouvelles données utilisateur, écrivons le nom complet et modifions l'e-mail en code one@gmail.com. Assurez-vous d'ajouter la virgule
et d'envoyer la demande. voyez, nous obtenons ici
ce long jeton, que nous venons de générer. Maintenant, laissez-moi vous en montrer
plus sur ce jeton. Copiez donc ce jeton JWT. Assurez-vous de ne pas copier
ces codes doubles. Ouvrez un onglet dans votre navigateur
et recherchez jwt point II. Et voici la
documentation officielle de JWT. Ici, dans les bibliothèques, vous pouvez voir l'
implémentation de JWT pour
différentes bibliothèques Revenez maintenant à la page principale
et faites défiler la page vers le bas jusqu'à la
section Debugger Et ici, nous pouvons
décoder notre jeton. Voyons maintenant
ce que contient le jeton. Donc, après notre jeton. Maintenant, tous les jetons GWT
sont divisés en trois parties. La première partie concerne l'en-tête, qui est de couleur rouge. La deuxième partie concerne la charge utile, qui est en violet, et la dernière et la plus importante
partie est la signature, qui est en bleu Maintenant, cet en-tête contient l'
algorithme et le type de jeton, ce qui est très courant.
Concentrez-vous là-dessus. Ensuite, cette charge utile contient les données que nous voulons
transmettre avec le jeton Dans ce cas, nous transmettons un ID
utilisateur et utilisons un nom, qui est cet objet
dans cette méthode de signature. La raison pour laquelle nous
transmettons ces données ici est
que nous pouvons les afficher sur notre interface
sans appeler une API distincte. Ensuite, nous avons
une autre propriété It, qui signifie émis à et sa valeur est l'heure à laquelle
notre jeton est généré. Cela nous permet de
connaître l'âge de notre jeton. La dernière partie, qui est
en bleu, est la signature, et elle est générée en
fonction de notre en-tête, ces données utiles et la clé secrète qui n'est
disponible que sur notre serveur Cela empêchera donc les utilisateurs d'obtenir leur propre jeton
, puis de le modifier avec un identifiant pour se
faire passer pour quelqu'un d'autre. Parce que si vous modifiez quoi que ce soit
dans cette charge utile ou cet en-tête, la signature
se régénérera n'ont donc aucune chance de utilisateurs n'ont donc aucune chance de faire quelque chose de contraire à l'éthique Ce n'est que par cette clé secrète que
notre jeton sera validé. Sinon, cela nous
donnera une erreur. C'est pourquoi JWT est si populaire. Pour résumer rapidement, lorsque les utilisateurs se connectent ou s'enregistrent avec succès, nous obtenons un jeton Web JCN qui fonctionne
simplement comme une carte de sécurité Lorsque l'utilisateur demande des données accessibles uniquement aux
utilisateurs de LogN, serveur vérifie d'abord
la carte de sécurité, qui est notre jeton Web JCN et la valide avec la clé secrète
JWT Les deux sont vérifiés,
puis le serveur renvoie les données à cet
utilisateur, aussi simples que définies.
99. Régler l'expiration du jeton: Comme
bonne pratique, de nombreux développeurs
fixent une date d'expiration pour
ce jeton Web JSON, exemple 2 heures ou 24 heures. Passé ce délai, ce
jeton ne sera plus valide. Si l'utilisateur veut un nouveau jeton, il doit se reconnecter. Pour cela, nous pouvons passer troisième argument de
cette méthode JWT Sign, Object, et dans lequel nous avons une
propriété appelée expires in Nous pouvons transmettre des valeurs
en millisecondes, si nous voulons définir 2 heures, puis écrire deux pendant 2 heures dans 60 minutes parce que 1 heure
contient 60 minutes, 60 parce que 1 minute
correspond à
60 secondes et en 1 000 pour convertir les secondes en millisecondes
. Vous pouvez voir que c'est un
peu confus. Nous pouvons donc également passer
ici en chaîne à bord
, soit 2 heures. Ou nous pouvons écrire ici
un jour pour un jour. Comme tu veux. Une valeur numérique est interprétée comme un nombre de
millisecondes Si vous utilisez une chaîne, assurez-vous de fournir les unités de temps telles que les
jours, les heures, etc. Sinon, l'
unité en millisecondes est utilisée par défaut. Donc, si nous ne passons
ici que 120 en chaîne, cela équivaut à
120 millisecondes J'aime définir 2 heures, donc deux avantages, ce délai
d'expiration dépend vraiment de
votre application. Vous remarquerez peut-être que dans les applications
bancaires, votre identifiant a expiré
au tout dernier moment, entre cinq et dix minutes. Ensuite, vous
devez vous reconnecter. La raison pour laquelle ils utilisent le délai
d'expiration pour jeton est qu'ils
souhaitent sécuriser leur application. autre côté, de nombreux sites de réseaux
sociaux fixent le délai d'expiration à
30 ou 60 jours. Une fois que vous êtes connecté, ils
n'expirent pas votre jeton car ils souhaitent que nous utilisions
davantage leurs réseaux sociaux. Le délai d'expiration
dépend de votre projet. Choisissez le mieux adapté
à votre application. Assurez-vous simplement de ne pas être
ennuyé par ExpiryT.
100. Sécurisez la clé de sécurité dans Enviroment: Actuellement, nous transmettons notre clé
secrète JWT directement ici. Mais dans le monde réel,
cela n'est pas sécurisé car lorsque nous déployons notre
application sur Internet, nous téléchargeons également notre code sur un cloud tel que
Github ou Gitlab Si nous écrivons notre
clé secrète dans ce code, tout le monde peut voir notre clé secrète, ce qui n'est pas sécurisé. Ainsi, au lieu de
définir la clé secrète ici, nous pouvons l'éditer dans le fichier point ENV Dans ce projet, nous n'avons pas
créé de fichier ENV à points. Créez
ici un nouveau fichier appelé point ENV. Dans ce fichier, nous définissons
simplement une variable appelée
clé de soulignement JWT égale à, ici nous allons écrire notre clé,
qui est la clé de sécurité JWT De plus, de nombreux développeurs
préfèrent utiliser un nom de clé
aléatoire afin que personne ne puisse
prédire la clé de sécurité. Vous pouvez utiliser n'importe quelle clé de sécurité, uniquement pour conserver la sauvegarde
de cette clé de sécurité. Maintenant, pour accéder à cette variable clé de
soulignement JWT dans notre projet, nous devons configurer Dot NV et le package que
nous utilisons pour cela. Nous avons besoin du package DotNV, d'
ouvrir le terminal et simplement
d'installer Dot ENV ouvrir le terminal et simplement
d'installer Dot ENV Bien. Maintenant, dans le fichier index point
js tout en haut, nous ajoutons require point NV et nous
appelons ici la méthode point config Enregistrez ce fichier, et dans l'itinéraire de l'utilisateur ici à la place de cette chaîne de
code en dur, nous ajoutons un point de processus à notre nom de variable, qui est JWT underscore Et c'est fait. Maintenant, si nous devons
réutiliser cette clé, nous n'avons pas besoin d'écrire
la clé d'origine. Nous pouvons écrire le point de processus E
et un point de soulignement JWT. Dans la leçon suivante, nous
allons créer une route de connexion dans laquelle nous allons nous authentifier,
envoyer un e-mail et un mot de passe
101. Exercice Créer un parcours de connexion: Il est maintenant temps de faire un
peu d'exercice. Vous devez créer une
nouvelle API pour la connexion Il doit
donc s'agir d'une demande de
publication avec une barre oblique de connexion à l'API du point de
terminaison Et dans le corps de cette demande, l'utilisateur peut transmettre deux propriétés, e-mail et son mot de passe. Donc, tout d'abord, dans cette API, vous devez trouver
l'utilisateur par e-mail. Si vous ne trouvez pas d'utilisateur, vous
devez envoyer une erreur en réponse avec un message d'identification
non valide, et si l'utilisateur est disponible, vous
devez
comparer le mot de passe. Juste ces deux étapes. Ne vous inquiétez pas de
comparer le mot de passe, quittez l'exercice
à partir de là. Définissez simplement une nouvelle API et
trouvez l'utilisateur avec son e-mail. Après avoir terminé l'exercice, vous pouvez regarder la solution. J'espère donc que vous
résoudrez cet exercice ou du moins que
vous essayerez de le résoudre. Donnez-vous le mérite pour cela. Voyons maintenant la solution. Tout d'abord, en bas, nous définissons une nouvelle API à
l'aide du routeur point post. Ici, en première position, nous passons Endpoint Slash Login À la deuxième position, nous passons la fonction de rappel
avec deux paramètres,
requête et réponse, et nous
adhérons à la fonction de flèche Maintenant, laissez-moi vous montrer mon truc pour écrire du code sans confusion J'aime écrire les étapes en commande. Par exemple, ici, la première étape
consiste à rechercher un utilisateur dans la
base de données par e-mail. Si nous avons trouvé un utilisateur, comparez
ensuite le mot de passe
crypté. Si le mot de passe correspond, nous créons un jeton Web JSON
et l'envoyons en réponse. De cette façon, nous obtenons le
chemin clair pour écrire le code. Première étape, nous devons
trouver l'utilisateur par e-mail. Pour cela, nous devons obtenir des données à
partir du corps du point de demande. Les données de coût sont égales
au corps du point de la demande. Ou nous pouvons également déstructurer
notre objet ici. Ainsi, à la place des données, nous ajoutons un objet et nous accédons à
nos propriétés, à notre
e-mail et à notre mot de passe. Maintenant, en utilisant cet
e-mail, nous trouvons un utilisateur. Const user est donc égal à ici, nous devons
attendre user point Ici, nous passons
un objet de
comparaison et nous
comparons les e-mails remplis
avec notre variable e-mail, comme nous l'avons fait précédemment Ici, nous obtenons une
erreur d'exécution lors de l'utilisation d'un poids. Nous devons rendre notre
fonction asynchrone. Bien. Maintenant, nous pouvons
vérifier l'état. Si l'utilisateur n'est pas défini, nous renvoyons ici une erreur. réponse 401
pour les informations d'identification non valides, et nous envoyons également objet
GSN avec des informations d'identification non valides pour la
propriété du message Et si l'utilisateur est trouvé ? Oui, nous devons
vérifier que le mot de
passe est erroné ou non, mais
voici une chose Nous stockons le mot de passe utilisateur
dans un format crypté. Nous ne pouvons pas le comparer directement à
un simple mot de passe sous forme de chaîne. Nous devons donc à nouveau
utiliser le package crypt. Donc, crypt dot compare la première position,
nous passons le mot de passe, que nous obtenons à partir du corps du point de
requête, et après cela, nous devons
transmettre un mot de passe, nous avons stocké dans la base de données Donc, mot de passe utilisateur point. Maintenant, cette expression prend
à nouveau peu de temps, nous pouvons
donc attendre ici et simplement stocker le résultat dans un mot de passe valide
variable. Nous pouvons à nouveau passer la condition
si un mot de passe valide
n'est pas disponible et nous
renvoyons la même erreur
avec le même message d'erreur. Je colle cette ligne ici. Vous vous demandez peut-être pourquoi nous
envoyons le même message d'erreur ? C'est parce que pour des raisons
de sécurité, si nous indiquons que le
mot de passe ne correspond pas, cela signifie que nous avons trouvé utilisateur et que le mot de passe ne
correspond pas. C'est pourquoi les développeurs
envoient ce type de message d'erreur avec des informations d'identification
non valides. Maintenant, si le mot de passe
correspond, nous devons
créer un nouveau jeton. Je copie le code depuis l'API d'enregistrement et je
le colle dans notre API de connexion. Juste pour faire de petits changements. Ici, dans les données, nous devons transmettre l'identifiant du point de
soulignement de l'utilisateur et le nom du point d'utilisateur À la fin, nous envoyons simplement le point de
réponse Json à ce jeton. Bien. Dégustons maintenant
cette implémentation. Accédez donc au client Thunder et
dans la collection de l'utilisateur, créez une nouvelle demande
et donnez-lui un nom, connectez-vous à un utilisateur. Changez la méthode pour publier, et l'URL en STP, appelez une double
barre oblique Localhost
3,000 slash API slash users slash Login Et dans le corps, on passe
Object avec email fill. Ici, nous transmettons un e-mail, dont nous n'avons pas créé le
code 12 athergmil.com Passez également le mot de passe 12345678
et envoyez la demande. Vous voyez, ici, nous recevons
un message d'erreur, des informations d'identification non valides. Maintenant, si nous écrivons un e-mail valide transmettons le mauvais mot de passe
et que nous envoyons la demande, vous
voyez, nous obtenons toujours
la même erreur. Maintenant, si nous transmettons un e-mail écrivons un mot de passe et
envoyons la demande, voyez, nous obtenons maintenant un jeton Web JSON. C'est ainsi que nous créons l'API de connexion. Nous devons simplement trouver un utilisateur, comparer son mot de passe
avec le package BCR S'il correspond, nous générons alors JSN WebTken et l'envoyons en
réponse, c'est aussi simple Maintenant, avant d'aller de l'avant
, nous
copions et collons littéralement
le code permettant de générer
le jeton Web JSON Il suffit de modifier ces données. Il est préférable de créer une fonction distincte pour
générer le jeton, puis de l'
utiliser dans les deux API. Donc, en bas, nous créons
une nouvelle fonction appelée generate token is equal
to arrow function. Maintenant, à partir de cette fonction, nous voulons simplement renvoyer un jeton. Copiez cette
méthode JWT point Sine et collez-la ici. Maintenant, ici, nous voulons simplement
transmettre des données différentes. Nous remplaçons cet objet de
données par une variable de données et nous obtenons ces
données à partir du paramètre. De plus, si vous souhaitez définir une heure d'expiration du jeton
différente, vous pouvez également passer
un paramètre pour cela. Pour l'instant, nous ne voulons pas que
2 heures soient acceptables pour les deux. Maintenant, dans l'API de connexion, nous avons obtenu cet objet de données, que nous transmettons dans la méthode JWT point sign
et que nous appelons simplement here, générons une fonction jeton et générons une fonction jeton et
transmettons le même
objet de données en argument Bien. Maintenant, nous
faisons la même chose dans l'API d'enregistrement, coupons l'objet de données, et ici nous appelons generate pour confonctionner et nous passons
ici cet objet de données Grâce à cette implémentation, notre
code semble plus organisé.
102. Comment authentifier un utilisateur ? Connecté ou pas ?: Ainsi, dans la leçon précédente, nous voyons qu'après l'inscription et la connexion, nous générons un jeton JWT et l'
envoyons dans la réponse Maintenant, laissez-moi
vous dire ce que le front-end va faire avec ce jeton. Ainsi, lorsque nous envoyons un jeton JWT
du back-end au
front-end, le front-end
stocke ce jeton dans le stockage local du
navigateur ou dans la session Ainsi, le front end saura que
l'utilisateur est connecté ou non. Lorsque l'utilisateur souhaite
accéder à des données sécurisées, auxquelles seul l'utilisateur connecté accède
, front end doit envoyer ce
jeton avec l'appel d'API. Il existe donc de nombreuses façons d'
envoyer un jeton avec l'appel d'API. Mais le plus souvent, le front-end envoie un jeton dans la demande, en
particulier dans
l'en-tête d'autorisation. Si votre front end
utilise une autre méthode, il
contactera le backend pour l' implémenter de cette façon Le front-end a donc défini le jeton
dans l'en-tête d'autorisation. Et lorsque l'utilisateur souhaite
accéder à une API protégée, laquelle seul un utilisateur verrouillé accède
, dans le back-end, quel jeton est vérifié ou non. S'il est vérifié, nous autorisons l'utilisateur
à accéder à cette API, et si le jeton n'est pas vérifié, nous
renvoyons une erreur
avec le code d'état 401,
jeton d'autorisation requis. Maintenant, où écrivons-nous cette logique ? Et créez un intergiciel, en particulier pour vérifier le jeton, et nous pourrons ajouter ce middleware
pour Laissez-moi vous le montrer de
façon pratique. Ainsi, dans notre projet de
définition d'un intergiciel, nous créons un nouveau dossier
appelé middleware, et à l'intérieur de ce dossier, nous créons un nouveau fichier
appelé Maintenant, vous souvenez-vous de
ce middleware ? intergiciel est une fonction
qui appelle la fonction intergicielle suivante ou envoie une réponse à Nous définissons donc ici
une fonction appelée Orth middleware et AV know
for express middleware, nous obtenons trois paramètres : la réponse à la
demande Orth middleware et AV know
for express middleware,
nous obtenons trois paramètres : la réponse à la
demande et la fonction d'erreur suivante. Maintenant, tout d'abord, nous
devons obtenir l'en-tête d'autorisation, l'en-tête Seconoth est égal
à l'autorisation par point d'en-tête de demande Assurez-vous d'écrire correctement
l'orthographe
des propriétés. Sinon, nous n'
obtiendrons pas l'en-tête ici. Enregistrons
cet en-tête d'authentification par points sur console pour
voir simplement ce que nous obtenons
dans cette variable À l'avenir, nous pourrons
supprimer cette console. De plus, dans le monde réel, nous obtenons cet en-tête Youth
sous cette forme dans la chaîne, nous obtenons d'abord un espace d'erreur, puis nous obtenons un jeton JWT complet La raison pour laquelle nous obtenons cette
erreur est qu'il s'agit norme d'authentification
courante garantit que le serveur traite correctement
le jeton. Maintenant, avant de vérifier le jeton, nous devons vérifier si nous obtenons un jeton ou non dans cet en-tête. Nous respectons si condition, si l'en-tête O n'est pas disponible, ou si nous respectons une autre condition, deux en-têtes
commencent par ici dans la chaîne, nous passons l'espace porteur Si cette condition n'est pas vraie, nous renvoyons une erreur. Assurez-vous d'ajouter ici la valeur « faux ». Maintenant, à l'intérieur de celui-ci, nous renvoyons point de
réponse 401 pour le point de
demande non autorisé Jason, et ici nous envoyons un objet avec propriété du
message,
l'autorisation, le jeton requis. Assurez-vous d'envoyer l'objet avec la même propriété
pour chaque erreur. Cela facilitera la
gestion des erreurs sur le front-end. Maintenant, qu'en est-il des deux en-têtes ? Comme nous le savons, l'en-tête Oh est
une chaîne avec un préfixe, support, un espace, puis Nous devons donc obtenir un jeton à
partir de cette chaîne. C'est vraiment simple. Le jeton Const est égal
aux deux en-têtes. Ici, nous utilisons la méthode de division, et d'où nous voulons nous
séparer directement de l'espace. Nous passons donc des
codes doubles et de l'espace. Maintenant, cette méthode de division
renverra un tableau comme celui-ci. Le premier élément est le porteur et le
second élément est notre jeton. Nous pouvons accéder au jeton
par l'index 1. Entre crochets, nous en écrivons un. Il ne reste plus qu'à vérifier que
ce jeton est valide ou non. Donc, pour cela, nous avons besoin du package
JWT en haut, nous écrivons que Cast JWT est égal
à requérir un jeton Web Json En bas, nous écrivons JWT point
verify this method à
l'exception de deux paramètres premier est un
jeton que nous voulons vérifier, c'
est-à-dire ce jeton. Au deuxième paramètre, nous devons ajouter la clé secrète
JWT, qui est process Env point
JWT, Maintenant, si notre jeton est
vérifié avec succès, nous obtenons
ici les données utilisateur
que nous envoyons avec le jeton. Nous pouvons le stocker dans une variable
appelée utilisateur décodé. Nous pouvons enregistrer ces données utilisateur car request point user est
égal à utilisateur décodé Si, dans un itinéraire protégé, nous voulons obtenir les données des utilisateurs actuellement
connectés, nous pouvons simplement y accéder en
utilisant request point user. Ne vous inquiétez pas, je vous le
montrerai également au fur et à mesure que nous
avancerons dans ce projet. Maintenant, après avoir défini les
données utilisateur dans request point user, nous ne voulons
rien faire avec cette méthode. Nous pouvons donc simplement appeler
la fonction suivante, que nous
appelons le prochain
intergiciel de la pile d'appels Si nous n'appelons pas
cette fonction suivante, express n'appellera pas la fonction API ni aucune autre fonction du
middleware Notre serveur
restera à ce stade, qui le rendra vraiment lent. Appelez toujours la fonction suivante à la fin de la fonction
middleware Maintenant, dans ce code, et si notre utilisateur n'
est pas vérifié ? Que se passe-t-il si l'utilisateur transmet un faux
jeton ou un jeton expiré ? Nous devons également gérer cela. cas d'erreur de gestion, nous
ajoutons ici le
blog try and catch et ajoutons simplement ces
trois lignes dans le blog Try. Si nous recevons une erreur dans
ces trois lignes, ce blog de capture sera lancé. Dans ce blog de capture,
nous pouvons simplement renvoyer une réponse avec le statut 400 pour le point de demande non valide
Json et What we pass here. Bien, nous passons ici l'objet
avec un message de propriété et le message d'erreur sera un jeton
non valide et c'est fait. Nous complétons le
middleware d'authentification. Goûtons également à ça. Tout d'abord, nous devons exporter cet orddalware pour utiliser ce
middleware Donc le module point Exports. Égal au middleware Auth. Enregistrez les modifications et
passez à l'itinéraire des utilisateurs. Ici, en bas, après la route de connexion, nous ajoutons la méthode Router point
Get et pointons uniquement sur la barre oblique Après cela, nous ajoutons une fonction de
rappel avec
demande et réponse Il s'agit de l'API normale. Mais comment pouvons-nous protéger
cette API, qui signifie que seuls
les utilisateurs verrouillés devraient accéder à
cette route d'API. Pour cela, nous devons ajouter un intergiciel avant cette
fonction de rappel En haut, nous importons le
middleware const. Vous pouvez également l'appeler OT,
c'est équivalent à requérir que nous options pour un
middleware OT plus complet Pour exécuter ce middleware avant
cette fonction de rappel d'API, nous devons l'ajouter ici avant
la Lorsque les utilisateurs envoient une
demande Get à ce point de terminaison, cette
fonction d'intergiciel Worth s'exécute d'
abord Dans ce middleware, quel jeton d'
action est valide ou non. Si elle est valide, ce n'est qu'alors que
nous appelons la fonction suivante, qui exécutera cette fonction de rappel de
l'API Si dans notre application, nous voulons créer une API protégée, il
suffit
d' ajouter
Omddalware avant cette fonction de rappel d'
API est aussi simple que ça. Pouvez-vous me dire comment pouvons-nous obtenir les données des utilisateurs
connectés ? Bien, nous obtenons les données des
utilisateurs connectés auprès de l'utilisateur
request point. Le coût par utilisateur est donc égal
à l'utilisateur par point de demande. Et ici, nous envoyons simplement cet utilisateur dans la méthode response
point json. Nous allons maintenant tester cette
implémentation. Enregistrez les modifications et
nous devons d'abord générer un jeton. Ouvrez le client Thunder
et accédez à l'API de connexion. Nous avons ici les données, nous pouvons
donc simplement envoyer
cette demande de connexion. Bien. Ici, nous obtenons le jeton. Assurez-vous de
générer le
jeton de lettres , car nous avons fixé un délai d'expiration de 2
heures. Copiez ce jeton, et
nous créons ici une nouvelle demande. Donnez-lui un nom, utilisateur connecté. Tout d'abord, nous écrivons le point de terminaison de l'
API, qui est HTP, Callan double forward
slash local host, 3 000 API Maintenant, envoyez cette demande. Vous voyez, nous avons ici l'erreur. Jeton d'autorisation
requis car nous ne l'avons pas transmis dans
l'en-tête d'autorisation. Donc, pour passer l'en-tête
d'autorisation, nous passons aux en-têtes. Nous ajoutons ici un nouvel en-tête,
clé d'autorisation. voyez, nous obtenons également une autorisation, et voici ce que nous allons faire passer. Oui, nous devons transmettre un
jeton, mais avec un préfixe, espace
d'erreur, et ici
nous avons transmis un jeton Assurez-vous de ne pas le
transmettre avec des codes doubles. Maintenant, envoyons la demande. voyez, ici, nous obtenons les données de connexion des
utilisateurs avec le nom d'identification, à qui est émis, c'est le moment
où ce jeton est généré et EXP est
le délai d'expiration, qui signifie quand ce
jeton expirera De plus, si nous vérifions notre terminal, une console est l'en-tête d'authentification Vous voyez, nous obtenons d'abord le préfixe du porteur, puis nous obtenons le jeton C'est ainsi que nous allons ajouter un intergiciel
d'authentification
pour protéger notre API Nous
n'obtenons donc ici que le nom d'utilisateur et l'ID. Envoyons toutes les
informations concernant l'utilisateur connecté. Donc, dans le parcours de l'utilisateur, nous ajoutons
ici Fine query, SConctUser est égal à
await user point find By ID Et ici, nous transmettons notre identifiant d'utilisateur, qui est request point
user point underscore ID Sélectionnez un point, et ici nous
ne voulons pas envoyer de mot de passe. Dans une chaîne moins le mot de passe, puis nous renvoyons le
point de réponse jacon à cet utilisateur Supprimez cette première
ligne d'utilisateur, nous n'en avons pas besoin. Nous devons également faire de
cette fonction un. Enregistrez les modifications et prenez-en une. Vous voyez, nous avons maintenant toutes les données des utilisateurs
connectés. Nous pouvons maintenant utiliser cette
route pour obtenir les informations complètes de l'utilisateur connecté
actuel. C'est ainsi que l'
utilisateur authentifié est connecté
ou non à l'aide de cette fonction
middleware du système d'exploitation
103. OAuth en détails: Dans les vidéos précédentes,
nous avons donc vu comment nous inscrivons et connectons les utilisateurs
à l'aide d'
un e-mail et d'un mot de passe, ce qui est très important. Mais de nos jours, vous avez
peut-être vu de nombreux sites Web offrir
des fonctionnalités supplémentaires, comme nous pouvons nous connecter avec Google, connecter avec Facebook, Twitter, connecter avec Github, et la liste s'allonge encore et encore
en fonction du type de site Web De nombreux utilisateurs aiment utiliser
ces méthodes pour signer. S'ils utilisent ces méthodes, ils n'ont pas besoin de
créer un nouveau mot de passe
pour un autre site Web
et de s'en souvenir. Ils utilisent simplement leur identifiant Google (
un identifiant social) et se
connectent à notre site Web. De plus, il est vraiment sécurisé. Il est donc très utile que nous
ajoutions également ces fonctionnalités dans notre
application. Mais avant de les ajouter, vous pourriez vous demander comment ces fonctionnalités
fonctionnent dans les coulisses. Voici donc l'architecture complète du processus de signature.
N'aie pas peur. Écoutez-le comme une histoire,
car dans notre vie quotidienne, nous utilisons déjà ces fonctionnalités. Supposons qu'il s'agisse d'un Hali qu'il ait utilisé un site Web appelé
Amazon ou Ebay Sur ce site Web, il a la
possibilité de
signer ou de s'inscrire avec Google. Si vous cliquez sur ce bouton,
celui-ci le redirige vers
la page de connexion de Google. Ici, il saisit son adresse e-mail
et son mot de passe Google et se connecte. S'il saisit un
e-mail et un mot de passe, quelque chose se passe sur la page
Web, et à la fin, il se connecte au site Web
Amazon ou eBay avec son nom d'utilisateur e-mail sans créer
le nouveau mot de passe. C'est vraiment incroyable. Maintenant, l'essentiel se
passe entre les deux. Laissez-moi vous raconter ce qui
s'est passé là-bas. Lorsque Harley entre, écrit un e-mail
et un mot de passe sur le
compte Google et clique sur Connexion, serveur
Google génère
un code temporaire et envoie ce
code temporaire à notre backend Maintenant, dans le backend, en
utilisant ce code, nous pouvons récupérer certains
détails d'utilisation auxquels nous
voulons accéder et les stocker
dans notre base de données, comme le nom de l'utilisateur, l' identifiant
e-mail, etc. Notre backend
contactera donc à nouveau le serveur de Google lui indiquer que nous voulons accéder aux données
d'utilisation au lieu de
ce code temporaire serveur Google vérifie donc le code et extrait les
données utilisateur de ce code. Ensuite, le serveur de Google envoie ces données d'utilisation
au backend Dans notre back-end, nous
avons ces données d'utilisation et nous pouvons les
utiliser comme bon nous semble. Par exemple, nous pouvons stocker le nom d'
utilisateur et l'adresse e-mail de l'utilisateur dans notre base de données
et générer un nouvel utilisateur, ou si l'e-mail de l'utilisateur est
déjà disponible, nous ne faisons rien et nous
redirigeons simplement l'utilisateur vers le
front-end avec un jeton. Maintenant, lorsque je
découvre cette architecture pour la première fois
, c'est le Oath ou nous pouvons
appeler autorisation ouverte. Pour le moment, j'ai une question et je suis sûr que vous avez
la même question. Pourquoi le serveur de Google envoie-t-il d'abord ce
code temporaire ou d'autorisation à notre backend Pourquoi ne peut-il pas envoyer directement
les informations utilisateur ? certaines raisons serveur de
Google envoie ce code
d'autorisation pour certaines raisons. Supposons que Google envoie directement informations
utilisateur, telles que des e-mails ou des données de profil,
au front-end, elles peuvent être bloquées ou
supprimées par des pirates informatiques, puis tempérées ou utilisées à mauvais escient avant
d'atteindre notre backend Le code temporaire agit également
comme une autorisation de mise en veille. Cela indique à Google que cet utilisateur s'est connecté et a
autorisé l'utilisation de notre application. Seul notre backend
doté d'une clé secrète peut étendre ce code
aux données réelles de l'utilisateur. Cette clé secrète nous est
donnée par Google, et elle ne sera
disponible que dans notre backend InvFle, de la même manière que notre clé secrète
JWT Pour des raisons de sécurité, Google envoie d'abord uniquement un code
temporaire ou un code d'autorisation. Voici le récapitulatif du fonctionnement
d'OAuth. L'utilisateur clique d'abord sur le bouton Google, se
connecte ou s'inscrit à l'aide bouton
Google, puis revient
à la page de connexion Google, ou nous pouvons dire serveur Google Maintenant, serveur Google,
vérifiez que l'e-mail et le
mot de passe sont corrects ou non. Si c'est le cas,
Google génère un code
d'autorisation et l'
envoie au backend backend envoie à nouveau le code
d'autorisation avec la clé secrète
au serveur Google, et le serveur Google extrait
les données de l'utilisateur telles que le nom, e-mail, le code de profil, etc. Maintenant, enfin, dans le back-end, nous pouvons stocker
ces données dans notre base de données, ou si l'utilisateur est déjà disponible, nous pouvons simplement
rediriger l'utilisateur vers accueil du
front end
avec JWT Token est aussi simple que ça.
Cette architecture fonctionnera donc pour tous les types de réseaux
sociaux, comme la
connexion avec Facebook, connexion avec Github,
Twitter, etc. Pas seulement pour Google. J'utilise ici Google comme exemple. Si nous avons besoin de Facebook, alors ce
serveur Google modifié par Facebook autorise et le serveur ou Github autorise Dans la leçon suivante,
nous allons
implémenter pratiquement ce serment dans
notre application Catwis
104. OAuth dans l'application Node - Signin avec Google: Implémentons la fonctionnalité de connexion avec Google dans
cette application. Et pour cela, nous avons besoin d'un
package appelé passpod point js. Ainsi, dans OT Architecture, lorsque l'utilisateur clique sur se connecter
avec Google Pattern, nous le redirigeons vers
Suppose un hôte local (colonne 3 000) ou une
page Google Il s'agit de notre
API principale. Comment peut-on le définir ? Nous voulons afficher la page de connexion
Google ou relier le serveur Google
à cette page. De plus, si sur le back-end, nous obtenons un code d'autorisation, comment pouvons-nous envoyer des demandes au serveur
Google et
récupérer les données des utilisateurs ? Oui, nous pouvons tout
faire manuellement, mais la bibliothèque Passport Js
rend les choses beaucoup plus faciles. Nous allons l'utiliser.
Ne vous y trompez pas. Consultez cette
leçon complète et vous découvrirez comment fonctionne cette
implémentation d'Oath. Nous allons donc sur la page passports.org. Ici, nous pouvons voir que Passport
est un intergiciel d'authentification pour No Jz, extrêmement flexible et modulaire Au bas de la page, nous trouvons toutes les
stratégies comme Facebook, Twitter, Google,
Github, etc. Ne vous inquiétez pas, allez simplement dans la barre
de recherche et recherchez ici, Google, et sélectionnez ce
passeport Google Oth two. Assurez-vous de ne pas
sélectionner ce serment 20. Nous utilisons Oth two. Ces deux stratégies sont très similaires, mais cette stratégie Oath 20
est plus ancienne. Il n'est pas vraiment
bien entretenu. Nous allons donc utiliser ce ou deux, qui ont de nouvelles fonctionnalités et sont activement maintenus
par Passport. Permettez-moi de zoomer un peu. Ouais. Donc, tout d'abord, nous devons installer ce package. Copiez donc cette commande
dans le code Vas, ouvrez le terminal, et
dans ce terminal, nous collons simplement la commande ici. Et pour la même version, vous pouvez écrire
au taux 0,2 0,0. De plus, nous avons besoin d'un
dossier de passeport au taux 0,7 0,0 et d'appuyer sur Entrée. Bien. Revenons maintenant à la documentation. Ici, ils nous donnent le code complet pour implémenter la stratégie Passport
with Google. Copiez tout ce code, et dans notre backend, nous pouvons coller ce code dans
notre fichier Gs à points d'index Mais Detw a foiré notre fichier
index point js, nous pouvons
donc stocker ce code
dans un fichier séparé Pour cela, nous créons un nouveau dossier appelé Config et à l'intérieur de celui-ci, créons un nouveau fichier, le point de
passeport JS et la page contenant le code qu'il contient. Pour l'instant, ne vous
inquiétez pas pour ce code. J'expliquerai ce code et nous apporterons également
quelques modifications ultérieurement. Revenons maintenant à la documentation,
faites défiler la page vers le bas, et nous pouvons voir ici qu'ils nous
proposent des API à ajouter
à notre application. première API est Auth Google et, au lieu de la fonction de
rappel, elle transmet la méthode d'
authentification par point passeport, et en première position, elle passe par Google, qui est
le serveur d'authentification,
et ensuite, elle transmet
l'étendue En gros, ils indiquent quelles données utilisateur nous
voulons obtenir du serveur. Nous voulons un e-mail et un profil, qui incluent de nombreux
détails sur l'utilisateur. Vous pouvez maintenant vous demander
ce que fera cette API. Lorsque l'utilisateur envoie une demande get depuis le navigateur sur ce point de terminaison Google Oth
slash, cette méthode d'
authentification par points de passeport ouvre la page de connexion Google Pour ajouter cette route
dans notre application, nous pouvons faire quelque chose comme ceci. Dans le dossier route, nous créons
un nouveau fichier auth point js. Création de routes distinctes
pour l'authentification. En cela, tout d'abord, nous avons besoin de Cost Express, c'est
équivalent à require Express. Pour ajouter un itinéraire, nous ajoutons le coût Le routeur est égal
à express point Router. Maintenant, à partir de la documentation, nous copions cette première route et la
collons dans la deuxième route. Toujours en haut, nous devons saisir le passeport car ici vous
utilisez un passeport. Le passeport Const équivaut
à un passeport exigé. Maintenant, à la place de cette application
point GAD, qu'utilisons-nous ? C'est vrai, nous utilisons le routeur point GAD. De plus, nous n'ajoutons pas cet OT. Nous mentionnerons
slash OT comme préfixe, même manière que nous définissons le
préfixe pour Maintenant, en bas, nous
devons exporter cet itinéraire. Le module dot exports
est donc égal au routeur. Enregistrez ceci et avant d'
oublier d'ajouter cette route dans le fichier index
point js, ajoutons-la. Après le
parcours de cet utilisateur, nous ajoutons app.us. Ici, nous ajoutons le préfixe API OT. Au deuxième paramètre, nous devons passer les routes Auth Nous saisissons donc le coût Os routes
est égal à require. Nous y voilà dans le dossier des routes OT. Maintenant, nous passons simplement ces autres itinéraires dans
cette application en bonne et due forme. Revenons maintenant au fichier auth point js. Ici, nous avons spécifié à l'utilisateur
Xs API Auth slash Google, cela devrait ouvrir la page de connexion
Google Maintenant, une fois que les utilisateurs
se sont connectés
avec succès, nous
devons également le spécifier. Rappelez-vous qu'auparavant, nous avions code de
stratégie dans le fichier JS du point de
passeport Comprenez ce code, et nous apporterons
également quelques
modifications à ce code. Tout d'abord,
nous avons besoin du passeport de la bibliothèque des passeports parce que
nous l'utilisons ici. SeconctPassport équivaut à un passeport requis et à
le modifier également en coût. Ensuite, nous avons Passport
point ug et à l'intérieur de celui-ci, nous avons une nouvelle stratégie Google, nous obtenons de Passport, de Google Author à Package Grâce à cette stratégie, nous n'avons pas
besoin d'écrire du code manuel pour récupérer le code d'autorisation et extraire les données
du serveur Google Cette stratégie fait
tout cela pour nous. Après cela, nous avons un
objet avec un tas de propriétés telles que l'
ID client et le secret du client. Vous obtiendrez cet identifiant lorsque vous enregistrerez votre application
auprès de la console Google, et avec celui-ci, nous
obtiendrons également le code secret du client. Sans ces deux remplissages, Google ne nous
communiquera pas les données des utilisateurs. Générons-le donc également. Encore une fois, je vous le dis, ne vous inquiétez pas pour ce code. Lorsque nous aurons terminé
cette implémentation, je vous montrerai le
flux de travail complet de ce code. Dans le navigateur, recherchez
Google Cloud Console. Ouvrez ce deuxième lien. Ici, nous devons nous connecter
avec notre compte Google. Vous pouvez utiliser n'importe quel compte. Maintenant, après la connexion,
cela ressemble à ceci. Ne vous inquiétez pas, allez simplement ici Sélectionnez un projet et créez un
nouveau projet. Donnez-lui un nom. Disons Card Wish
et cliquez sur Créer. Ici, dans la notification, il est en train de créer et de
sélectionner ce projet. Lorsque nous sélectionnons ce projet, nous pouvons le voir ici. Nous avons maintenant besoin d'API et de services. Cliquez sur ces trois lignes
et dans l'API et les services,
nous accédons à l'écran de contenu O OT. Fais simplement comme moi et
tu es prêt à partir. Cliquez sur ce bouton
Commencer. Ici, nous devons effectuer quelques réglages
de configuration. Tout d'abord, nous
devons écrire le nom de l'application. Encore une fois, nous écrivons Cartwish. Ensuite, sélectionnez votre
e-mail d'assistance et cliquez sur Enregistrer. Maintenant, nous
devons sélectionner le type d'audience, sélectionnez
ici externe. Ainsi, tout utilisateur peut se connecter à notre application
et cliquer sur Suivant. Ici, nous écrivons notre e-mail
sur lequel nous voulons recevoir une notification concernant cette application et cliquons enfin sur Suivant, conditions
précises, puis
continuons et créons l'application. Nous passons maintenant à l'accès aux données
depuis la barre latérale gauche. Ici, nous devons sélectionner
l'étendue des données utilisateur. Les champs d'application expriment l'autorisation que vous demandez
aux utilisateurs d'autoriser pour votre application et permettent à
votre projet d'accéder à des types spécifiques de
données d'utilisateurs privés depuis leur compte Google Cliquez simplement sur Ajouter
ou supprimer des portées. Sélectionnez le premier à envoyer un e-mail et profil, puis cliquez sur
Mettre à jour et enregistrez-le. Maintenant, allez à ce public, et ici nous pouvons ajouter des utilisateurs de goûts. Parfois, si après
toute implémentation, nos utilisateurs ne peuvent pas se connecter, il se peut que nous devions les
ajouter dans la liste des utilisateurs de Taste. Lorsque j'ai fait cela, je
n'ai trouvé aucune erreur. Donc, ne t'inquiète pas pour ça.
Il suffit d'aller voir les clients. Ici, nous devons
générer les informations d'identification OO, et pour cela, nous cliquons
sur Créer un client. Sélectionnez le
type d'application pour l'application Web. Nom, nous n'avons pas besoin de le changer. Mais en bas, nous devons
ajouter des URI de redirection autorisés Un URI de redirection est
le point de terminaison notre application principale
où Google redirige l'utilisateur une fois
qu'il s'est connecté avec succès Ici, nous écrivons STP, Column double forward
slash local host, Column 3,000 API OT,
Google, slash N'oubliez pas ce point de terminaison. Nous devons définir cette
API dans notre backend. Et cliquez sur Créer et c'est fait. Vous voyez, ici, nous obtenons l'identifiant du client
et aussi le secret du client. Copiez cet identifiant client et dans notre application à la place
de cet identifiant client Google, nous pouvons le mettre en page
ou, pour le sécuriser, nous pouvons le mettre dans un fichier ENV à points Je pense que c'est plus sûr. Qu'est-ce que tu en penses ? Donc, dans le fichier
ENV à points sur la nouvelle variable, Google, trait de soulignement, ID de soulignement
du client C'est égal à s'assurer de ne pas ajouter espace et de coller ici
l'identifiant client de votre application Google Ensuite, copiez ce
secret client, retournez dans VSCode, et respectez simplement Google,
underscore, client,
underscore Cela revient à baser ici le secret. Enregistrez ce fichier et revenez
au fichier passport point js. Ici, nous passons le processus
point par point sur Google, soulignons l'ID de soulignement du client Et ici, nous passons le processus
point par point Google, soulignons le client,
soulignons Maintenant, après cela, nous avons la propriété de l'URL de
rappel. Assurez-vous que nous écrivons ici le même point de terminaison que celui que nous transmettons dans notre application Google Console. Nous pouvons le voir à partir d'ici, cliquez sur ce bouton d'édition, et nous avons ici l'URL de rappel Copiez-le et
collez-le en double code. À la fin, ne touchez pas cette demande de transfert à la propriété de
rappel Assurez-vous qu'il est défini sur true. Il transmettra l'
objet de la requête à cette URL de rappel. Maintenant, après cela,
au deuxième paramètre, nous avons une fonction de rappel, ou nous pouvons dire fonction de
rappel de stratégie Cette fonction s'exécute lorsque les utilisateurs se connectent
avec succès avec leurs coordonnées, et nous obtenons ici un objet de demande, jeton d'
accès, qui est un jeton émis par
Google pour notre application. Cela permet à notre application de faire une demande
autorisée aux
API Google au nom de l'utilisateur. Ensuite, nous avons le jeton d'
actualisation, qui est un jeton qui
peut être utilisé pour obtenir un nouveau jeton d'accès lorsque
le jeton actuel expire. Ne vous inquiétez pas, nous n'en avons pas
besoin pour le moment. Ensuite, nous avons le profil, qui est un objet
contenant des informations sur l'
utilisateur authentifié, telles que son nom, son adresse e-mail, son identifiant Google, etc. Obtenez ces données auprès de Google, et cela dépend vraiment des champs d'
application que nous avons demandés Et à la fin, nous l'avons fait
, c'est la fonction
que vous appelez lorsque vous terminez
le traitement des données de l'utilisateur. Maintenant, dans cette fonction, nous ne voulons pas trouver d'utilisateur
ou créer un nouvel utilisateur. Nous allons faire tout cela
dans cette API de rappel. Nous supprimons donc ici ce code et nous reprenons simplement ici
cette méthode terminée Au premier argument, nous
transmettons une erreur qui est nulle. Au deuxième argument, nous
devons transmettre les données des utilisateurs. Dans ce cas, nous pouvons
directement transmettre le profil. En résumé, lorsque les utilisateurs connectent avec
succès
à Google, le rappel stratégique est
lancé et, dans ce profil, nous obtenons les données des utilisateurs
de Google Maintenant, lorsque nous appelons cette méthode
terminée avec une valeur nulle et des données utilisateur à profiler, Passport exécutera
ce point de terminaison d'API, et nous définirons ce point de
terminaison dans la leçon suivante.
105. OAuth avec JWT: Définissons maintenant cette dernière étape de l'authentification Google, qui consiste à ajouter
cette API de rappel Lorsque nous ajouterons cette API, nous la définirons dans les
routes ShorthTJSFLE Ici, nous ajoutons déjà une
API, qui est la première étape. Maintenant, nous ajoutons ici une autre méthode
router point Get, endpoint slash, Google
slash callback Vous devez lui donner la même valeur
que celle que vous transmettez dans la propriété
callback Comme nous le savons, Google enverra des données
d'utilisation sur cette voie de
rappel,
et pour cela, nous devons à
nouveau adhérer à Passport Middleware Authentification par point de passeport. Ici, nous passons Google
au deuxième argument, nous définissons l'objet avec une propriété, dont le SSN a la valeur false Cela indiquera à la bibliothèque
Passport de ne pas enregistrer l'ID utilisateur
dans la session. Et nous transmettons également une autre
propriété, échec, redirection, et lorsque les données utilisateur échouent, alors ici, le serveur Google
redirige notre utilisateur. Ici, nous devons transmettre
notre URL d'interface. Ici, par exemple, nous
passons l'application Local React. Vous pouvez écrire une colonne SDTP, une double barre oblique sur l'hôte local C5173 slash Connexion. C'est très important. Maintenant, nous pouvons
ajouter notre fonction de rappel, que nous exécuterons après avoir envoyé
les données de
profil à partir du
rappel de la stratégie de mot de passe à partir d' Maintenant, comment pouvons-nous obtenir
des données dans ce rappel ? Nous obtenons donc des données dans le point de
requête utilisateur, stockons ce profil
appelé invariable et
renvoyons simplement cet objet de profil dans le point de réponse Json
et passons le profil Maintenant, testons que cela
fonctionne ou non. Pour tester cette implémentation, nous devons envoyer une
requête Get au point de terminaison. Ouvrez le navigateur et passez à la colonne SGTP à double barre
oblique Hôte local, colonne 3 000. Si votre application s'
exécute sur un autre pod, vous devez écrire
votre URL Bean ici, puis slash API
OT slash Google Et là, nous avons une erreur. Il parle de stratégie d'erreur et de
non-authentification, Google. Laissez-moi vérifier. La stratégie de Google est correcte. De plus, nous transmettons le bon
nom des variables ENV. Permettez-moi de vérifier cela.
Oui, ce sont les mêmes. Oh, attendez. Nous n'avons pas ajouté ce fichier passport point js
dans notre fichier index point s
et, de ce fait, ce fichier n'a pas été configuré dans
notre application. Je pense que c'est la raison pour laquelle
nous recevons cette erreur. Allez donc dans le
fichier index point Gs, et en haut, nous ajoutons require, nous allons dans le dossier
Config et dans le passeport. Regardez les modifications et
redémarrons notre application. Mon point d'index est. Maintenant, revenons au navigateur
et je laisse la page reposer, vous voyez, nous redirigeons directement
vers la page de connexion Google. Ici, nous pouvons voir le nom de notre
application, que nous avons mentionné dans
notre console Google. Bien. Maintenant, vous devez saisir les détails de
votre compte Google
et simplement vous connecter avec celui-ci. Ici, il vous demande votre
autorisation pour autoriser Google à envoyer votre adresse e-mail et vos données de profil à
cette application. Continuez, et vous pouvez
voir ici que nous obtenons l'objet de données du
profil utilisateur. En haut, nous avons le fournisseur, qui est l'identifiant Google, qui est l'identifiant unique de Google. Affichez le nom à votre nom, le soulignement de l'
e-mail a été vérifié pour que nous obtenions l'identifiant EML
et bien d'autres informations Vous pouvez utiliser n'importe lequel de ces détails et le
stocker dans votre base de données. Nous avons donc terminé
notre travail majeur pour l'authentification Google. Il ne nous reste plus qu'à
vérifier si l'utilisateur avec cet identifiant EML est déjà disponible dans notre
application ou non Il n'est pas disponible, puis nous créons un nouvel utilisateur avec
son nom d'e-mail, son identifiant Google, mais nous laissons le mot de passe rempli car pour nous connecter avec
Google ou Facebook, nous n'avons pas besoin de renseigner le mot de passe, puis nous générons un
jeton JWT pour les données de cet utilisateur Si l'utilisateur est déjà disponible dans notre base de données,
ne vous inquiétez pas, nous mettons simplement à jour
son identifiant Google dans notre base de données, puis générons jeton
JWT pour les données de cet utilisateur Donc, pour implémenter cela, nous devons modifier un peu le
schéma de nos utilisateurs. Comment effectuer ces modifications
car dans notre application, nous avons un utilisateur qui peut se connecter
avec un e-mail et un mot de passe, et certains utilisateurs peuvent également
se connecter avec Google. Modifions d'abord
le schéma de l'utilisateur. Ici, nous créons un mot de passe,
obligatoire pour vrai. Mais comme nous le savons, lorsque
l'utilisateur se connecte avec Google, nous ne stockons pas le mot de passe, nous devons
donc remplacer le mot de passe
obligatoire par faux. De plus, lorsque nous créons un nouvel
utilisateur à l'aide de Google Login
, nous ne stockons pas non plus
l'adresse de livraison. Nous pouvons donc également
exiger que
l'adresse soit fausse et supprimer
cette propriété de longueur moyenne. Après cela, nous pouvons
ajouter un champ supplémentaire pour les utilisateurs qui ont utilisé
Google pour se connecter. Nous ajoutons le type d'identifiant Google à la
chaîne et unique à True. Vous vous demandez peut-être pourquoi nous avons besoin de cet identifiant
Google dans notre base de données ? Nous avons besoin de cet identifiant Google
car il
nous permet d'identifier que l'utilisateur est déjà disponible dans
notre base de données ou non. Mais ici, nous avons
déjà les e-mails des utilisateurs. Pourquoi ne pouvons-nous pas utiliser cet e-mail ? Vous voyez, dans le navigateur, nous obtenons ces détails
de profil. Ici, nous avons la propriété des e-mails, qui est le tableau des e-mails. Un compte Google contient un ou plusieurs e-mails,
tels que hurled gmail.com,
qui est le courrier principal, hurleredcorporate.com pour le courrier hurleredcorporate.com Si Harley change
son adresse e-mail principale, il se peut que
nous créions un
nouveau compte utilisateur pour le même compte
Google peut que
nous créions un
nouveau compte utilisateur pour le même compte Pour supprimer ce risque lié aux e-mails, nous stockons l'identifiant Google. Une autre raison pour laquelle nous
devons utiliser l'identifiant Google est que quelqu'un peut modifier l'adresse e-mail de
son compte Google, que quelqu'un peut modifier
l'adresse e-mail de
son compte Google,
mais pas
l'identifiant Google. L'identifiant Google est unique
pour tous les utilisateurs de Google, c'est pourquoi nous
stockons l'identifiant Google des utilisateurs. En outre, l'identifiant Google sert uniquement à
identifier les utilisateurs
qui se connectent à l'aide de Google, non aux utilisateurs qui ont créé compte à l'aide d'
un simple e-mail et d'un mot de passe. Pour ceux-ci, nous utilisons le
courrier électronique pour nous identifier. Enregistrez ce fichier et
écrivons rapidement notre logique dans cet itinéraire
Google Callback J'écris un commentaire pour cette logique. abord, nous vérifions
que l'utilisateur est disponible ou non à l'aide de son
identifiant Google ou par e-mail. Si l'utilisateur est disponible, nous mettons à jour son champ
Google ID, puis générons
simplement le jeton JWT
et l'envoyons dans la réponse Ici, nous n'avons pas besoin de vérifier mot de passe car l'utilisateur est
connecté à Google. Si l'utilisateur n'est pas disponible, nous créons un nouvel
utilisateur avec son nom, son adresse e-mail, son identifiant
Google, puis nous générons jeton
JWT et l'
envoyons en réponse À la fin, nous devons envoyer le
jeton JWT au front-end, c'est aussi
simple que cela Tout d'abord, quel utilisateur
est disponible ou non. Pour cela, nous avons besoin d'une collection d'
utilisateurs. Donc, en haut, le coût par
utilisateur est égal aux besoins, nous allons dans un dossier
pour les modèles d'utilisateurs. Maintenant, en bas,
nous écrivons fine query, user point Fine one. Et ici, nous passons Object et
nous ajoutons une condition, l'identifiant Google. Vers l'identifiant du point de profil. Et si quelqu'un se connecte d'
abord avec son adresse e-mail et son mot de passe, puis
essaie de se connecter avec Google. À l'heure actuelle, nous n'avons pas trouvé identifiant Google de
cet utilisateur dans notre base de données. Nous devons donc également trouver un
utilisateur en fonction du courrier électronique. Vous pouvez utiliser ici ou utiliser un opérateur. Nous ajoutons un dollar ou une colonne, et nous devons ajouter ici
un tableau de conditions multiples. Nous ajoutons donc un objet de condition, l' identifiant
Google à l'identifiant du point du profil, et un deuxième objet de condition, l' e-mail, au point e-mail du profil. Maintenant, voici une chose. Ce champ d'adresse e-mail à points de
profil ne
sera pas disponible à 100 %. Pour certains comptes Google, cela fonctionne, et pour quelques
comptes, cela ne fonctionnera pas. Par conséquent, comme bonne pratique, les développeurs n'utilisent pas ce champ d'e-mail à points de
profil. Ils utilisent des e-mails à points de profil, qui sont le tableau, et nous accédons à son premier élément par un index zéro entre
crochets, et pour la valeur, nous appliquons
la valeur des points. Comme nous le savons, cette requête
renvoie une promesse, nous pouvons
donc adhérer à wait, en stockant l'objet utilisateur
dans une variable, let user. De plus, pour utiliser await, nous devons faire en sorte que ce
rappel soit actif Nous avons maintenant deux scénarios. Si l'utilisateur est disponible, sinon
l'utilisateur n'est
pas disponible. Maintenant, ce que nous voulons faire
si l'utilisateur est disponible, nous allons vérifier si l'
identifiant Google est stocké ou non. Si l'identifiant Google de l'utilisateur n'
est pas disponible, nous définissons l'identifiant Google par point utilisateur. Correspond à l'ID du point de profil. Cet
identifiant de point de profil est l'identifiant Google. Ensuite, pour économiser de l'aide, nous écrivons await user point save. Maintenant, dans le else,
nous devons écrire la logique pour que l'utilisateur n'existe pas. En gros, nous allons
créer un nouvel utilisateur. Nous écrivons donc que user est
égal à new user. Ici, nous passons un objet
avec des propriétés. Le premier est le nom du
profil, le nom affiché par points. Ensuite, envoyez un e-mail à un point de
profil. Ici, nous accédons à la valeur du point du premier
élément. Comme nous l'avons fait avant. Dernière propriété, nous avons besoin d'
un identifiant Google pour profiler le point ID. Pour enregistrer ce nouvel utilisateur, nous écrivons ici await
user point save. Tu n'as qu'une seule chose à faire. Générez un jeton JWT et envoyez-le. Le jeton de coût est donc égal à, nous passons à l'itinéraire de l'utilisateur. Nous copions cette méthode de signature JWT pour générer un jeton
et le collons ici Ici, au rythme de
cette variable de données, nous devons transmettre les données que nous voulons envoyer à l'intérieur du jeton. Et ce que nous avons
transmis dans le login,
oui, nous ne transmettons que l'identifiant et le nom. Ici, nous transmettons également l'identifiant de
soulignement, et non l'identifiant Google. L'identifiant Google est juste destiné backend pour vérifier
cette condition. Il suffit de copier cet
objet de données et de le transmettre ici. Si vous souhaitez également envoyer un e-mail, vous pouvez également le mentionner. Mais c'est important, en tout cas, vous envoyez les mêmes informations. Il sera facile pour le
front-end d'utiliser ces données. Assurez-vous également ici que nous
devons importer JWT. Le coût JWT est égal à
un jeton Web JSON requis. Maintenant, au lieu d'envoyer
ces
détails de profil en réponse,
nous envoyons un jeton JWT, des
sems, nous envoyons un jeton lors de la simple inscription et nous nous connectons avec un
e-mail et un mot De plus,
les développeurs du front end vous demandent parfois de
rediriger l'utilisateur sur la
page d'accueil directe du front end. À ce moment-là, nous pouvons faire
quelque chose comme ça. Point de réponse RedIC et ici
nous utilisons une chaîne de modèle. Ici, nous devons mentionner l'URL de
notre page d'accueil sur laquelle nous voulons rediriger l'utilisateur après une
connexion réussie avec Google. F localement, nous pouvons écrire SDDP,
colonne double pour
slash local host, colonne 5173, qui Ici, vous devez
écrire l'URL de votre interface, puis le tableau de bord Ici, nous passons le jeton dans le paramètre de
requête
en utilisant un point d'interrogation, jeton est égal au dollar entre crochets
Cali, jeton Vous pouvez également modifier
cette URL comme vous le souhaitez. Cela
dépend vraiment de votre interface. De nombreux développeurs redirigent les utilisateurs, et certains n'
envoient que des jetons. Je vous montre dans les deux sens, vous pouvez choisir ce que votre développeur
frontal vous dira. Enfin, nous avons intégré la
fonctionnalité de connexion avec Google dans notre application. Récapitulons ce que nous avons
fait dans les deux dernières leçons. Tout d'abord, l'utilisateur clique sur le bouton de connexion avec
Google. Notre interface redirigera
l'utilisateur vers l'hôte local Colonne 3 000 slash API
Ath slash Google Voici notre URL Bend. Si votre backend fonctionne
sur l'hôte local 8 000, l'utilisateur doit être
redirigé vers l'hôte local 8 000 API Auth Google Désormais, lorsque l'utilisateur redirige
vers API Auth Google, ce code s'exécute Nous mentionnons ici l'authentification par
point passeport auprès de Google et
mentionnons le champ d'application Maintenant, après cela,
ce code sera exécuté directement, qui est disponible dans
le fichier JS du passeport. Ici, le passeport envoie
notre identifiant client, secret du
client et
l'URL de rappel laquelle nous voulons
envoyer les données de profil Une fois que les utilisateurs se sont
connectés avec
succès avec le compte Google et ont
accordé l'autorisation, cette fonction s'exécute, et nous renvoyons ici la méthode avec l'erreur null
et les données de profil. Nous pouvons accéder à ces données de profil en tant qu'utilisateur du point de demande dans
notre fonction de rappel Assurez-vous également que nous
ne pouvons pas transmettre la demande
de rappel à True Après cela, notre API de
rappel s'exécutera, et ici nous écrivons
notre logique utilisateur, puis nous envoyons ou
redirigeons l'utilisateur avec un jeton est aussi simple que ça. Je suis sûr que tous
vos doutes sont clairs. Ne vous inquiétez pas, c'est la première
fois et à cause de cela, vous êtes un peu perplexe. Mais avec le temps, vous le
comprendrez sans aucune confusion. Les deux dernières leçons sont un peu longues, mais regardez simplement ce que vous avez implémenté dans votre application. Félicitations pour
cela, vous pouvez faire une
petite pause dans l'écran puis continuer cette section.
106. Se connecter avec Facebook en utilisant OAuth: Donc, précédemment, nous avons ajouté la
connexion avec Google. Maintenant, nous pouvons également ajouter la
connexion avec Presbook ou toute autre plateforme
comme Github ou Twitter Nous devons
suivre certaines étapes courantes. Étape numéro un, installez le passeport et la
bibliothèque de stratégies de passeport dans l'application du nœud. Deuxième étape, ajoutez le premier point de terminaison de l'
API, qui déclenchera Passport
avec cette stratégie. Étape numéro trois, ajoutez code de stratégie de
passeport dans
le fichier passport point js. Identique à l'ajout de la stratégie Google. Étape numéro quatre, générez un identifiant et un secret pour cette plate-forme. Enfin, étape numéro cinq,
définissez l'API de rappel, stockez les données des utilisateurs si nécessaire
et envoyez le jeton JWT Avec ces cinq étapes, nous pouvons ajouter n'importe quelle plateforme dans OT. Permettez-moi de
vous montrer rapidement comment nous pouvons implémenter
la connexion avec Facebook. Étape numéro un, nous devons
installer une stratégie de passeport. Nous accédons à la
documentation du passeport et recherchons ici Facebook. voyez, ici, nous obtenons la commande
d'installation, copiez-la et
collez-la simplement dans notre terminal. De plus, si vous souhaitez utiliser la
même version que moi,
vous pouvez l' ajouter ici au
taux 3.0 0.0 et appuyer sur Entrée. Maintenant, étape numéro deux, nous
devons ajouter une API et un point, ce qui ouvrira la page de connexion à
Facebook. Donc, dans la
documentation du passeport, faites défiler la page vers le bas. Et ici, nous obtenons le code API. Vous voyez, cela
ressemble beaucoup à l'API Google. N'oubliez pas et
copiez simplement cette première API. Et dans notre fichier th point js, après cette API de rappel, nous le collons simplement ici Accrochez ce point
d'API pour couper Facebook et
authentifiez-vous par point de passeport auprès de Facebook, et pour plus de portée, nous
devons écrire ici profil de soulignement
public Troisième étape,
nous devons ajouter un code de stratégie de
passeport pour Facebook. Allez donc à
nouveau sur le site Web du passeport et copiez ce code de
stratégie. Revenons au fichier viscodeopen
passport point js, et simplement en bas, nous collons ce code Nous devons maintenant apporter
quelques corrections. Tout d'abord, vous devez importer stratégie
Facebook
depuis le package. Dupliquez donc cette ligne de
stratégie Google et changez
simplement le
nom de cette variable en stratégie Facebook. Identique à celui qu'ils utilisent ici, et nous avons également changé
le nom du package en Passport Facebook. Bien. Maintenant, nous devons
ajouter ces champs identifiant
Facebook et secret Facebook ce qui est la quatrième étape. Pour générer l'
identifiant de l'application et le secret de l'application, nous devons accéder à la page des
développeurs de Facebook. Mentionnez tous les détails dans la documentation des mots de passe pour chaque plateforme. Ne
t'inquiète pas pour ça. le nouvel onglet, recherchez
ici, Facebook, développeur, console et
ouvrez ce premier lien. Cliquez ici sur Login. Je me connecte avec mon compte. Bien. Après la connexion, nous arrivons
à l'option de démarrage. Il se peut qu'il vous demande
le registre et qu'il vérifie. Suivez les étapes de base, puis vous serez redirigé
vers cette page d'applications. Cliquez sur Créer une application. Ici, nous écrivons le
nom de notre application, qui est Cardwis. Ce sont les mêmes informations que nous renseignons dans la console Google. Ajoutez maintenant des cas d'utilisation Nous voulons
donc
authentifier et demander des données aux utilisateurs connectés à
Facebook Nous aimons ça et cliquez sur Suivant. Ici, sélectionnez, Je ne veux pas
connecter le portefeuille d'entreprises. Vous n'aurez peut-être pas cette
option car récemment, Facebook est devenu
strict à ce sujet. Désolée si vous n'avez
pas cette option ici, mais ne vous inquiétez pas, écrivez
un code au fur et à mesure que j'écris. À l'avenir,
il vous suffira d'ajouter uniquement l'
identifiant de l'application Facebook et le secret de l'application. Ici, cliquez sur Suivant et Suivant et c'est fait, allez sur
Deskboard. Maintenant, nous devons terminer ces étapes Clikon personnalise donc en ajoutant
un bouton de connexion à Facebook. Ici, nous avions l'autorisation. Ajoutez un e-mail et le
profil public est déjà ajouté. Cliquez maintenant sur ce démarrage rapide. Ici, nous sélectionnons le Web
ici, notre URL frontale. Pour l'instant, il suffit d'écrire ici, STTP, colonne double barre oblique, hôte
local, colonne Dans le monde réel, vous devez
écrire l'URL de votre interface ici et cliquer sur
Enregistrer et continuer. Cliquez sur Suivant, cliquez sur Suivant, cliquez sur Suivant et c'est fait. Maintenant, allez simplement dans les paramètres de
l'application en bas et passez
aux paramètres de base. Ici, nous obtenons APiD et App Secret. Copiez cet APD et dans
notre fichier ENV à points, nous ajoutons une autre variable
appelée Facebook, application de
soulignement, identifiant de soulignement Collez l'identifiant de l'application. Ensuite, nous ajoutons une autre variable appelée application
Facebook Underscore, secret de
soulignement est
égal à retour au navigateur, et ici nous cliquons sur Afficher, il peut vous demander votre mot de passe
Facebook, écrivez-le et voyez ici nous
pouvons voir le code secret Copiez-le et
collez-le simplement dans le fichier ENV. Enregistrez le fichier et revenez
au fichier Passport point JS. Ici, à process.nw point Facebook underscore
app, underscore ID Et ici, nous traitons également le secret application
Dot Nwt Facebook Underscore Maintenant, après cela, nous copions simplement ces deux propriétés
à partir du code précédent,
callb URL, puis nous
transmettons la demande au rappel et les mettons en page
ici pour Facebook. Juste ici, nous devons modifier
l'URL de rappel pour slash
API Oath, slash API Oath, slash Nous devons également ajouter une propriété supplémentaire car
Facebook n'est pas comme Google Facebook n'envoie pas beaucoup de données, nous devons
donc spécifier une propriété appelée champs de profil dans le tableau, et dans ce tableau, ajouter tous les noms
de remplissage provenant de Facebook. Nous ajoutons un identifiant, qui est l'identifiant unique de
Facebook, est unique pour
chaque utilisateur de Facebook, comme l'identifiant Google. De plus, nous transmettons des e-mails pour les
e-mails, le nom, le nom d'affichage. Type de point d'image virgule, et entre parenthèses, grand C'est pour obtenir une photo
de profil. La plupart des applications
utilisent ces données. Maintenant, pour ce qui est du rappel, nous voulons faire la même chose
que cette stratégie de Google Nous copions donc simplement ce rappel de stratégie et l'avons
basé sur la stratégie Facebook Ici, notre quatrième étape est terminée. Enregistrez ce fichier. Maintenant,
dernière étape numéro cinq, nous devons simplement définir cette route de rappel
pour Facebook Ouvre un fichier point gs. Ici, nous pouvons simplement copier ce rappel Google et le
coller en bas Toujours en haut, je remarque que nous devons changer cette application point GAD
en routeur point gat Bien. Tout d'abord, nous changeons l'API et pointons pour slash Facebook
Slash callback De plus, dans Passport
point Authenticate
at the place of Google, Maintenant, dans le rappel de l'API, nous devons changer cet identifiant
Google par un identifiant Facebook Nous devons donc ajouter
un autre champ dans le schéma de
nos utilisateurs,
identique à celui de Google ID. Ici, sélectionnez Google ID et
appuyez sur Ctrl plus T ou Commande plus et sélectionnez tous les identifiants Google dans
cette API Facebook. À la place,
nous ajoutons un identifiant Facebook, et nous n'avons rien
à changer. Enregistrez les modifications
et n'oubliez pas d' ajouter le champ Facebook ID
dans le schéma utilisateur. Ouvrez le fichier « point gs »
des utilisateurs, dupliquez
simplement le champ Google ID et changez
son nom en identifiant Facebook, et nous sommes prêts à partir. Enregistrez les modifications, c'est moins. Ouvrez le navigateur et
accédez à l'hôte local, la colonne 3 000 slash API
OT slash Facebook Vous voyez ici que l'application n'est pas active. Cette application n'est pas
accessible pour le moment. La raison en est que dans cette application, nous n'avons ni ajouté ni
vérifié l'entreprise. Récemment, Facebook est devenu
strict à ce sujet, mais cela n'a pas d'importance
car nous pouvons voir que lorsque nous créons cette API Get
avec des API Orth, supprimons Facebook, nous
obtenons la page Facebook, ce qui signifie que de notre côté,
notre API fonctionne correctement Notre objectif principal est de mettre en œuvre la fonctionnalité de
connexion avec. Si votre client doit se
connecter avec Facebook, vous pouvez utiliser son entreprise
et vérifier votre application. Après cela, cette
fonctionnalité fonctionnera, la même manière que notre connexion
avec Google fonctionne. C'est ainsi que nous implémentons l'authentification pour notre application principale. C'est vraiment simple. Nous devons suivre
ces cinq étapes.
107. Simplifier le code: Maintenant, comme nous le savons, dans
ce rappel à la fois, notre code est le même Il suffit de changer l'
identifiant Google par l'identifiant Facebook. Comme meilleure pratique,
nous pouvons définir une fonction réutilisable commune qui écrit simplement un
jeton à la fin. Supprimons cette logique depuis utilisateur
jusqu'à la génération de ce
jeton. En bas, nous créons
une nouvelle fonction, const,
handle, or both callback is
equal to arrow Entre crochets,
nous collons ce code, et à la fin, nous renvoyons
simplement le jeton. Maintenant, tout d'abord,
pour utiliser cet Avid, nous devons rendre cette
fonction asynchrone Maintenant, que voulons-nous changer ici ? Ici, nous avons besoin de ces données de profil, ainsi que de cette propriété
que nous voulons modifier, identifiant
Google ou l'identifiant Facebook. Nous pouvons donc passer ici deux
paramètres : le profil
, à savoir les données complètes du profil, puis l'ID du fournisseur. Nous ne pouvons pas ajouter cet identifiant de fournisseur car lorsque nous appelons ce
handle ou cette fonction de rappel, nous transmettons l'identifiant Google ou l'identifiant
Facebook sous forme de chaîne, et nous ne pouvons pas ajouter
ici cette chaîne Cela ne marchera pas.
Nous pouvons simplement utiliser ici, entre
crochets, l'identifiant du fournisseur. De plus, à la place du point
utilisateur Google ID, nous pouvons écrire l'identifiant du fournisseur
entre crochets. C'est la deuxième
façon d'accéder à la valeur de l'objet A ici et également dans le blog
Else et c'est fait. Maintenant, dans l'API Google Callback, nous appelons cette fonction de rappel handle
orth Et transmettez ici le profil
au premier paramètre, et pour l'identifiant du fournisseur, ce que nous passerons write, nous passerons ici, string, Google ID. Assurez-vous d'écrire le même nom de champ que celui que vous avez
défini dans le schéma de l'utilisateur. Maintenant, l'exécution de cette fonction
prendra un certain temps. Nous pouvons donc utiliser here await et
cette fonction renvoie un jeton. Nous pouvons donc le stocker
dans un jeton variable. Faisons de même pour le rappel
sur Facebook. Copiez cette ligne de jeton et dans le rappel Facebook entre
l'utilisateur let et ce jeton, nous la supprimons et collons simplement
ici cet appel de fonction Ici, n'oubliez pas de remplacer cet identifiant de fournisseur par un identifiant Facebook. C'est ce que nous avons dit, remplissez le nom ? Oui, c'est un identifiant Facebook. Tu vois, maintenant notre code semble propre. Dans la section suivante,
nous allons créer des API pour les cartes de
produits et
les commandes des utilisateurs. C'est vraiment amusant.
108. Problème avec Single Token [MISE À JOUR] ]: Voyons maintenant comment de grandes entreprises
comme Google, Microsoft et Netflix mettent en œuvre une authentification sécurisée
et transparente, et c'est ainsi que d'autres applications
de production implémentent
également l'authentification. Ils utilisent deux types de jeton JWT, le jeton d'accès et le jeton d'actualisation Ne vous inquiétez pas pour
ces grands mots. Permettez-moi de vous expliquer cela
en termes très simples. Actuellement, dans notre application, nous avons créé une API pour enregistrer un nouvel utilisateur, puis nous créons une
API pour enregistrer cet utilisateur. les deux cas, nous envoyons jeton
JWT au
front-end et notre front-end enverra ce jeton dans l'en-tête de demande avec le préfixe
porteur et en
utilisant cet en-tête, nous obtenons les informations utilisateur
dans notre Cette approche pose maintenant deux
problèmes. Le premier est le problème
d'expiration des jetons. Nous avons fixé le délai
d'expiration du jeton à 2 heures après 2 heures, notre utilisateur doit se
reconnecter pour obtenir un nouveau jeton. C'est une mauvaise expérience pour les utilisateurs,
car ils doivent se reconnecter à chaque
fois que le jeton expire. Maintenant, vous pourriez dire que nous pouvons
augmenter le délai d'expiration, et ainsi notre
expérience utilisateur sera corrigée. Oui, c'est vrai,
mais de cette façon, il y a un autre problème
qui concerne le risque de sécurité. Imaginez que pour une bonne expérience
utilisateur, nous augmentons le
délai d'expiration à dix jours. Maintenant, si ce jeton JWT est
volé par quelqu'un d'autre
, l'attaquant ou le
hacker peut utiliser ce
jeton tel que nous l'utilisons
jusqu'à son expiration Dans ce cas, nous
n'avons aucun moyen de nous déconnecter ou de
révoquer le jeton Nous n'avons qu'à
attendre l'expiration du jeton. Comme nous pouvons le constater, nous ne pouvons pas augmenter le délai
d'expiration. Il faut porter ce
délai d'expiration à 5 minutes ou 10 minutes. Maintenant, pour améliorer l'
expérience utilisateur, Google
propose d'abord
ces deux concepts de jetons, à jeton d'accès
et le jeton de répression Nous verrons comment ce concept
fonctionne dans la prochaine leçon
109. Token d'accès et logique de jeton de rafraîchissement [MISE À JOUR]: Voyons maintenant le concept de jeton excédentaire
et
de jeton d'actualisation. Ainsi, au lieu de
créer un jeton, nous créons deux jetons dans
notre API de registre ou de connexion. Le premier jeton, nous l'avons appelé jeton
d'excédent et le second jeton, nous l'avons appelé jeton d'actualisation. Ce sont tous deux des jetons JWT, identiques à ceux que nous avons générés
à la fin de notre API Mais la seule différence
concerne le jeton excédentaire, nous fixons un délai d'expiration comme 5 minutes
ou 10 minutes
ou un maximum d'heures pour le jeton de
référence, nous fixons un délai d'expiration
aussi long, par
exemple cinq jours ou deux
semaines comme ça jeton
excédentaire et le jeton de
référence, tous deux sont des jetons JWT Nous pouvons les générer en
utilisant la méthode du signe par points JWT, mais leur
date d'expiration est différente Vous pouvez maintenant vous demander ce qui fera la différence en créant
deux jetons séparément. Pour simplifier les choses, j'explique votre flux de travail complet afin que
tous vos doutes soient dissipés. Imaginez que c'est le front
end et que c'est le backend. L'utilisateur remplit le formulaire de connexion (
e-mail et mot de passe)
et soumettez-le. Au backend, nous vérifions
les détails et
comparons les mots de passe. Si les informations sont correctes, nous
créions auparavant un jeton. Dans cette approche, nous
créons deux jetons. L'un est le jeton excédentaire et le
second est le jeton d'actualisation. Nous fixons le délai
d'expiration du jeton à 5 minutes, par exemple,
et pour le jeton d'actualisation, nous donnons un
délai d'expiration à cinq jours. Nous stockons ce jeton d'actualisation dans la collection de
l'utilisateur, puis nous envoyons ces deux
jetons au front-end. Sur notre interface, nous avons
défini le jeton excédentaire dans l'en-tête global de l'API avec un
meilleur préfixe, comme avant Maintenant, si l'utilisateur excède l'
API protégée, alors au backend,
nous obtenons le jeton excédentaire à partir de
l'en-tête de la demande et nous pouvons envoyer les données dont notre utilisateur a besoin. Imaginez maintenant qu'au bout de 5 minutes, notre jeton d'accès expire. Notre utilisateur envoie à nouveau la demande d'
API. Ici, notre backend vérifie si ce jeton d'accès
est valide ou non Ici, ce n'est pas valide.
Depuis le backend, nous
envoyons la réponse avec une erreur 401 dans un jeton valide. Maintenant, sur le front-end, le développeur va écrire du code. En cas d'erreur 401 sur le front-end, le développeur appellera une autre API pour obtenir un nouveau jeton d'accès. Disons OT slash refresh. Maintenant, dans cette API, nous pouvons accéder au jeton d'actualisation. Mais ici, nous devons vérifier si ce jeton d'actualisation est valide
pour cet utilisateur ou non. N'oubliez pas que lorsque nous générons un nouveau jeton d'accès
et un nouveau jeton d'actualisation, nous stockons le
jeton d'actualisation dans la base de données. Nous pouvons comparer ces deux jetons d'
actualisation s'
ils correspondent, ce qui signifie que l'utilisateur est valide. À ce moment-là, nous
générons à nouveau un nouveau jeton d'accès, un nouveau jeton d'
actualisation, mettons à jour le jeton d'actualisation
dans la collection de l'utilisateur
et, comme précédemment, nous envoyons ces deux jetons
au front-end. Ainsi, l'utilisateur n'a pas besoin
de se connecter encore et encore. Lorsque l'utilisateur
n'a pas de jeton d'actualisation ou lorsqu'un jeton expire, ce n'est qu'alors que vous devez vous
reconnecter. C'est aussi simple que ça. Maintenant, la question
que vous pourriez vous poser est si
ce
jeton d'accès est volé ? Avec cela, l'attaquant
peut facilement y accéder. Oui, c'est possible, et c'est pourquoi de nos jours, les développeurs
frontaux ne
stockent pas de jetons excédentaires
dans le stockage local. Ils le stockent dans l'abside comme variable
JavaScript ou un magasin
RxTate ou Redux Et même si, d'une manière ou d'une autre,
l'attaquant
conserve le jeton excédentaire , le délai
d'expiration du jeton excédentaire est très court. Vous pouvez maintenant demander aux attaquants ils peuvent également conserver le
jeton d'actualisation. Qu'en est-il de ça ? Et aussi, il a une longue durée de péremption. Pour résoudre ce problème
sur le lieu d'
envoi de refrestocan au front-end,
nous pouvons
définir refrestocen Maintenant, qu'est-ce que le cookie SDTPoly ? Un cookie SDDPoly est
un type spécial de cookie qui n'est pas
accessible par JavaScript
exécuté sur le navigateur Ce cookie SDDP uniquement ne peut pas être consulté
via notre navigateur. Notre navigateur ne peut envoyer ce
cookie qu'avec l'appel d'API. Cependant, le JavaScript présent sur la page ou exécuté dans le
navigateur ne peut pas lire, modifier ou supprimer un cookie, ce qui protège notre
jeton d'actualisation des attaquants. Vous pouvez maintenant demander à
ce cookie SDDPoly est envoyé uniquement à nos appels d'API, ou qu'il sera envoyé avec
tout autre appel d'API C'est vraiment une excellente question. cookie SDDPoly possède une fonctionnalité que nous avons appelée «
même site Nous définissons la propriété, du même site
à la rue, et ainsi,
ce cookie SDDP
uniquement sera envoyé aux API de notre domaine principal,
et non à quelqu'un d'autre C'est pourquoi le
jeton de référence est hautement sécurisé car il ne peut pas y
accéder par JavaScript. Récapitulons maintenant ce
jeton d'accès et référençons le concept de jeton Lorsque l'utilisateur s'enregistre ou se connecte
à la place d'un jeton, nous créons deux jetons. premier est le jeton excédentaire, dont le délai d'expiration est recherché, et le second jeton
est le jeton d'actualisation, dont le délai d'expiration est long. Nous stockons le jeton d'actualisation dans la collection de l'utilisateur
pour cet utilisateur, puis nous envoyons le jeton excédentaire
au
front-end . Nous définissons le
jeton d'actualisation dans le SDDPolyoki Maintenant, l'avantage
de SDTPoly Cookie est qu'il ne peut pas y accéder par le code JavaScript du
navigateur Un ami et un navigateur ne peuvent envoyer ce cookie SDTP qu'
avec SDDPRQuest Cela rend notre jeton
d'actualisation plus sécurisé et, comme nous le savons, notre jeton d'accès est disponible
dans l'état de l'application, non dans le stockage local. Nos jetons de bateau sont donc sécurisés, et c'est ainsi que nous
pouvons offrir à nos utilisateurs une meilleure expérience
et une meilleure sécurité. est aussi simple que ça. Nous
utilisons donc un jeton d'accès pour accéder aux données depuis le back-end et c'est pourquoi
nous l'appelons jeton d'accès. Nous utilisons également un jeton d'actualisation pour réprimer notre jeton d'accès, et c'est pourquoi nous l'appelons
jeton d'actualisation Ce flux de travail est très
important pour votre application, et de nombreux développeurs ne
connaissent pas vraiment ce flux de travail complet. Mais je suis sûr que vous le
savez maintenant , ce qui est vraiment génial. Dans la
leçon suivante, nous allons implémenter cette logique dans notre
code. Ce sera amusant.
110. Mettre en œuvre le jeton d'accès et le jeton de rafraîchissement [MISE À JOUR]: Maintenant, pour implémenter l'approche
des jetons excédentaires et des jetons d'actualisation, nous devons faire très peu d'
enchères dans notre backend Tout d'abord, lorsque nous enregistrons
ou connectons un utilisateur, nous devons générer
deux jetons et stocker le jeton d'actualisation dans
la collection de l'utilisateur. Ensuite, nous devons
renvoyer le jeton excédentaire
, comme nous l'avions envoyé
précédemment dans la réponse. Ensuite, nous devons couper le
jeton d'actualisation dans le cookie SGDP uniquement, afin que le JavaScript de notre navigateur ne
puisse pas accéder au jeton ou l'actualiser Ne vous inquiétez pas, c'est très
simple. C'est ce que nous allons faire. Nous avons donc créé ici une
fonction pour générer un jeton, et nous
renvoyons directement le jeton. Ainsi, au lieu de générer
un seul jeton, nous pouvons générer
ici deux jetons. Donc, d'abord, nous changeons le nom de
cette fonction
pour générer des jetons. Et à l'intérieur, à l'
endroit où cela est écrit, nous le stockons dans une variable
appelée jeton d'accès. Ensuite, nous dupliquons cette ligne et nous voulons
générer un jeton d'actualisation, tel que le
nom de la variable pour actualiser le jeton Nous devons
également changer l'
expiration du jeton excédentaire à 5 minutes et
actualiser l'expiration du jeton à sept D pendant sept jours. De plus, dans le jeton d'actualisation, nous ne voulons pas envoyer
toutes les données de l'utilisateur que nous voulons inclure dans
le jeton excédentaire. Ici, à la place des données, nous ajoutons simplement un objet avec un identifiant, colonne et un identifiant de soulignement par points de
données passier De plus, de nombreux développeurs
aiment utiliser une clé secrète
différente pour le
jeton d'accès et un jeton de répression
pour des raisons de sécurité Ici aussi, nous ouvrons le fichier ANV à points, et ici à la
place de la clé JWT, nous écrivons jeton d'accès, Ensuite, nous créons une
variable pour reformuler, jeton, clé, et nous vous donnons
toute clé que vous souhaitez ajouter Enregistrez ceci et dans la
route de nos utilisateurs, dans notre fonction, nous changeons jWTK en jeton
excédentaire, K,
et ce jWTK pour reformuler Maintenant, à la fin
de cette fonction, nous renvoyons un objet avec deux
propriétés, jeton excédentaire, jeton accès ou nous pouvons
supprimer ce
jeton d'accès et après cela, nous renvoyons un jeton d'actualisation
à un jeton d'actualisation. Bien. Voyons maintenant ce que nous devons
faire dans le registre, une nouvelle API utilisateur. En bas, nous
pouvons voir que nous appelons cette
fonction generate token et que nous passons ici sous Square ID
et name property. Ici, comme nous le savons, nous ne renvoyons pas un seul jeton
à partir de cette fonction. Nous renvoyons un objet, nous pouvons
donc le
déstructurer ici
et obtenir un jeton d'accès et un jeton
d'actualisation Maintenant, dans la réponse, comme
précédemment,
nous renvoyons le jeton excédentaire. De plus, certaines entreprises
envoient également un jeton d'actualisation
dans la réponse, mais nous n'allons pas le faire. Nous implémentons ici le code du niveau de
production. Nous allons donc définir ce
jeton d'actualisation dans le cookie SDP uniquement. Pour cela, nous écrivons un cookie
à point de réponse. Assurez-vous de saisir le
point de réponse Cookie avant d'écrire point de
réponse send
ou le point de réponse jSN car nous ne pouvons pas définir de cookie
après avoir envoyé la réponse Si vous l'écrivez après le point de
réponse json,
vous obtiendrez une erreur. Avec le premier paramètre, nous écrivons le nom de notre propriété. Disons que fait référence à un jeton. Après cela, nous passons le jeton d'
actualisation. Au troisième paramètre, nous devons transmettre un objet avec
des propriétés importantes. Tout d'abord, nous écrivons
SGDP uniquement pour vrai. Cela signifie que JavaScript
du navigateur ne peut pas
lire ce cookie. Ensuite, nous ajoutons secure à true pour garantir
le SDP en tant que demande Nous le
testons actuellement pour les requêtes STDP
locales et c'est
pourquoi nous le rendons ici faux Mais n'oubliez pas que nous écrivons
ici la commande change ce secure en true
pour la production. Après cela, nous avons
le même site par rue. Nous arrêtons ainsi notre cookie pour passer à
un autre appel d'API de domaine. Mais ici, vous devez vous assurer que votre frontend et votre backend
doivent se trouver sur le même domaine Par exemple, gobleu.com pour le
front-end et
cola.com pour front-end et
cola.com Si votre backend et front-end sont hébergés
sur un domaine différent, nous pouvons définir ce
paramètre sur aucun, ce qui signifie que notre cookie
peut être transféré à n'importe quel domaine Ici, nous voulons que notre navigateur envoie un cookie uniquement pour
notre plateforme principale Pour cela, nous écrivons ici la propriété de
domaine de notre domaine Bend, comme
api dotben.com Grâce à cette propriété, seul ce
domaine recevra ce cookie, aucun autre domaine. Actuellement, nous
exécutons notre back-end sur hôte
local 3 000 et
dans le champ du domaine, nous ne pouvons pas ajouter l'hôte local 3 000 car ici, nous ne devons
ajouter que le domaine réel. Nous commentons également cette
propriété et enfin,
nous ajoutons MaxH au délai d'expiration de notre
jeton de répression Ici, nous passons sept jours, soit le même que le délai d'expiration de notre
jeton d'actualisation. 7 à 24 heures,
60 minutes, 60 secondes, 1 000
millisecondes Cela signifie simplement qu'au
bout de sept jours, ce cookie STP uniquement expirera, sera également supprimé et terminé Nous avons défini le jeton d'actualisation
pour le cookie SDTPoly. Nous devons maintenant faire de
même pour l'API de connexion. Nous copions donc ce
point de réponse selon la méthode Cooke, et avant ce
point de réponse Jason, nous le collons Donc, ici, à la place
de ce jeton, nous déstructurons l'objet, nous obtenons
l'excédent de jeton et nous réprimons le jeton
. Modifiez également le
nom de la fonction pour générer des jetons, et nous renvoyons ici le
jeton excédentaire dans la réponse. De plus, lorsque nous créons un jeton d'
actualisation, nous devons le conserver dans notre collection d'utilisateurs,
car en l'utilisant uniquement, nous saurons si le
jeton d'actualisation est valide ou non. Tout d'abord, dans notre schéma
utilisateur, à la fin, nous ajoutons deux
crochets Carly à la fin, tapez deux chaînes Enregistrez ceci et revenez
à l'itinéraire des utilisateurs. Ici, dans l'itinéraire de connexion,
avant d'envoyer un jeton excédentaire, nous ajoutons un point d'actualisation utilisateur.
Le jeton d'actualisation est égal au jeton d'actualisation. Ensuite, nous ajoutons un point
d'utilisateur de poids s. Maintenant,
voici une chose. De nombreux développeurs aiment
stocker un jeton d'actualisation qu'il possède ou crypté dans la base de données pour plus de sécurité, et c'est également une bonne pratique. Donc là aussi, nous pouvons
faire des coûts, un nouveau hed, jeton d'
actualisation équivaut à attendre, crypter le point a, ici, nous passons le jeton d'actualisation
et nous mettons SALT à dix De la même manière que nous
augmentons le mot de passe, nous augmentons le jeton d'actualisation Ici, à l'endroit
du jeton d'actualisation, nous stockons le nouveau jeton d'actualisation
hesed Copiez également ces lignes
et dans notre API de registre, nous les collons ici. Nous devons également le remplacer par un
nouveau jeton d' actualisation par point utilisateur
et attendre le CV de Nwuser point C'est ça. Vérifions si
cela fonctionne ou non. Enregistrez les modifications, assurez-vous que
notre backend fonctionne. Maintenant, ouvrez Postman, ouvrez l'API de connexion
et envoyez la demande voyez, nous obtenons ici le nouveau jeton, qui est notre jeton d'accès. Et si nous voyons après
cet onglet sur le corps, nous obtenons un cookie. Si nous vérifions cela, vous voyez, nous obtenons
ici le nom du cookie
qui est le jeton d'actualisation. Nous obtenons donc la valeur, le domaine, le chemin expire, le STP uniquement à vrai et le sécurisé à
faux, ce qui est excellent Nous avons donc défini avec succès le
jeton d'actualisation dans le SDDPolygogi. Dans la leçon suivante,
nous allons créer une route dans laquelle notre interface
envoie ce jeton d'actualisation,
nous vérifierons ce jeton, puis nous leur
enverrons un nouveau jeton d'accès.
111. Route de rafraîchissement pour le nouveau jeton d'accès [MISE À JOUR]: Maintenant, comme nous le savons, lorsque notre jeton
d'accès expire, front end envoie un jeton d'
actualisation à notre backend pour obtenir un
nouveau jeton d'accès. Mais la question est de savoir
sur quel point de terminaison, front-end enverra le jeton d'
actualisation. Nous devons définir ce point final. Ainsi, dans la
route de l'auteur, à la fin, nous ajoutons un point extérieur, un terminaison pour slash refresh
et une fonction de rappel avec demande et réponse De plus, cela n'est pas obligatoire. Nous devons définir un
itinéraire appelé rafraîchissement. Il s'agit simplement d'une
convention courante utilisée par les développeurs. Maintenant, dans cette fonction, nous
devons faire de petites choses. Tout d'abord, nous vérifions que le jeton d'actualisation est disponible dans
le cookie ou non. Pour accéder au cookie, nous utilisons un point de demande. Les cookies
pointent le nom du cookie, que nous avons
défini pour supprimer le jeton. Laisse-moi te montrer. Vous voyez,
c'est le nom de notre cookie. Nous devons maintenant
stocker cette valeur dans une variable appelée
user repress token. Et après cela, nous ajoutons
simplement une condition. Si le jeton de répression utilisateur n'
est pas disponible, nous renvoyons la propriété du message JSON
response point status 2401 point jeton
d'actualisation n' Et si nous obtenions
un jeton d'actualisation ? Nous devons simplement comparer
ce jeton d'actualisation avec
le jeton que nous enregistrons
dans la collection de notre utilisateur. La question est maintenant de
savoir quel utilisateur envoie
ce jeton d'actualisation. Pour cela, souvenez-vous que lorsque nous
créons un jeton d'actualisation, au moment où nous transmettons
ici l'identifiant dans le jeton. Ainsi, en utilisant cet identifiant, nous pouvons transmettre le jeton d'actualisation
stocké. Pour cela, nous écrivons
JWT point Verify. Tout d'abord, nous passons le
jeton d'actualisation, après cela, nous devons transmettre la clé
secrète qui est la clé jeton d'
actualisation du point de
traitement dotenv point Assurez-vous que nous ajoutons ici clé d'
actualisation du jeton, et
non un excès de Tgenkey Dans le cas contraire, aucun jeton ne
sera vérifié. Maintenant, cette expression renvoie la charge utile ou nous
pouvons dire les données Nous le stockons donc dans la
variable appelée utilisateur décodé. Supposons que ce jeton ne soit pas valide. Quelqu'un a modifié
quelque chose dans ce jeton Cette expression
peut
donc renvoyer une erreur. Nous pouvons donc adhérer, essayer d'attraper le blog
et simplement ajouter cette ligne dans le blog dr
et dans le blog de cache,
nous obtenons une erreur, et nous renvoyons simplement la réponse, le
point status 403, le point Jason et la propriété messet
à un jeton non valide et réprimé Supposons maintenant que nous obtenions un utilisateur décodé à partir du jeton et
qu'en l'utilisant, nous devions trouver le jeton utilisateur
stocké Le coût par utilisateur est donc
égal à un poids, point
utilisateur trouve par identifiant
et transmet ici l'identifiant de soulignement du point
utilisateur décodé Ici aussi, nous ajoutons une condition. Si l'utilisateur n'est pas disponible, nous renvoyons le statut du point de
réponse, 404 points Json et un message
à l'utilisateur introuvable. De plus, ici, pour utiliser await, nous devons ajouter de l'async
pour notre rappel Bien. Maintenant, si l'utilisateur est disponible, il suffit de
comparer le jeton. Maintenant, comme nous le savons,
dans notre collection, nous l'avons stocké sous forme de jeton Nous devons
donc le comparer la même manière que nous
comparons notre mot de passe. Pour cela, nous écrivons
wait, decrypt dot compare. Nous transmettons d'abord le jeton d'
actualisation utilisateur, que nous obtenons du cookie, puis nous voulons le comparer au jeton d'actualisation
par point utilisateur. Cette expression
renverra si elle est valide ou non. Nous le stockons donc dans une variable. Le coût est valide. Assurez-vous également que nous importons
B crypt dans ce fichier. Donc, au sommet, nous ajoutons les coûts. B crypt est égal à
require ici nous ajoutons Wikip. Revenons maintenant à notre itinéraire. Ici, après cela, nous devons
passer son état de santé. Si c'est valide, c'est faux, puis nous renvoyons le statut du point de
réponse 403 point JSn et le message pour
actualiser le jeton n'est pas valide Et si le jeton est valide, nous devons répéter exactement le même processus que celui que nous faisons une fois la
connexion réussie. Nous ouvrons l'API de connexion ici
après avoir comparé le mot de passe, C, nous générons un nouveau
jeton d'accès et un nouveau jeton d'actualisation, en tant que nouveau jeton d'
actualisation, mettons à jour le jeton d'
actualisation des points de l'utilisateur avec nouveau jeton, puis nous définissons le jeton d'
actualisation dans le cookie, et à la fin, nous
renvoyons le jeton d'accès Nous copions simplement ce code. Et collez-le dans
notre itinéraire de répression. Maintenant, ici, tout d'abord, nous avons besoin de cette fonction generate
to Cs. Nous pouvons saisir notre fonction
à partir du fichier de route de l'utilisateur, mais pour cela, nous devons modifier entrée dans le fichier JS à points d'index. Je ne veux pas
vous embrouiller. Nous pouvons
donc simplement copier cette fonction
generate vers C à partir d' ici et la coller
simplement dans le
fichier de sortie, et c'est Ici, l'
implémentation de notre itinéraire d'actualisation est terminée. Passons à cette API, enregistrez les
modifications et jetez-y un coup d'œil. Ouvrez Postman, ici nous créons une nouvelle demande appelée méthode de
jeton d'actualisation pour publier, et ici nous écrivons notre URL, STP,
colonne double pour
slash Local host, Column 3,000 slash APIs OT
parce qu'elle se trouve Actualisation par barre oblique. Il ne vous reste plus qu'à envoyer la demande. voyez, ici nous obtenons une erreur, impossible de lire les propriétés
de undefined Je pense que nous ne nous trompons pas dans le
jeton d'actualisation de l'utilisateur Permettez-moi d'essayer de créer un journal des points sur console. L'utilisateur reprime le jeton,
enregistre les modifications et renvoie la demande. voyez, ici, nous obtenons la même erreur, et si nous ouvrons notre code
via, vous voyez, nous n'obtenons pas le
jeton d'actualisation dans le journal de la console, ce qui signifie que nous n'obtenons pas le
jeton d'actualisation de l'utilisateur dans le cookie. La raison pour laquelle nous ne recevons pas cookie est que dans Node js, nous ne pouvons pas accéder directement à Cookie, même que nous ne pouvons pas
accéder directement aux données du corps de la demande. N'oubliez pas, pour accéder aux données
du corps de la demande, d'ajouter le middleware Express point
JN Pour Cookie également, nous devons ajouter un intergiciel qui
nous aidera à obtenir Cookie sur demande Pour cela, nous installons
un autre package Cookie parser, NPM installe Cookie, das
parser et appuyons sur Entrée. Bien. Maintenant, dans notre fichier index point Js, nous saisissons d'
abord le coût analyseur de
cookies qui est égal à
require cookie parser Et puis en bas, nous ajoutons app point ug, Cookie parser et appelons
cette fonction ici Sans cette fonction d'
analyseur de cookies, nous ne pouvons pas accéder
aux cookies par points de demande De plus, dans notre API de represe, je remarque que cet
utilisateur décodé est C'est parce que nous le définissons avec Cst dans le blog sec
et pour des raisons de coût, cet utilisateur décodé n'est
accessible que dans ce blog sec. Ici, nous voulons accéder à un utilisateur
décodé en dehors
du blog dri Donc pour cela, avant
ce Tyblog, nous définissons « let decoded user »
, puis nous supprimons ce coût Nous pouvons maintenant accéder à l'utilisateur
décodé ici, enregistrer les modifications
et y jeter un œil Envoyez la demande et voyez
ici que nous obtenons un utilisateur introuvable, ce qui signifie que nous n'obtenons pas de données
utilisateur. Laisse-moi vérifier. Ici, nous transmettons un identifiant de soulignement par point
utilisateur décodé. Permettez-moi de vérifier s'il s'agit d'une propriété
d'identifiant de soulignement ou non. Oui, vous voyez, dans le jeton
d'actualisation générateur, nous transmettons la propriété ID et
non l'ID de soulignement Nous le mettons donc à jour pour
souligner l'ID et la même manière, pour la fonction de génération de
jetons par
la route de l'utilisateur Enregistrez les modifications
et jetez-y un œil. Ici, si votre jeton a expiré, vous pouvez appeler l'
API de connexion qui définira le
nouveau jeton sur Koki Maintenant, envoyons à nouveau la demande d'
actualisation. Maintenant, en réponse, nous obtenons notre nouveau jeton excédentaire, et un nouveau jeton d'actualisation est également
défini dans le cookie de demande. Si nous envoyons à nouveau
la même demande, voyons ici que nous
obtenons les deux nouveaux jetons. Ceci est similaire à notre page
d'accueil actualisée. Si le jeton excédentaire expire,
alors notre appelle cette API d'actualisation, puis notre interface reçoit le nouveau jeton excédentaire
et le nouveau jeton d'actualisation.
112. OAuth avec deux jetons [MISE À JOUR]: Maintenant, mettons rapidement
à jour le code
Oth car ici, nous n'envoyons
également qu'un seul jeton. Comme vous pouvez le voir, nous
générons un jeton dans cette fonction de
rappel handle OT Maintenant, au lieu de
générer le jeton ici, nous pouvons utiliser notre fonction de génération de
jetons et transmettre ici les
mêmes données que celles-ci. Et maintenant, nous arrivons ici aux crochets
const cli, jeton
excédentaire et au jeton d'actualisation Maintenant, nous n'avons plus besoin de cette
variable de jeton, et après cela,
nous renvoyons simplement l'objet
avec un jeton en excédent
à un jeton en excédent, ou nous pouvons le supprimer et
actualiser le jeton pour actualiser le jeton. Maintenant, nous avons une chose. Ici, nous avons déjà les données des
utilisateurs. C'est bon Nous enregistrons le jeton d'actualisation
dans les données de l'utilisateur, sorte que nous n'avons pas besoin d'envoyer d'
autres données par requête. Ainsi, à partir de l'API de connexion de l'utilisateur, nous copions ces codes de cryptage et enregistrons également le jeton dans le point
utilisateur Refresh Token Et collez ce code dans le
handle ou la fonction de rappel. Maintenant, dans notre API Google Callback, nous obtenons
ici un objet à
la place du jeton, nous déstructurons le jeton excédentaire
et réprimons le
jeton Maintenant, avant de rediriger l'utilisateur
vers le front-end avec un jeton, nous devons définir le jeton d'actualisation
dans le cookie SDP uniquement Nous allons donc à nouveau à l'
API de connexion et copions cette méthode de cookie à points de réponse et la collons dans l'API
Google Callback Enfin, nous transmettons simplement
l'excédent de jeton à la place du togan. Maintenant, nous faisons de même
pour l'API de rappel de Facebook Ici, nous obtenons un objet
avec un excédent de jeton et on réprime le jeton et on colle
ici, le même Goki Ensuite, nous changeons simplement ce jeton par un jeton excédentaire,
et c'est tout. Dans la leçon suivante, nous verrons ce que nous devons faire pour créer
un logo pour l'utilisateur.
113. Route pour la déconnexion d'un utilisateur [MISE À JOUR]: Maintenant, pouvez-vous me dire ce qui
s'est passé lorsque l'utilisateur s'est déconnecté ? Si nous expirons le jeton excédentaire
depuis le front-end, alors dans le cookie SCTP uniquement, nous avons déjà un
jeton d'actualisation qui a une longue expiration Notre interface peut
exécuter à
nouveau l'API d'actualisation et obtenir les nouveaux jetons,
mais ce n'est pas ce que nous voulons. Nous voulons
déconnecter complètement l'utilisateur. Pour cela, nous devons
uniquement supprimer le jeton
d'actualisation du cookie SDDP uniquement et
de la collection de l'utilisateur Créons donc ici une nouvelle route, un point
externe, une barre oblique, un Log hut et une fonction de rappel ASN
avec demande Maintenant, pour supprimer le cookie, nous utilisons la méthode du cookie response point
clear. Nous transmettons ici le nom du cookie
que nous voulons supprimer. Nous transmettons ici un jeton d'actualisation, assurez-vous de vérifier nom de
votre cookie pendant que
vous le générez. Maintenant, cette méthode
supprimera le cookie refrestken, et elle fonctionnera lors de
la dégustation locale Mais lorsque nous voulons implémenter
cela en production, nous devons également ajouter
un objet avec des propriétés. Cette expression fonctionne
pour la production, mais elle peut parfois
poser des problèmes lors de la production. Il vaut mieux que nous transmettions les propriétés. Assurez-vous qu'il s'agit des
mêmes propriétés que celles que nous avons ajoutées lors de la création du
cookie. Copiez cet objet et dans notre cookie
transparent, nous le transmettons. Bien. Ensuite, nous renvoyons simplement le point de
réponse Json Object avec la propriété du message
déconnectée avec succès. Maintenant, avant de retirer le
cookie, c'est mieux. Nous supprimons également le jeton
d'actualisation de la collection de l'utilisateur. Pour cela, nous devons actualiser le
jeton du cookie, décoder l'ID utilisateur
du jeton, récupérer le jeton dans la base
de données, puis le supprimer Nous l'avons déjà
fait dans notre API d'actualisation. N'oubliez pas que nous pouvons simplement
copier ce code depuis cookie pour décoder l'utilisateur jusqu'à ce que
nous obtenions l'utilisateur Copiez-le et
collez-le simplement avant la méthode
Effacer les cookies. Maintenant, nous avons l'utilisateur. Il suffit de faire en sorte que le jeton d'actualisation du
point utilisateur soit égal à null. Ensuite, nous attendons que l'utilisateur enregistre le
point et c'est fait. Testons cette API de déconnexion. Dites les modifications. AUCUN facteur, ne dupliquez cette demande de
jeton d'actualisation Bien, modifiez le
nom de la demande pour créer un logo pour un utilisateur. Changez d'API et pointez
sur slash pour fermer la session. Maintenant, actuellement, nous
vérifions notre cookie. Voir qu'il est disponible ici. Maintenant, si nous envoyons cette demande de
déconnexion, vous voyez, nous nous déconnectons avec succès,
et si nous
vérifions à nouveau le cookie,
il disparaîtra d'
ici et si nous
vérifions à nouveau le cookie, il disparaîtra d' Voici donc comment fonctionnent l'enregistrement, la
connexion, la déconnexion et le jeton au
niveau de la production fonctionnent l'enregistrement, la
connexion, la déconnexion et le jeton De plus, les six dernières leçons
sont des leçons mises à jour. Donc, si vous ne voyez pas ce
code dans les prochaines leçons, ne
vous inquiétez pas. Tu peux suivre ces leçons. Je veux juste mettre
ces plaies à jour. Nous sommes donc en train
de déguster ce projet. Donc, si nous fixons l'excédent à
une durée de péremption de 5 minutes, il est très difficile à goûter. Donc, pour la dégustation uniquement, nous avons fixé la date de péremption à un jour. De plus, dans le
fichier de route de l'utilisateur en bas, nous transformons l'excédent en
un délai d'expiration d'un jour. En production, nous pouvons le
mettre à jour à 5 minutes.
114. Section 10 - Création du modèle de catégorie: Bienvenue dans la section dédiée du cours ultime de Node JS. Dans cette section, nous
continuerons à travailler sur notre projet de backend d'
applications de commerce électronique Nous ajouterons des fonctionnalités
intéressantes telles que ajout d'
images de produits dans le backend, autorisation basée sur les
rôles, requête de recherche
simple et rapide, et bien plus encore Commençons donc par cette section. Tout d'abord, dans notre application de
commerce électronique, nous voulons ajouter
des produits par catégorie. Si vous sélectionnez
la catégorie écouteurs, nous n'enverrons que les produits
dont la catégorie est écouteurs Pour cela, nous devons
définir un modèle de catégorie. Ainsi, dans le dossier des modèles, nous créons un nouveau fichier
appelé category point JS. Maintenant, dans ce
fichier, tout d'abord, Const Mongoose est équivalent
à require Après cela, le schéma des catégories de coûts est égal au schéma à points nu
mangos À l'intérieur de cet objet, nous
allons ajouter notre schéma. Maintenant, que souhaitez-vous ajouter
à cette collection de catégories ? Tout d'abord, nous avons besoin du
nom de la catégorie. Dans ce cas, nous aurons peut-être besoin de l'
icône de la catégorie. Ces propriétés dépendent de
la partie interface utilisateur du front-end. Nous voulons afficher des catégories
comme celle-ci avec des icônes, puis nous devons stocker ce nom de
fichier Cn dans notre base de données. Maintenant, dans notre application,
nous voulons faire une chose. Seul l'administrateur peut ajouter des
catégories dans notre base de données. L'utilisateur simple ne peut pas ajouter de
catégorie ni supprimer de catégorie. R, si dans notre application, nous avons plusieurs administrateurs, nous
pouvons ajouter ici le nom
d'administrateur C'est l'identifiant de cet administrateur. Mais ici, nous ne voulons pas stocker les informations d'administration afin de
pouvoir supprimer ce remplissage. n'avons donc que deux remplissages pour cette catégorie, modèle
ou collection. Nous ajoutons donc ici le nom
à l'objet, au type, à la chaîne requis pour vrai
et également unique pour vrai. Ensuite, nous voulons que le
nom de l'image de l'icône soit un objet, un type, une chaîne, car nous
voulons stocker le nom de l'image ici et lui donner la
valeur true, et c'est tout. Maintenant, de nombreux étudiants sont
confus lorsqu'il s'agit de stocker
une image dans le backend Laissez-moi vous expliquer la logique. Dans la base de données, nous ne pouvons pas stocker
directement les images. Nous faisons donc quelque chose comme ça. Supposons que l'utilisateur télécharge cette
image depuis le front-end. Sur le serveur principal, nous créons un dossier appelé uploads, dans lequel nous stockons l'image Nous avons maintenant téléchargé le fichier sur notre serveur avec le nom que nous voulons donner à cette image. Ensuite, nous stockons simplement le nom de l'image
dans la base de données. De plus, certaines personnes aiment
stocker le chemin complet de l'image, mais cela n'est pas
nécessaire dans ce cas, car nous stockons cette
image sur notre propre serveur. Il suffit donc de renseigner le nom de la catégorie et l'image
qui est le nom de l'image. Maintenant, après cela, nous pouvons créer un modèle basé sur ce schéma. La deuxième catégorie est égale
au modèle à points de Mongos. Tout d'abord, nous transmettons le nom
singulier de notre collection de catégories,
qui est catégorie. Ensuite, nous passons le
schéma, et à la fin,
nous modulons les exportations de points
égales à cette catégorie. Terminé. Dans la
leçon suivante, nous allons ajouter API pour créer une nouvelle
catégorie avec le téléchargement d'images.
115. Créer une nouvelle API de catégorie avec le chargement d'une image: Créons maintenant une
nouvelle API pour la catégorie. Pour cela, nous créons
un nouveau fichier dans le dossier Routes
appelé category point js. Dans ce dossier, que faisons-nous ? Écrivez, nous devons créer un
routeur en utilisant Express. Const Express est donc équivalent
à require Express. Et ensuite, const Router est
égal à express point Router. Et enfin, nous devons exporter ce routeur. Les exportations de points du module
sont égales à celles du routeur. Bien. Maintenant, avant d'
oublier d'ajouter cette nouvelle route dans le fichier JS à
points d'index, faisons-le. J'ai commis cette erreur
et j'ai essayé de tester mes API. Enregistrez ce fichier, accédez au fichier
index point js. Ici, nous importons des
itinéraires de catégorie, c'est équivalent à exiger ici que nous
accédons au dossier des routes et
dans cette catégorie. Maintenant, en bas, nous
utilisons app point g. Ici, nous définissons le préfixe, qui est la catégorie API slash Ensuite, au
deuxième paramètre, nous passons par des itinéraires de catégorie. Enregistrez ce fichier et revenez au fichier de routes des
catégories. Bien. Définissons maintenant l'API
pour créer une nouvelle catégorie. Nous définissons ici un nouvel itinéraire
à l'aide du routeur point post. 8.2 barre oblique,
et ici nous passons rappel avec la fonction flèche de
demande et de réponse Ici, nous voulons stocker l'image de l'icône avec
le nom de la catégorie. Donc, pour stocker l'image, nous avons besoin d'un package
appelé Multer. Il s'agit d'un
package très populaire pour stocker tous les types de fichiers dans
l'application Express. Beaucoup de développeurs ont
confondu Multer mais c'est vraiment
simple. Laisse-moi te montrer. Ouvrez le terminal et écrivez
NPM install Multer
au point 1.4 0,5 tiret ts et appuyez sur Entrée Bien, réduisez ce terminal. Maintenant, dans notre fichier, nous ajoutons d'abord Const ulter is equal
to require Multer Ensuite, nous
créons une variable appelée st upload is equal to here, nous appelons cette méthode Multer, et entre parenthèses,
nous devons passer l' objet
avec la propriété dest, qui est la destination Ici, nous devons spécifier
dans quel dossier ou chemin nous voulons stocker notre image. Nous écrivons la catégorie de téléchargement. Ainsi, les images de notre catégorie resteront dans un dossier séparé. Nous devons maintenant ajouter
cette méthode de téléchargement tant que middleware de notre API de publication Ici, nous ajoutons un point de téléchargement. Ici, nous avons de nombreuses
méthodes, comme le single. Cela
n'acceptera qu'un seul fichier. Aucun, cela n'
acceptera aucun fichier. A acceptera plusieurs fichiers. N acceptera tous les
fichiers et remplissages, ce qui accepte des remplissages
multiples spécifiques. Si vous souhaitez les
approfondir, vous pouvez consulter
sa documentation. Pour l'instant, ne t'inquiète pas pour ça. Ici, nous voulons accepter
et enregistrer un seul fichier. Nous utilisons ici une méthode unique. Maintenant, dans cette parenthèse, nous devons passer le nom du champ Supposons que nous passions ici, icône. Maintenant, depuis le front-end, nous devons utiliser la
balise d'entrée, taper dans le fichier, et dans le
champ du nom, passer le même nom qui est
C. Par ce nom complet, Malte sait quel fichier elle
doit enregistrer, et c'est tout. Multer enregistrera l'icône de
notre fichier dans la catégorie de
téléchargement du chemin de destination, et nous obtiendrons les
informations sur ce fichier dans le fichier point de
demande, et nous obtiendrons le reste
des données du formulaire dans le corps du point de demande,
comme précédemment Écrivons maintenant le reste
du code de cette API. Donc, tout d'abord,
nous ajoutons ici la condition I, vérifiera que le nom du
point du corps de la demande n'est pas disponible ou que le
fichier du point de demande n'est pas disponible. Ensuite, nous renvoyons ici le statut du point de
réponse, 400 pour le point JSON de mauvaise demande, et ici nous passons l'objet avec propriété du
message et
passons ici le message d'erreur, nom et l'icône sont requis.
Et si nous avions les deux ? Nous créons une nouvelle catégorie, constante, nouvelle catégorie
est égale à nouvelle Ici, nous avons besoin d'un modèle de catégorie. Donc, en haut, la
catégorie de coût est égale à exiger ici une catégorie de modèles
pliés. Bien. Maintenant, en bas, nous adhérons à une nouvelle catégorie, et ici nous passons l'objet avec les propriétés
de cette collection. Tout d'abord, nous ajoutons un nom au nom du point body point de
demande. Nous n'avons qu'un seul
remplissage dans le corps, c'est pourquoi nous ne déstructurons pas ce
remplissage comme avant Ensuite, nous passons l'image
au fichier point de demande. Et ici, nous voulons
enregistrer le nom du fichier, nous écrivons le nom du fichier. Si vous souhaitez enregistrer le chemin
complet du remplissage, vous
devez respecter,
demander le chemin à points du fichier. Nous pouvons également suivre le journal à points de
la console, demander un fichier point pour voir ce que nous obtenons dans le fichier point de
demande, afin de ne pas nous tromper. Ensuite, nous ajoutons wait, la
nouvelle catégorie point c, et vous savez ce que
nous devons faire maintenant. Oui, nous devons
faire en sorte que cette fonction soit destinée à utiliser await.
À la toute fin, nous envoyons une réponse avec des statistiques
à 01 pour le nouveau point de données Json. Ici, nous ajoutons un objet avec propriété
messet, la catégorie
a été ajoutée avec succès Au fur et à mesure que nous passons
de catégorie à une nouvelle catégorie. Nous allons maintenant tester cette API. C'est un peu différent car ici il
faut envoyer un fichier. Nous ne pouvons pas envoyer de fichier
au format JSON, nous devons
donc utiliser le formulaire ici, et nous ne pouvons pas non plus
télécharger de fichier à l'aide Thunder Client
car cette fonctionnalité n'
est disponible que pour les utilisateurs payants. De nombreux développeurs aiment Postman et n'aiment pas Thunderclient pour cette
raison Nous utiliserons Postman ici. Si vous ne connaissez pas Postman, je vais vous donner mon
précédent tutoriel pour un guide rapide du Postman Donc, pour télécharger le Postman, nous allons sur postman.com Ici, nous pouvons télécharger
cette application. Il suffit d'installer cette application. C'est vraiment simple. Voici à quoi il ressemble lorsque
nous l'ouvrons pour la première fois. Nous avons deux options créer un nouveau compte ou
se connecter avec un compte. Je me connecte rapidement avec
mon compte ici. Si vous vous inscrivez ou vous connectez, vous pouvez créer
ici une collection comme le client Thunder. Ici, nous créons une nouvelle collection
vierge. Caris et dans notre projet Cartws, nous ajoutons un nouveau dossier Si vous souhaitez
zoomer, appuyez sur Ctrl et plus
ou sur Command Plus. Dans ce dossier, nous
ajoutons une nouvelle demande, créons une nouvelle catégorie. Maintenant, tout d'abord, nous sélectionnons la méthode de
publication, l'URL vers STP, la
colonne double
barre oblique, l'hôte local, ABI de
la colonne 3 000 Maintenant, pour envoyer un fichier dans le
corps, nous allons dans le corps. Ici, nous sélectionnons les données du formulaire. Ici, nous obtenons la clé, qui est le nom de remplissage,
la valeur et la description. Pour commencer, nous ajoutons notre clé, qui est le nom complet
des ordinateurs portables, par exemple. Ensuite, nous saisissons notre nom complet
pour le fichier, et qu'est-ce que c'était ? N'oubliez pas que nous écrivons ici une icône. Donc là aussi,
il faut écrire une icône. Pour télécharger le fichier sur le côté
droit de la clé, nous obtenons du texte et une liste déroulante, qui est le type de contenu. Ici, nous sélectionnons Fichier, cliquons sur Sélectionner un fichier et sélectionnons un nouveau fichier sur
la machine locale. Maintenant, pour les icônes d'ordinateurs portables, allez dans le dossier des ressources, que vous avez téléchargé précédemment, ou vous pouvez également
le télécharger dès maintenant en dessous de cette leçon. Dossier de ressources, j'ai ajouté
un dossier pour le projet 2. Dans ce dossier, nous allons
dans le dossier des catégories, et dans celui-ci, vous obtenez
toutes les icônes de la catégorie. Sélectionnez le fichier
PNG à points pour ordinateur portable, puis ouvrez I. Maintenant, envoyons cette demande. Ici, j'ai une erreur. Désolé, j'ai oublié de
démarrer cette application. Notez donc que les points d'index sont bons. De plus, ici, je remarque que je fais cette erreur, le statut du point de
réponse. Enregistrez les modifications, retournez dans Postman et envoyez la demande voyez, nous obtenons ici
la nouvelle catégorie, les ordinateurs portables et l'image
sous ce nom aléatoire. Vérifiez également si notre fichier est enregistré dans le dossier de
téléchargement ou non. Vous voyez, ici, nous obtenons le fichier
avec ce nom de fichier aléatoire. Cela fonctionne donc, il
y a quelques problèmes. Ce fichier, sauvegardez sans son
extension comme point png, ou point JPG, etc. Sans extension, notre image ne
sera pas visible sur le navigateur. C'est le problème numéro un. prochain problème est là, nous pouvons télécharger n'importe quel type de
fichier, pas seulement des images. Supposons que par erreur,
quelqu'un télécharge ici un fichier PDF à points,
alors ce que nous ferons. Il faut donc ajouter un
filtre pour cela également. Seuls les fichiers à points png, jpg ou GIF à
points peuvent être téléchargés
pour ce remplissage d'image, et nous allons résoudre ces
problèmes dans la leçon suivante.
116. Définir le nom du fichier et le filtre dans Multer: Dans la leçon précédente,
nous avons deux problèmes. Nous n'obtenons pas d'extension pour notre fichier image ni pour
la base de données. Deuxièmement, nous ne pouvons pas
filtrer uniquement les images. Résolvons ce problème. C'
est vraiment simple. Permettez-moi de déplacer cette
catégorie au-dessus
du multer afin que nous puissions
le voir clairement Ici, nous ne transmettons que la propriété dest
dans la fonction multer. Mais à Multer, nous n'avons guère
plus de propriétés qu'un bureau. Supprimez cette destination et nous pouvons transmettre
ici la propriété
de stockage, l'exception de la propriété de stockage
sur disque multer Ainsi, au lieu d'
encombrer le co ici, nous pouvons le définir dans
une variable séparée Le coût du stockage est égal à celui du stockage sur disque à points
multiples. Dans ce cadre, nous pouvons définir comment et où les fichiers doivent
être stockés sur notre serveur. Nous passons un objet et
la première propriété est la destination où nous
voulons stocker notre fichier. Ceci sauf la fonction de rappel, qui a trois
propriétés, fichier de requête Il s'agit de l'objet
du fichier téléchargé, et CB est une fonction de rappel
permettant de spécifier le chemin de destination Fonction d'erreur ici, nous
appelons simplement cette fonction de rappel
à la première position, nous passons null, ce qui
correspond à une erreur Ensuite, nous passerons
notre chemin de destination, qui est la catégorie de téléchargement. Ce rappel définira la destination comme catégorie de
téléchargement. Si ce répertoire
n'existe pas, il faut le
créer manuellement. Mais nous avons déjà
ce dossier ici. Si ce n'est pas le cas, vous
devez créer ce chemin, le télécharger et le placer dans ce
dossier de catégorie de dossier. Sinon, Ulter nous
donnera une erreur. Maintenant, après la destination, nous pouvons également spécifier
ici la propriété
du nom de fichier. Cela accepte également la fonction de
rappel avec les trois mêmes propriétés, le fichier de
demande, le CB pour le
rappel et la fonction flèche Maintenant, dans cette fonction,
nous voulons définir le nom de
fichier spécifique et unique pour notre fichier. Nom de fichier unique car si
deux noms de fichiers sont
identiques, le dernier
remplacera la première image. Au lieu d'une image féminine, l'utilisateur obtiendra une photo masculine, et ce n'est pas ce que nous voulons.
Comme pratique courante, nous stockons l'horodatage dans
le nom du fichier comme ceci Premier horodatage, puis nom
du fichier avec extension. Ce sont presque tous les fichiers
qui auront un nom unique. SECCTTTmp est désormais égal
à date point. Nous obtenons ainsi
l'heure actuelle. Après cela, nous voulons
également faire quelque chose
dans le nom du fichier. nom SeconstOriginal est égal
au fichier. Nom original du point. Ainsi, nous obtiendrons
le nom original du fichier téléchargé,
comme
les points PNG pour ordinateurs portables. Maintenant, dans le nom du fichier, il
y a peut-être de l'espace, il vaut
donc mieux remplacer
cet espace par le tiret. Cela rendra notre
nom de fichier convivial pour les URL. Nous ajoutons la méthode Plex. Ici, nous ajoutons d'abord une expression
régulière et sa syntaxe est une double
barre oblique entre celles-ci, nous ajoutons une barre oblique arrière comme pour l'espace et plus pour un
ou plusieurs espaces blancs À la fin de l'expression
régulière, ajoutez G pour l'indicateur global, ce qui garantit que toutes les correspondances la chaîne sont remplacées, et
pas seulement la première. Ici, nous transmettons
le tiret en codes simples, ce qui signifie que tout l'espace
sera remplacé par un tiret. Et si dans le nom du fichier, nous obtenions également les caractères
spéciaux ? Nous devons également les supprimer. Nous ajoutons une autre méthode de remplacement. Tout d'abord, que devons-nous faire passer ? Expression régulière, et quelle est la syntaxe, double barre
oblique ? Entre celles-ci, nous obtenons une expression régulière pour obtenir
les caractères spéciaux. Ici, nous ajoutons A à Z, Alt A à Z de zéro à neuf. Maintenant, nous
voulons
également obtenir d'autres caractères
qui n'en font pas partie, et qui seront nos caractères
spéciaux. Pour inverser cela, nous l'encadrons entre crochets et après
le premier crochet, nous ajouterons Garret à la fin, nous ajouterons également G pour le drapeau mondial Nous voulons maintenant remplacer ces
caractères spéciaux par rien. Nous voulons simplement le supprimer. Nous n'ajoutons donc ici que
des codes sans rien. Ne vous inquiétez pas si vous
ne savez pas grand-chose sur les
expressions régulières, c'est bon. Maintenant, selon ces deux méthodes, si le nom de notre fichier est celui-ci, alors il sera ainsi. À la fin, nous allons mélanger cet horodatage et le nom du fichier
d'origine CB d'abord, nous passons null pour erreur,
et deuxièmement, nous réécrivons les balises.
Ici, nous ajoutons des crochets dollar
Cully, un
horodatage, des crochets dollar
Cully, le nom
original et c' original Nous définissons la destination
ainsi que le nom de fichier pour
notre fichier téléchargé. Maintenant, nous pouvons simplement transmettre cette variable de stockage ici
dans la fonction Multi. Notre premier problème est résolu. Nous passons maintenant au numéro deux pour appliquer le
filtre au fichier. Dans la fonction multer, nous avons une autre propriété
appelée filtre de fichiers Ici aussi, nous devons transmettre la fonction de
rappel afin pouvoir la définir dans
une variable séparée Le coût, le filtre de fichier est égal à la fonction de rappel avec
trois paramètres, requête ,
fichier et fonction d'erreur CB, et dans cette fonction, nous décidons si le fichier doit être accepté ou rejeté Ici, nous définissons d'abord une
variable, les types autorisés, qui est le tableau, et nous ajoutons
ici tous les types
que nous acceptons. Tout d'abord, les images GPG, qui sont à la fois des
points JPG et des points JPG. Puis image png, pour le png à points, et image GIF pour le GIF à points. Ici, on peut simplement
mettre la condition. Si le type While mime en provient, alors nous l'autorisons, sinon
nous le rejetterons Si vous autorisez les types, les points incluent
et entre parenthèses, nous transmettons le type de fichier point Mme Maintenant, vous pourriez vous demander
quel est le type de Mme ? type MIME signifie le type d' extensions de
messagerie Internet
polyvalentes, qui est une étiquette utilisée pour identifier le format
du fichier ou des Les applications ou les navigateurs
savent comment s'y prendre. Si nous téléchargeons un fichier PNG, le type
Mme sera
une barre oblique PNG, ou si nous téléchargeons un fichier PDF,
le type Mme sera une barre oblique
d'application PDF comme ceci Si le type Mme est disponible
dans le type autorisé, nous appelons la
fonction CB, et d'abord, nous transmettons null pour erreur et renvoyons
pour sauf le fichier. Maintenant, si le type M est
autre chose,
alors nous respectons ces types comme condition
et appelons la fonction Cb, et en cas d'erreur,
nous passons une nouvelle erreur, et ici nous passons un message d'erreur, un type de fichier
non valide, seuls les formats JPEG, PNG et GIF sont autorisés. Et pour rejeter ce fichier, nous ajoutons ici false. D. Maintenant, nous devons ajouter ici, fichier en filtre de fichier. Ici, nous résolvons les deux problèmes. Permettez-moi de vous montrer une autre propriété
utile de l'ulter. Ici, dans le multifonction, nous avons des limites qui
nous aident à limiter la taille du fichier. Imaginez que quelqu'un
télécharge
ici une icône de 10 mégaoctets ici une icône de 10 Nous n'avons pas besoin de 10
mégaoctets pour une petite icône. Nous pouvons limiter la taille de son fichier. Ici, nous transmettons la taille du fichier objet. Ici, nous devons transmettre la taille du
fichier en octets. Pour notre icône de catégorie, nous pouvons définir une limite de deux Mo, c'est largement suffisant, et pour la convertir en octets, nous en ajoutons 10 à quatre. Nous obtiendrons ainsi des kilo-octets
ou des Ko et encore une fois, 104. Nous allons ainsi convertir
ce Ko en octets. Et c'est fait. Nous allons maintenant tester cette API. Alors allez chez Postman et nous
avons déjà nos données pour les ordinateurs portables.
Envoyez cette demande. Regardez ici, nous n'obtenons pas de réponse. Mais si nous consultons notre dossier de catégories de
téléchargements, nous obtenons un nouveau fichier avec
notre nom unique Extension, notre image est en cours de stockage. Vérifions maintenant l'erreur et
si nous vérifions notre terminal, pouvons voir
ici que nous obtenons erreur de clé
dupliquée
pour les ordinateurs portables renommés. N'oubliez pas que dans la leçon
précédente, nous avons enregistré la
catégorie des ordinateurs portables avec ce nom de fichier aléatoire et
que dans le schéma de catégorie, nous avons défini la propriété du nom sur unique. Nous devons supprimer cette catégorie
précédente de Mongo Di B Compass Ici, il suffit de supprimer
ce document. Nous supprimons également les deux
images de notre serveur. Nous n'en avons pas besoin. Maintenant, nous envoyons
à nouveau la demande. Vous voyez, nous recevons ici un message de
réussite. Nous obtenons un bon nom d'image
et une image enregistrée
correctement sur notre serveur. Génial. Ajoutons maintenant
quelques catégories supplémentaires. Le
nom de la deuxième catégorie est donc celui des smartphones. Et pour cela, nous téléchargeons l'icône
du téléphone portable au format point png. Assurez-vous de
supprimer la première image. Dans le cas contraire, il enverra des
images. Envoyez la demande. Ensuite, nous avons la catégorie, montres
intelligentes et l'icône que nous
sélectionnons ici watch point png. Et envoie-le. Ensuite, nous
avons un casque et icône à un point PNG
et envoyons la demande Enfin, nous avons des
consoles de jeu et pour les icônes du jeu vidéo point PNG, envoyez-le
et c'est fait Dans la leçon suivante,
vous allez créer une API pour obtenir toutes les catégories
de notre collection.
117. Obtenir toutes les catégories API: Créons une API pour
obtenir toutes les catégories. C'est vraiment simple. Après l'API de publication, nous créons une nouvelle API, routeur point Gate forward
slash pour le point de terminaison, fonction de
rappel avec
réponse à la demande, fonction flèche Et dans cette fonction, nous obtenons d'
abord toutes les
catégories du modèle. Les catégories C sont donc égales à
un point de pondération et de catégorie. Et si vous souhaitez envoyer une catégorie
abrégée par nom de catégorie, nous
ajoutons ici la méthode de capture, et nous passons ici le nom de remplissage
par lequel nous voulons photographier,
qui est le nom, et nous
envoyons simplement les catégories
JCN à point de réponse Ici, nous devons également
faire en sorte que cette fonction soit active. Enregistrez les modifications et
goûtons à cette API. Allez donc voir le facteur
ou le client de l'appel d'offres. Nous ajoutons ici une nouvelle demande. Pourtant, dans toutes les catégories,
dans le point de terminaison, nous écrivons la catégorie d'API Local host
3,000. Sélectionnez la méthode Get et envoyez
simplement la demande. voyez, ici, nous avons catégories abrégées par
leur nom. Plutôt cool. Maintenant, si vous devez ajouter d'autres API, comme mettre à jour
ou supprimer la catégorie, vous pouvez également le faire. Cela dépend vraiment de vous pour le
moment, nous n'en avons pas besoin ici, donc je ne les crée pas.
118. Partager des images statiques depuis le serveur: Actuellement, pour les données relatives aux catégories, nous stockons l'image dans notre dossier de catégories
Upload Slush Mais comment notre navigateur peut-il
accéder à ces images ? Ils ne sont disponibles
que sur notre serveur. Pour accéder aux images
depuis le navigateur, nous devons partager les fichiers
image statiques de notre serveur. Je l'ai déjà fait dans la
section 5, leçon 4. C'est vraiment simple. Donc, indexez
le fichier point js ici après le
point express J et le middleware, nous ajoutons app point U. Ici, nous avions le préfixe
du chemin du fichier statique, nous l' avons
donc défini Maintenant, pour partager les
fichiers statiques depuis le serveur, nous devons utiliser un autre
intergiciel intégré appelé
express point Et dans cette fonction, nous devons transmettre le
nom du dossier que nous voulons partager. Téléchargez moins de catégories. N'oubliez pas qu'il s'agit
du préfixe de l'URL et du
chemin du dossier de nos fichiers statiques Enregistrez les modifications et
essayons d' accéder à cette image d'ordinateur portable. Copiez le
nom complet de cette image. Maintenant, allez dans le navigateur. Ici, dans l'URL, nous écrivons notre backend, Local host, colonne 3 000 Ici, nous devons ajouter le
préfixe pour le fichier statique, qui est la catégorie de barre oblique de téléchargement Nous passons ici la catégorie images, puis nous devons également écrire catégorie
Images dans l'URL du navigateur. Pour l'instant, nous nous en tenons à
la catégorie Upload, et là aussi, nous passons la catégorie Upload, et ici nous collons le nom
complet de l'image. Vous voyez, nous avons ici l'image. C'est ainsi qu'en utilisant cette URL, front-end
affichera ces icônes. Dans la
leçon suivante, nous allons créer un nouveau modèle pour les produits.
Ça va être amusant.
119. Exercice - Définir un modèle de produits: Il est maintenant temps de faire un
peu d'exercice. Vous devez définir le modèle
d'un produit. Dans ce modèle, nous
avons les
remplissages, à savoir les exemples de
données d'un seul produit. Vous devez concevoir vous-même un schéma pour ces remplissages, prendre votre temps,
résoudre cet exercice, puis quelle est la solution. J'espère que vous aurez résolu cet
exercice ou que vous essayerez de le résoudre. Donnez-vous le mérite pour cela. Résolvons maintenant cet exercice. Pour le modèle de produit, nous
créons un nouveau fichier dans le dossier des modèles
appelé products point js. Bien. Tout d'abord, le coût des mangues est égal
à celui des mangues requises Ensuite, nous définissons que schéma du produit de
coût est égal
au schéma à points de Nu Mongoose À l'intérieur de celui-ci, nous passons un objet
dans lequel nous définissons le schéma. La première propriété est le titre, que nous avons défini pour taper sur chaîne, obligatoire sur vrai, et fixons
également la
longueur maximale à cent. Maintenant, la description suivante
que nous voulons définir pour taper la chaîne requise sur true, et sa longueur minimale est
de 50 caractères. Ensuite, nous avons besoin d'un vendeur
qui met en vente ce produit. Ici, nous stockons l'ID du vendeur, donc le type d'objet sur le schéma de
points Mongoose Type de point Type de
point ID d'objet, référence à l'utilisateur doit être vraie Maintenant, vous vous demandez peut-être pourquoi nous n'utilisons pas ici une approche
hybride ? Pourquoi n'intégrons-nous pas de
données pour le vendeur ? Pourquoi conservons-nous l'identifiant du vendeur ? Ici, sur le front end, notre fiche de produits
ressemblera à ceci. Dans la liste des produits, nous ne voulons pas afficher
les coordonnées du vendeur. Si nous voulons afficher les informations du
vendeur, ici, nous pouvons également ajouter
ici le nom du vendeur et certains détails requis, mais ce n'est pas le cas ici. Vous devez penser ainsi
lorsque nous voulons plusieurs données
dans un seul appel d'API, plusieurs données signifient des données de produits
dans un seul appel d'API. Dans ces données, nous devons
afficher les
données de référence ou non. Si dans ces données, nous voulons
afficher des données de référence, il est préférable d'intégrer
ces données dans la collection Ainsi, notre API n'a pas besoin d'
exécuter une requête de saisie pour
chaque donnée intégrée À ce moment-là, nous pouvons
utiliser une approche hybride. Après cela, nous avons besoin d'une catégorie. Dites-moi maintenant quelle
approche nous utilisons ici, intégrée ou de référence. Bien sûr, nous utilisons votre référence car nous ne voulons pas afficher une
catégorie contenant plusieurs données. Nous avons juste besoin d'
une catégorie pour filtrer les produits. Encore une fois, nous utilisons votre type de
référence aux types de points du schéma
de points de Monaco point ObjectID Référence à la catégorie et
obligatoire à vrai. Ensuite, nous avons le prix. Ici, nous définissons le type sur nombre, obligatoire sur vrai
et moyen sur zéro. Évident. Ensuite, nous dupliquons cette ligne et modifions
ce prix en stock, qui correspond au nombre de produits
disponibles en stock. Ensuite, nous avons des images, qui sont le tableau, et dans celui-ci également, nous stockons le nom de
l'image sous forme de chaîne. La raison pour laquelle nous avons ajouté un tableau est que les produits peuvent
avoir plusieurs images Comme nous avions besoin que les images soient vraies. Cela permettra de s'assurer que notre produit
comporte au moins une image. Ensuite, nous avons les
derniers avis sur les propriétés, qui sont le tableau
des objets d'évaluation. Maintenant c'est intéressant. Dans le tableau des avis, nous voulons plusieurs objets d'avis. Nous devons définir le
schéma de cet objet. Ici, nous passons simplement
un objet, et
nous pouvons définir le schéma
de cet objet, comme nous le faisions précédemment. Dans cet objet, nous voulons trois utilisateurs d'informations
qui soumettent cet avis. Donc, je m'oppose, nous passons le type, schéma de points de
Mongos, les
types de points, le point, l'ID de l'objet, f à l'utilisateur et requis à True Ensuite, pour l'examen,
nous avons besoin d'une notation, donc c'est du type à un nombre, et nous avons également exigé une valeur vraie
et une valeur moyenne égale à zéro. Enfin, nous avons besoin d'une commande,
qui peut être une chaîne, mais nous n'ajoutons pas
ici required à true car tous les
utilisateurs n'ajouteront pas de commande. Ils aiment juste ajouter des étoiles. Maintenant, vous vous
demandez peut-être si nous ajoutons un nouveau produit,
est-ce obligatoire ? Nous devons ajouter ces avis ? Parce qu'ici on
passe, il en faut deux. La réponse est donc non. Il n'est pas nécessaire d'ajouter
des avis obligatoires. Cela est nécessaire pour
cet objet unique. Si nous essayons de saisir un
nouvel objet de révision, celui-ci doit avoir un ID
utilisateur et sa note. Dans le cas contraire, il n'en aura pas besoin. En gros, nous ajoutons
un schéma pour cet objet unique. Vous vous demandez peut-être également nous
pouvons intégrer les données des utilisateurs ici ? Oui, nous pouvons intégrer des données ici, mais imaginez que les utilisateurs
changent de nom d'utilisateur Il sera
alors très difficile de
rester cohérent avec ces données et de ne pas
trop vous soucier de la
conception de la base Presque toutes les entreprises ont une équipe chargée de concevoir la base de données, ou un développeur senior
concevra la base de données. Je
vous explique simplement pourquoi nous utilisons référence et pourquoi nous n'
utilisons pas d'approche intégrée. Je pense que cela
dissipera vos doutes. Ici, notre schéma est complet. Nous pouvons maintenant créer un
modèle à partir de cela. Le produit de coût est égal
au modèle à points Mongoose. Ici, nous transmettons le nom
singulier de notre collection,
qui est produit, puis nous
passons le schéma du produit, et enfin, nous
exportons ce modèle. Les exportations de modules sont donc
égales au produit.
120. Autorisation basée sur le rôle: Créons maintenant une API pour
créer un nouveau produit. Dans le dossier Routes, nous créons un nouveau fichier appelé
products point js. Nous devons maintenant créer un
nouveau routeur à l'aide d'Express. SecStepress est équivalent
à require Express. Ensuite, le coût, le routeur est égal
à express point Router. Enfin, nous devons
exporter ce routeur. Les exportations de points du module
sont égales à celles du routeur. Ajoutons maintenant ce nouveau routeur
dans le fichier index point js. Enregistrez ce fichier, accédez au fichier
index point js. Ici, le coût des
itinéraires de produits que nous importons est égal aux besoins. Nous allons dans le dossier Routes
et dans ces produits. Maintenant, en bas, nous
ajoutons le point g de l'application. Ici, nous définissons le préfixe, qui est API slash Et au deuxième paramètre,
nous distribuons les produits, enregistrons les modifications et revenons
à notre fichier d'itinéraires de produits. Ici, nous voulons créer une
API pour ajouter un nouveau produit. Donc, point post du routeur, API et point à point, glisse vers l'avant. Ici, nous nous assurons que seul l'utilisateur
connecté peut accéder à cette API. Nous pouvons donc ajouter ici Osmalware. Vous voyez ici, je reçois une suggestion automatique, et elle saisira automatiquement
Omdalware en haut Nous ajoutons maintenant la réponse à la demande
et la fonction flèche. Bien. Maintenant, avant de savoir
comment stocker l'image des produits, nous devons vérifier que seuls
les vendeurs peuvent ajouter des produits, pas les simples utilisateurs, uniquement les vendeurs,
et comment pouvons-nous le faire ? Nous utiliserons un intergiciel. Dans le dossier middleware, nous créons un nouveau fichier
appelé cheseller Maintenant, comme nous le savons, le
middleware est une fonction. Nous définissons const, check seller is equal
to request response, et next and arrow function Dans cette fonction,
nous devons vérifier si la règle utilisateur
est celle du vendeur ou non. S'il ne s'agit pas d'un vendeur, nous renvoyons une erreur. Je demande que l'utilisateur point n'
est pas disponible, ou que le rôle du point utilisateur de demande n'
est pas égal à celui du vendeur, puis nous renvoyons le statut du point de
réponse, 403 pour le JSON interdit Xs point. Et ici, nous ne transmettons l'objet à MeSetpProperty qu'aux vendeurs
refusés Si vous dépassez cette condition, ce qu'alors que nous pourrons les transmettre au prochain intergiciel
ou
au prochain Exportons maintenant cette
fonction à partir d'ici. Le module point exports est donc
égal à check seller. Donc, les changements. ce middleware après
le middleware orth dans l'API de nos Définissons
ce middleware après
le middleware orth dans l'API de nos
produits. Vous voyez, encore une fois, la saisie automatique fonctionne. Génial. Maintenant, voici
deux choses pour vous. La première est dans notre schéma utilisateur, nous ne définissons que deux valeurs
pour le rôle. Permettez-moi de vous montrer le fichier point js ouvert
aux utilisateurs. Ici, nous pouvons voir que nous
n'avons qu'un utilisateur et un administrateur. Nous devons également ajouter ici, vendeur, et enregistrer ce fichier. Maintenant, la deuxième chose
est : comment pouvons-nous obtenir rôle
utilisateur dans le rôle request
point user point ? Parce que dans le request point user, nous n'obtenons que les données que nous transmettons lors de la
génération du jeton. N'oubliez pas que nous
ne transmettons que deux propriétés underscore ID et name.
Voyons cela également. Un point utilisateur est acheminé ici
dans la fenêtre d'inscription à la fin,
C, nous ne transmettons que l'identifiant et le nom du trait de
soulignement Ici, nous devons également transmettre le rôle. Passez au nouveau rôle d'utilisateur. Bien. Toujours dans la connexion à la fin, nous ajoutons également le rôle ici
et ici nous devons utiliser rôle
user point car nous avons
déjà un utilisateur ici. Consultez les modifications. Maintenant, qu'en est-il de authentification
basée sur
Google et Facebook. Là aussi, nous ne transmettons que l'identifiant et le nom du
soulignement. Nous devons également adopter la règle. Sinon, notre compteur
de cave leur donnera une erreur. Donc, dans le fichier pothjs que nous
devons modifier ici, nous créons cette fonction commune
. C'est sympa. Vous voyez, en haut, nous
trouvons l'utilisateur, donc c'est facile pour nous. Ici, en bas, nous générons le jeton, nous ajoutons
donc ici role
à user point role. Et c'est fait. Nous avons apporté
toutes les modifications ici. Enregistrez les modifications
et laissez-moi fermer les
autres fichiers dans l'API des produits,
nous renvoyons simplement ici le
point de réponse SN le vendeur est là. Nous allons tester cette API. Tout d'abord,
ajoutons une API de connexion dans Postman car je ne
pense pas que
nous utiliserons également le client Tundar pour les produits nous utiliserons également le client Tundar Dans notre collection Cardwih, nous ajoutons un nouveau dossier
appelé users Et nous ajoutons ici une requête
appelée login a user. Tout d'abord, nous sélectionnons et
pointons sur la connexion de l'utilisateur de l'API. Assurez-vous que cette méthode
est configurée pour publier. Maintenant, pour les données,
il me suffit de les copier du
client Thunder vers Postman, sélectionner le corps du message, de le saisir brut et simplement les données ici
et d'envoyer la demande voyez, ici, je reçois un nouveau jeton, copiez-le et pour déguster
l'API des produits, vous allez créer un nouveau dossier
dans cartwdg appelé products Je pense que nous devons définitivement
passer au facteur. Lorsque j'ai commencé à faire des recherches
sur les scores à l'époque fonction de téléchargement de
fichiers est disponible dans la
version gratuite du client Tender. Mais maintenant, ce que nous pouvons faire, passer à Postman.
Je suis désolée pour ça. Ici, nous avons eu une demande appelée
créer un nouveau produit. Sélectionnez le point de terminaison pour lequel
l'API doit supprimer les produits, demande est publiée et
envoyez la demande Vous voyez, ici nous obtenons une erreur, un jeton
d'autorisation est requis. Désolé, nous n'avons pas passé le jeton
dans l'en-tête, passez aux en-têtes. Ici, nous ajoutons une autorisation,
et dans la valeur, ce que nous devons
transmettre en premier, nous ajoutons espace
d'erreur et nous collons
notre jeton JWT ici Maintenant, envoyons cette demande. Vous voyez, maintenant nous recevons
un autre message d'erreur, l'accès est refusé aux vendeurs uniquement. Donc, pour récapituler rapidement, nous
ajoutons un intergiciel pour vendeur après l'Othmdalware,
car par orthomdalware, nous obtenons Si le jeton est vérifié et que la règle de l'
utilisateur est le vendeur, seule la fonction vendeur
Moware nous
permettra d'entrer
dans l'API du produit C'est ainsi que nous pouvons effectuer une autorisation basée sur des
règles. Pour accéder à cette API, nous devons transformer notre
compte courant en compte du vendeur. Ainsi, lorsque Mongo Di
passe ici dans la collection de
l'utilisateur, trouvez le compte
par lequel vous vous connectez et changez
sa règle en tant que vendeur Assurez-vous qu'il s'agit du vendeur, pas des vendeurs. Nous devons maintenant
générer un
jeton d'API de presse car nous
modifions nos données. Envoyez la demande de connexion, copiez ce jeton dans l'API des produits. Ici, dans l'en-tête, nous remplaçons l'ancien jeton
par le nouveau jeton Barrer space Maintenant, envoyons la demande. Vous voyez, le vendeur
est là. Charmant.
121. Autorisation personnalisée basée sur le rôle et: Auparavant, nous avions
ajouté l'API des catégories. Ici, nous n'avons pas
vérifié le rôle de l'utilisateur pour l'ajout d'
une nouvelle catégorie. Ici aussi, nous voulons. Seul l'administrateur peut ajouter des catégories. Il y a donc deux options pour nous. Nous pouvons créer un nouveau middleware, identique à ce middleware check
seller,
ou nous pouvons créer
un nouveau middleware ou nous pouvons créer
un nouveau middleware qui vérifie n'importe quel Si dans ce middleware, nous passons admin, il ne
devrait autoriser que Nous passons le vendeur, alors il ne
devrait autoriser que les vendeurs. Les deux options sont bonnes. Cela dépend vraiment de vous de
ce que vous voulez choisir. Laissez-moi vous montrer les deux. Pour Admin, nous copions simplement le code complet
du fichier check seller, et dans le dossier middleware, nous créons un nouveau fichier
appelé check admin point gs, et nous collons simplement ce code Maintenant, nous
devons apporter de petits changements. Tout d'abord, nous changeons le nom de
cette fonction. Sélectionnez ceci, appuyez sur F
deux et écrivez check admin. Ensuite, nous devons changer cette condition, le rôle en admin, et également dans le
message d'erreur admin only, et nous sommes prêts avec
notre intergiciel d'administration Nous pouvons ajouter ce
middleware dans notre API après Osmalware, tout
comme nous ajoutons Maintenant, laissez-moi vous montrer comment créer une
vérification des règles générales ou un intergiciel C'est vraiment simple. Dans
le dossier middleware, nous créons un nouveau fichier
appelé check role point js Ici aussi, nous pouvons simplement coller le même code et changer nom de
cette fonction
pour vérifier la règle. Maintenant, vous pourriez vous demander comment pouvons-nous
passer une règle dans cette fonction ? Parce que comme nous le savons, à
la place du middleware, il suffit d'
ajouter cette fonction et d'appeler
cette fonction de rappel Ici, nous ne pouvons faire qu'une chose. Nous pouvons ajouter ici une
autre fonction de flèche. Ainsi, après le signe égal, ajoutez le paramètre de rôle
, puis la fonction flèche. Donc, avant d'ajouter
cette fonction de flèche, pour accéder à ce rappel de
réponse à la demande, nous devons appeler la fonction
Jack rule Maintenant, après avoir ajouté
cette fonction de flèche pour accéder à ce rappel de
réponse à la demande, nous devons appeler la fonction
Jack Rule Ici, nous passons la règle de
l'utilisateur, disons admin. Et après cela, nous l'
appelons simplement une fois de plus. Et ainsi, nous pouvons accéder à ce rappel de
réponse à la demande C'est ce qu'on appelle une fonction
d'ordre supérieur. Une fonction d'ordre supérieur est
une fonction qui renvoie une autre fonction ou prend
une autre fonction comme argument. Ici, nous renvoyons cette fonction de rappel dans
cette fonction de règle de vérification En syntaxe simple, cela
ressemble à ceci. Voici la fonction de règle de vérification, renvoie simplement
cette fonction de rappel C'est pourquoi nous appelons
check rule pour la première fois, puis nous devons l'appeler à nouveau pour accéder à cette fonction de
retour. J'espère que cela dissipera vos doutes. Ici, nous pouvons remplacer cette chaîne de vendeur par
un paramètre de règle. Et ici, pour les messages
d'erreur personnalisés, nous convertissons ces
codes en backdigs, et sur le site du vendeur, nous ajoutons dollar role
et c'est tout Nous pouvons maintenant utiliser ce middleware de vérification de
règles personnalisé avec n'importe quel type de rôle Cela
dépend donc vraiment de vous si vous aimez utiliser Check Seller et
Check and Midleware,
ou si vous aimez utiliser le middleware Check Rule J'aime utiliser ce middleware de règles de
vérification. Dans l'API des produits sur le
site de check seller, nous devons appeler le middleware check
Rule Et ici on passe la règle du vendeur. Ce vendeur de règles de vérification est identique à l'intergiciel de vendeur Les deux appellent ce rappel de
réponse à la demande Maintenant, pour les catégories,
je souhaite également vérifier le rôle en tant qu'administrateur. Dans l'itinéraire des catégories, nous voulons ajouter un intergiciel pour créer un nouvel itinéraire de
catégorie. Voici maintenant une
question. Pourquoi devrions-nous ajouter un intergiciel de vérification des rôles Avant ou après le
téléchargement de ce multer ? Bien, nous l'ajoutons avant cette méthode de téléchargement multer car nous vérifions d'abord la règle S'il s'agit d'un administrateur, nous stockerons l'image de l'
icône sur notre serveur. Nous ajoutons le middleware Jack Roll
après la méthode ulter, puis il
stockera d'abord l'image
sur notre serveur,
puis vérifiera Nous ajoutons donc un
intergiciel Check Roll avant cela et nous passons ici le rôle De plus, avant de vérifier le middleware
Roll, nous devons ajouter le middleware Auth,
car sans cela, comment pouvons-nous obtenir les informations
utilisateur
dans le point de requête utilisateur dans Enregistrez les modifications et
goûtons à l'API de nos produits. Envoyez cette demande,
et ici je reçois une erreur. Laissez-moi vérifier. Il s'agit d'une erreur
dans le fichier de rôle de vérification. Oh, désolé, j'ai oublié de
supprimer cet appel de fonction. Consultez les modifications et
renvoyons la demande. Vous voyez, le vendeur est là. Cela signifie que notre
intergiciel fonctionne. C'est ainsi que nous pouvons utiliser ce middleware de règles de vérification pour tout type d'autorisation
basée sur des règles
122. Gestion de plusieurs images de produits: Avant d'enregistrer les données réelles des
produits dans la base de données, créons une méthode de téléchargement multiple pour stocker plusieurs images de
produits. Ici, le vendeur peut télécharger au moins une image ou au maximum
huit ou dix images. Donc, à partir de la route des catégories, je copie simplement ce filtre
de fichier de stockage, télécharge les variables et le
colle devant l'API de
nos produits. Bien. Maintenant, tout d'abord, nous devons importer le package
Multar Donc, cost ulter est égal
à require multer. Nous pouvons également supprimer cette importation de
middleware de Jag Seller. Nous n'en avons pas besoin. Maintenant, nous devons apporter de
petits changements. Tout d'abord, nous modifions la destination pour télécharger les produits Slash Nous pouvons ainsi nous assurer que les images des
produits sont séparées
de l'icône de catégorie. Et comme nous le savons, multer ne
crée pas de répertoire par lui-même, nous devons
donc le créer Dans le dossier de téléchargement, nous créons un nouveau dossier
appelé products. Ici, nous allons stocker l'image de
nos produits. Ce sont de petits détails
que nous devons garder
à l'esprit lorsque nous
travaillons avec Nod Jas Au fur et à mesure que vous travaillerez sur Nod Jaz, vous saurez toutes ces choses Ne t'inquiète pas pour
ça. Maintenant, après cela, le nom du fichier est correct. Le filtre de fichiers est également correct. Si vous souhaitez
également stocker des vidéos, nous devons
ajouter ces types MM dans le tableau des types autorisés. Pour l'instant, nous n'en voulons pas, et la limite de taille est de deux Mo, ce qui est également acceptable. Ici, vous pouvez vous demander que
cette limite de deux Mo s'applique à la taille combinée de toutes les images. Non, c'est pour chaque taille d'image, pas pour les tailles combinées. Ajoutons maintenant cette
méthode de téléchargement dans cette API. Après le middleware jackrll,
ajoutez un point de téléchargement, nous voulons stocker
plusieurs images Nous pouvons
donc utiliser ici le tableau point
unique pour un seul fichier, et le tableau de points Maintenant, il faut passer le nom du
fichier pour ces images. Ici, nous l'avons réglé sur des images. Ainsi, depuis le front-end,
ils doivent envoyer toutes les images des produits dans
les images uniques remplies. Nous verrons que lorsque
nous goûterons à cette API,
maintenant, après avoir passé
le nom du champ, nous pouvons dépasser la
limite des fichiers. Quel est le nombre maximum
de fichiers que nous voulons stocker ? Pour une application de commerce électronique,
huit suffisent amplement, mais vous pouvez également ajuster
ce nombre en fonction de vos besoins. De plus, si vous ne
souhaitez pas définir la limite maximale, nous n'avons pas besoin de transmettre
le deuxième paramètre. Mais ici, nous voulons huit images. Maintenant, comme nous l'avons
vu précédemment, nous obtenons les informations du fichier dans
le fichier point de demande car
il n'y a qu'un seul fichier. Mais ici, nous avons affaire
à plusieurs fichiers, nous allons
donc obtenir les données de
ces fichiers dans les fichiers à points de requête au pluriel Nous allons ainsi récupérer le nom de chaque
fichier dans la base de données. Nous pouvons également créer ici une fonction ultime
commune, mais cela créera une confusion
inutile C'est pourquoi nous le laissons tel quel. Dans la
leçon suivante, nous allons stocker les données des produits
dans la base de données.
123. Créer de nouveaux produits Products: Stockons les
détails du produit dans la base de données. Donc, tout d'abord,
dans ce rappel, nous obtenons tous les champs que nous
allons transmettre dans le corps du point de
demande Le coût des paquets CLI est donc
égal au corps du point de demande. Maintenant, tout d'abord, dans
ce corps, nous obtenons le titre, la
description, la catégorie, qui est l'identifiant de la catégorie, le
prix et le stock. Maintenant, après cela, nous devons
créer un tableau d'images, qui est le tableau des noms d'
images, et comment
pouvons-nous l'obtenir ? Nous obtenons donc tous les détails des images dans le tableau des fichiers à points de requête, et chaque donnée d'image est disponible
dans l'objet comme suit. Et ici, nous obtenons un nom de fichier. Nous pouvons donc le faire. Le coût des images est égal à celui des fichiers à points de
demande (point MAP). Ici, nous obtenons la fonction de flèche de chaque
objet image et nous renvoyons simplement le nom du fichier
image point par point. Ce nom de fichier est celui que nous avons
généré en haut. Maintenant, par cette méthode cartographique, nous obtenons le tableau des noms d'images. De plus, les vendeurs
oubliaient parfois d'ajouter des images. Nous pouvons mettre ici une condition si longueur
des points des images
est égale à zéro. Si c'est vrai,
nous renvoyons simplement statut du point de
réponse,
400 points JSON. Et ici, nous transmettons une erreur dans
un objet avec une propriété désordonnée. Au moins une image est requise. Nous avons maintenant
toutes les informations. Stockons rapidement
ces informations dans la collection de produits. Coût, un nouveau produit est
égal à un nouveau produit. voyez, ici nous obtenons l'autorisation, produits du modèle, en bon état, et ici nous transmettons un
nouvel objet de produit. Dans cet objet, titre par
titre, et comme nous le savons, si la propriété de l'objet et le nom de la
valeur sont
identiques, nous pouvons simplement le supprimer. Les deux fonctionnent de la même manière. Ensuite, de
la description à la description, la catégorie, du prix, du stock, des images. Et maintenant,
nous devons enfin stocker le vendeur. Comment pouvons-nous trouver ce vendeur ? point de demande identifiant de soulignement point point utilisateur car notre Osmitalware définit C'est vrai, nous pouvons utiliser l'
identifiant de soulignement point point utilisateur car notre Osmitalware définit les détails d'utilisation
dans l'utilisateur du Comptons les remplissages pour voir s'il vous
manque des remplissages ou non. Un, deux, trois, quatre, cinq, six et sept. concerne le schéma du produit,
nous avons également un, deux,
trois, quatre, cinq, six ,
sept et 80 avis, que nous n'ajouterons pas maintenant Nous sommes
donc sur
la bonne voie. Maintenant, sauvegardons ces données. Attendez le point
c du nouveau produit pour utiliser await, nous devons faire en sorte que cette fonction
soit maintenant en bas,
renvoyons le statut du point de réponse à 01 point GSN, et ici nous envoyons les données des
nouveaux produits Enregistrez les modifications,
moins cette API l'est. C'est vraiment passionnant. Dans le dossier des ressources, j'ai ajouté un projet à un
autre, et dans celui-ci, vous
obtiendrez le dossier Produits, lequel j'ai ajouté des images de
produits par catégorie, et vous obtiendrez également
le fichier GSN à points de données Dans lequel j'ai ajouté le titre, la description et
tous les autres détails. Ouvrez ce point de données
JSNFle dans le code VS. Vous voyez ici, j'ai ajouté le
nom de la catégorie en haut, et dans la liste des produits, j'ai ajouté toutes les données des produits
avec le titre, la description, prix, le stock, l'image est le nom, afin que vous puissiez rechercher une image par ce biais. La raison pour laquelle je n'ajoute pas d'identifiant de catégorie
ici,
car chaque identifiant de catégorie peut être
différent car auparavant, nous ajoutions la catégorie manuellement. Voici la
catégorie de mon smartphone et voici son identifiant. Vous pouvez le comparer à votre identifiant de catégorie.
Ça ne peut pas être pareil. Copiez cet identifiant, accédez à Postman,
ici, accédez d'abord aux données du formulaire Ici, nous
ajoutons simplement une catégorie clé, et en valeur, au-delà de l'identifiant de
catégorie des smartphones. Ensuite, nous devons ajouter le titre, puis la description,
le prix et le stock. Je copie tous ces détails un par
un à partir du fichier JSON
et je les colle ici. Sélectionnez d'abord le titre,
collez-le ici, la description. Le prix est de 1299 et le
stock est de huit. Donc, passez la description, prix 1299, soit le
dollar américain, et l'action à huit Nous devons maintenant ajouter uniquement
des images pour ce produit. En bas, nous ajoutons
une autre image clé. Ici, nous sélectionnons le type de fichier, et maintenant nous sélectionnons les images de notre
iPhone 14. Allez donc dans le dossier Produits, smartphones, et nous allons dans
le dossier iPhone 14 Pro. Ici, sélectionnez toutes les images 1 à 4. Maintenant, envoyons ces données. Vous voyez, c'est ici que nous obtenons ces
nouvelles données sur les produits. Ici, nous avons la catégorie des vendeurs, noms des
images dans un tableau, et également dans notre backend, dans
le dossier de téléchargement des produits, nous obtenons ces images. Nous avons fait un excellent travail. J'ajoute les
détails de tous ces produits dans ma base de données. Lorsque nous exécutons la
requête du produit GD avec pagination, nous
obtenons plus Vous pouvez également ajouter tous les produits dans votre base de données si vous le souhaitez. Sinon, vous pouvez
simplement ignorer cette partie. Maintenant, je copie le
titre du produit suivant, je le colle ici. Ne touchez pas à l'identifiant de la catégorie car nous sommes toujours
dans la même catégorie. Descriptif. Collez-le ici et le prix est de 399 et le stock à 50. Maintenant, sélectionnons les images
pour Samsung a 54. Envoyez cette demande.
Bien. Ainsi, vous pouvez ajouter tous les produits
ou au moins dix produits. Modifiez simplement l'identifiant de catégorie lorsque vous modifiez la
catégorie du produit. Je sais que c'est ennuyeux, mais nous pouvons utiliser ces données pour
tester notre API get products. Alors mettez de la musique relaxante
et créez ces produits. C'est ce que je
fais également, à la prochaine leçon.
124. Obtenir toutes les données des produits: Dans la leçon précédente,
nous avons donc ajouté des produits
dans la base de données. Vous voyez, j'ai ajouté les 24
produits dans la base de données. Passons maintenant à ces
produits par le biais l'API, car c'est ainsi que Front
Ten obtiendra ces données. Ainsi, après l'API de publication, nous ajoutons le point de routeur Get et
le point to forward slash Maintenant, nous n'
ajoutons aucun intergiciel car nous voulons que tous les utilisateurs
puissent voir tous les produits, pas seulement les utilisateurs connectés Nous ajoutons donc directement ici rappel
final avec
demande et réponse Bien. Maintenant, ici,
nous obtenons d'abord tous les produits, donc const products est égal
à products dot find Nous ne posons aucune condition ici car nous voulons tous les produits. Et ici, nous devons ajouter
wait for the query. Et pour wait, nous ajoutons ici
async et à la fin, nous renvoyons
simplement le point de réponse JCNPducts En ce qui concerne les modifications, nous allons tester
cette implémentation. Chez le facteur, nous créons une nouvelle demande dans la
collection de produits, les produits G A. Ici, nous saisissons le
point de terminaison des produits APIs, sélectionnons Method to G et envoyons
simplement la demande. Ici, nous obtenons toutes les données sur les
produits dans un tableau. Et dans ce tableau, nous obtenons un objet pour chaque produit
avec tous les champs. Maintenant, ma question est la suivante : avons-nous
besoin de tous les détails ici ? Pouvons-nous réduire
la taille des données que nous envoyons
depuis le back-end ? Si nous survolons cette taille, nous obtenons la taille de la réponse avec l'
en-tête et le corps séparés Notez la taille actuelle
des données de 14,39 Ko. Maintenant, laissez-moi vous montrer à quoi devrait
ressembler
notre page de produits dans le front-end. voyez, nous avons ici la
liste de tous les produits, et elle est presque similaire à
Amazon ou à n'importe quelle application de
commerce électronique. Si vous prêtez attention
à la fiche des produits, nous n'avons pas vraiment
besoin de tous les détails. Écrivons les remplissages que nous voulons afficher dans
la fiche des produits. premier est un identifiant pour identifier le
titre du produit, le prix, stock si les produits sont en stock, ce n'est qu'alors que nous affichons le bouton «
tête vers carte ». Ensuite, bien sûr, affichez l'image, qui sera la première
image du tableau d'images. Ensuite, nous avons besoin de détails sur les
avis, et c'est tout. Dans notre requête, nous ajoutons une méthode de
sélection pour sélectionner les remplissages. Maintenant, au lieu d'ajouter le nom de
tous les remplissages, nous pouvons écrire les
remplissages que nous ne voulons pas. Pour cela, il suffit d'ajouter ou de
réduire avant le nom de ce champ. Nous n'avons pas besoin de description. De plus, nous ne voulons pas
afficher le vendeur. n'est pas non plus une catégorie, et nous ne voulons pas souligner le point
V. Ce n'est pas nécessaire Voici les modifications
et jetez-y un coup d'œil. Envoyons à
nouveau la même demande et vérifions la taille. Vous voyez, il est réduit d'un tiers parce que la description contient plus de
données que tout autre champ, et c'est pourquoi nous supprimons les remplissages
inutiles. Rendons maintenant ces
données plus précises. Ici, nous ne
voulons pas non plus toutes les images. Nous voulons juste que la première image
apparaisse sur la couverture. Il existe maintenant deux
solutions pour cela. La première est que nous pouvons
créer un modèle de remplissage distinct pour
nos produits, comme une image
d'affichage ou une image de couverture. Lorsque nous stockons le nouveau
produit, dans ce champ, nous stockons le nom de la
première image. C'est une solution. Une autre solution consiste à
extraire le nom de la première image de chaque produit et à l'ajouter dans le même objet de produit que
celui que nous envoyons
depuis le back-end. De cette façon, nous n'avons pas de problème de duplication
des données. Vous voyez, les deux solutions sont excellentes. Ici, nous ne pouvons pas appliquer la première solution car
nous avons ajouté tous les produits. Je vais vous montrer la deuxième
solution, qui est également excellente. Tout d'abord, nous
écrivons ici la carte des produits. Nous avons maintenant
un seul produit , un objet
et une fonction de flèche. Maintenant, comme nous le savons, quel que soit le résultat de cette fonction, ce sera l'élément
du nouveau tableau. La logique est que nous retournerons toutes les données que nous avons
dans un seul produit, puis nous ne voulons pas
envoyer le tableau d'images Nous remplacerons
donc cette
propriété d'images par le premier élément
des images. Nous voulons un tableau d'images, lorsque nous n'ajoutons pas une nouvelle
propriété du même nom, nous pouvons lui faire afficher une
image ou autre chose, mais ici nous ne voulons pas
envoyer de tableau d'images. C'est pourquoi nous
donnons le même nom. Laisse-moi te montrer. Ici,
nous renvoyons l'objet. Dans ce document,
nous allons tout d'abord ajouter toutes les propriétés d'un seul opérateur de diffusion à
l'
échelle du produit. Nous ajoutons toutes les propriétés d'
un seul produit tel quel. Ensuite, pour remplacer
la propriété images, nous ajoutons ici des images
et ici, en tant que valeur, nous définissons le point du produit Images, premier élément, qui
est l'indice zéro. Terminé. Maintenant, cette
méthode cartographique renverra un nouveau tableau contenant tous les objets de produit
uniques mis à jour. Nous le stockons dans une variable
appelée produits mis à jour. À la place des produits,
nous renvoyons simplement les
produits mis à jour en réponse au point JSO Enregistrez les modifications et
voyons si nous l'obtenons
correctement ou non. voyez, nous avons ici un objet
étrange et à
la fin de chaque objet, nous obtenons cette propriété
images, qui signifie que notre
méthode cartographique fonctionne. Mais pourquoi obtenons-nous
cet objet étrange ? Const
dot log ce
tableau de produits et Al dans le point de
réponse json, nous envoyons à nouveau un objet products Enregistrez les modifications et
envoyons la demande. voyez, ici, nous obtenons la gamme de produits normale
et revenons au code VS, le terminal
ouvert, et nous voyons ici que nous obtenons la
même gamme de produits. Essayons maintenant de déplacer cette ligne de
console dans la méthode map. Et à la place des produits, nous enregistrons
le produit unique sur console. Enregistrez les modifications et
envoyons la demande. Un terminal, S,
nous retrouvons ici l'objet normal d'
un seul produit. Je pense que lorsque nous
ajoutons un opérateur de propagation, lorsque nous obtenons les propriétés de
cet objet, au lieu d'un seul produit, nous l'enveloppons dans l'objet et
ajoutons ici un opérateur de propagation. Faites les modifications et envoyez la
demande. Retour à VSCode Vous voyez, nous voici en train d'obtenir
cet objet étrange. Qu'est-ce qui se passe ici. Cela se produit donc lorsque nous
obtenons des données avec des mangues, nous n'obtenons pas un simple objet
Javascript Nous obtenons l'objet de document Mongoose, qui inclut à la fois les données brutes du
document dans le chien et des propriétés
et méthodes supplémentaires telles que dollar underscore
underscore, dollar is new fourni par Mongoose pour Maintenant, le problème est que nous ne
voulons pas de ces propriétés
et méthodes. Je veux un
objet JavaScript simple provenant de la base de données, pas un objet de document mangos Pour résoudre ce problème, il suffit
d'ajouter une propriété à la
fin de cette requête. Cela supprime toutes les propriétés spécifiques supplémentaires aux
mangues. Nous pouvons maintenant renvoyer ici les
produits mis à jour dans la réponse. Enregistrez les modifications
et jetez-y un œil. Envoyez cette demande et voyez, ici nous remplaçons le tableau d'images
par le premier nom d'image, et si nous vérifions la taille de nos
données, réduisons-en davantage. Charmant. C'est ainsi que nous
déboguons et trouvons l'erreur Maintenant, voici aussi la seule chose. Ici, nous envoyons un tableau
complet des critiques dans lequel nous avons un objet
qui a les détails d'utilisation, la note et également des commentaires. Actuellement, pour tous les produits, nous n'avons aucun avis. C'est pourquoi nous ne pouvons pas
voir ces données volumineuses. Également sur le front-end, nous voulons simplement
afficher la moyenne des notes et le nombre total de notes. Nous pouvons également remplacer le
tableau des avis par deux propriétés uniquement. Laisse-moi te montrer. Nous retirons cette console. Nous n'en avons pas besoin. Tout d'abord, créez un nouveau coût
variable. Le nombre d' avis est égal au
produit point par point par point par point LNT. Ici, Jack, tu as des
critiques ou des critiques. J'ai une critique, donc je m'en tiens
à la critique du produit. Maintenant, comment trouver la moyenne ? La moyenne signifie essentiellement
que nous devons additionner tous les nombres d'évaluations et diviser par le
nombre total d'avis. Nous définissons une nouvelle
variable Cast sum of ratings is equal to
now pour additionner les notes, nous utilisons reduce, qui
est une méthode matricielle. Révision des points Badu, qui
consiste à réduire les points du tableau. Nous avons maintenant deux paramètres. Le premier est le total, ou on peut dire la somme, et le second est la valeur actuelle, qui est une évaluation unique. Et que souhaitez-vous
faire dans ce rappel ? Il suffit de faire la somme et de
vérifier la lecture par points. Ensuite, dans le
deuxième paramètre, vous pouvez définir la
valeur par défaut de cette somme, que nous avons fixée à zéro. Cette méthode réduite
prendra deux arguments. La première est la fonction de rappel, que nous utilisons pour effectuer certaines opérations
mathématiques, et la seconde est la
valeur par défaut du paramètre sum Nous avons maintenant la somme des notes, note moyenne des
coûts est
égale à la somme des notes, divisée par le nombre d'avis. Maintenant, voici une chose. Si le nombre d'avis
est nul, alors quoi ? 0/0 nous donnera une valeur indéfinie. Si le nombre d'avis est nul, ASir ou opérateur un Cela permettra d'éviter cette erreur. Remplaçons maintenant le tableau de révision
par ces deux propriétés. Après les images, nous renvoyons l'avis à l'objet, le nombre d'avis, nombre d'avis,
ou pour simplifier, nous supprimons la deuxième propriété, note
moyenne par note
moyenne. Enregistrez les modifications
et jetez-y un œil. Envoyez à nouveau la demande et verrons maintenant que nous pouvons l'examiner en tant qu'objet. Donc, à partir de la requête, nous envoyons simplement ce dont le
front-end a besoin. C'est ainsi que nous devons penser lorsque nous envoyons
des données depuis le back-end.
125. Pagination ou requête infinie: Actuellement, nous envoyons les 24 produits
de la base de données. Imaginez si dans notre base de données, nous avons 100 ou
mille produits, l'envoi de tous les produits en une seule réponse ralentira notre API. Dites-moi ce que nous devons
faire dans cette situation ? Bien sûr, nous pouvons envoyer
des données page par page, afin que notre interface puisse implémenter pagination ou de
défilement infini Nous l'avons déjà vu
dans la section 7. Implémentons la pagination
ou la requête à défilement infini. Le backend est le même
pour les deux fonctionnalités. Tout d'abord, nous allons obtenir le numéro
de page actuel à partir du paramètre de requête, et comment pouvons-nous y accéder ? Bien, par requête par point. La page de coût est égale à la page à points de
requête de demande. Maintenant, cette page de point de
requête est une chaîne de caractères, car
quoi que nous obtenions
du paramètre de requête,
ce sera une chaîne. Nous devons convertir cette
page en entier, nous l'enroulons entre parenthèses
et analysons Ensuite, nous devons définir le
nombre de données de produits que nous
voulons envoyer sur une page. Donc, const par page
est égal à huit. Il ne nous reste plus qu'à ajouter
deux méthodes dans notre requête. Le premier est le point Skip
et ici nous passons page
entre parenthèses
moins une par page. Si la page vaut un, alors un moins un,
zéro sur huit, ce qui est également zéro. Notre requête ignore zéro produit. Si la page est deux, alors deux moins un
, soit un sur
huit, soit huit. Donc, notre requête Ignorez les huit
premiers produits. Maintenant, après Skip, nous devons
ajouter la propriété Limit, et dans ce cas, nous passons par page. La limite est donc le nombre de données que
nous voulons extraire
de la base de données est aussi simple que ça. Testons cette implémentation,
envoyons la demande. Tu vois, nous n'avons que huit produits. Maintenant, vous pouvez vous demander, nous n'avons pas transmis la page dans le paramètre de
requête. Nous recevons tout de même
huit produits. Oui, nous recevons
huit produits car cette page de requête par
points n'est pas définie. Ainsi, la méthode skip
ignorera zéro élément, puis nous fixerons la limite à huit. C'est pourquoi nous
recevons huit produits. Et si nous voulions personnaliser
cette requête pour le front-end ? Imaginez que notre interface souhaite augmenter les produits par page
dans les paramètres de requête Supposons dix produits
sur une seule page. Nous pouvons faire quelque chose comme ça. Au lieu de cet Ed codé en dur, nous obtenons un point de requête
par paramètre de requête Encore une fois, nous le convertissons en
entier en utilisant parse integer. Même si le front-end ne souhaite pas
transmettre un paramètre par page, transmettez ici la valeur par défaut,
donc l'opérateur huit. Et nous pouvons gérer
cette page en ajoutant opérateur et
la valeur par défaut sera un. Regardez les modifications et
récupérons les données de la page deux. Nous avons donc un point d'interrogation à la fin de l'URL pour
transmettre le paramètre de requête. La page est égale à deux. De plus, nous passons par page
à dix et envoyons la demande. voyez, notre requête,
saute les dix premiers enregistrements,
puis envoie la deuxième page, qui contient 11 à 20 produits. Maintenant, voici une chose. Sur le front end, ils ont
souvent besoin plus de détails, tels que
le nombre total de produits. Ils décideront ainsi du
nombre de pages à afficher ou du nombre de fois qu'ils pourront obtenir les données
du back-end. Ils veulent donc le
numéro de page actuel et d'autres détails. Récupérons rapidement ces informations et transmettons-les dans la réponse. Tout d'abord, après
ces produits de mise à jour, nous pouvons faire quelque chose comme ça. Le coût, le total des produits est égal aux documents en attente sur les produits
. Cela comptera tous les produits. Ensuite, nous pouvons également compter le nombre total
de pages, le coût, le total des pages est égal
au total des produits, divisé par par page. Supposons que nous ayons 50 produits
et que nous en ayons huit par page, puis que nous obtenions 6,25
, soit six pages complètes, et que nous ayons besoin d'une page de plus
pour afficher deux produits Donc c'est mieux, on scelle
toujours ce numéro. Pour cela, nous devons simplement envelopper cette équation avec la fonction
math point SL. Cela convertira
ce 6,25 en sept. Maintenant, sur le lieu d'envoi de
ce tableau de produits mis à jour, nous passons ici l'objet. Affecte d'abord
les produits aux produits mis à jour , au
total des produits, au total des produits, ou nous pouvons également les supprimer. De plus, nous passons le nombre total de pages. Nous pouvons également envoyer une page, c'
est-à-dire une page à une
et une publication par page par page. J'ai ajouté ici toutes les informations, mais vous pouvez les ajouter
selon vos besoins. Enregistrez les modifications et
envoyons la même demande. voyez, nous obtenons une
gamme de produits et avec cela
nous obtenons ces détails. C'est tout ce que nous avons à faire pour la pagination ou les requêtes infinies
126. Envoyer des produits par catégorie: Pour ce qui est de l'achat de produits, il se peut que
nous souhaitions n'
obtenir que des produits par catégorie. Pour cela, il n'est pas nécessaire
de créer une nouvelle API. Nous pouvons également simplement implémenter
cela dans cette requête. Tout d'abord, nous obtenons le
nom de la catégorie dans le paramètre de requête, catégorie de requête de
coût est égale à la catégorie de points de requête de demande. Si on ne passe pas la catégorie, on passe ici ou on passe à zéro. Maintenant, après cela, pour la requête, nous ajoutons la variable let query. Nous l'avons défini sur un objet vide. Ici, nous passons cet
objet de requête dans cette méthode fine. Nous pouvons maintenant répondre à cette requête
en fonction de nos besoins. Cette requête est l'objet de
comparaison. Nous passons ici si la catégorie de
requête de condition est disponible, puis nous devons d'abord ajouter la propriété de catégorie à l'
ID de catégorie dans cet objet de requête. Maintenant, si depuis le front-end, nous obtenons directement l'ID de catégorie, nous pouvons directement transmettre
cet ID dans l'objet de requête. Mais la plupart du temps, nous obtenons nom de
la
catégorie depuis le front-end. Nous devons trouver l'
identifiant de catégorie dans notre base de données. La catégorie de coûts est égale à un point de catégorie de
poids Fine Vn. Ici, nous passons le
nom de l'objet de comparaison à la catégorie de requête. Assurez-vous que nous importons ce modèle de
catégorie en haut. La catégorie de coût est donc
égale à require. Voici un dossier vers
la catégorie des modèles. Et si nous ne
finançons pas la catégorie ? Ici, nous vérifions si la catégorie n'
est pas disponible. Nous renvoyons simplement la réponse
avec le code d'état 404, introuvable dans la méthode Jason, passons l'objet avec la
propriété du message, catégorie, introuvable. À la fin, nous définissons simplement que catégorie de
requête est égale à l'ID du trait de soulignement par point de
catégorie Notre objet de requête
ressemble maintenant à ceci. Si nous le transmettons dans
notre méthode fine, il servira d'objet de
comparaison. Maintenant, testons cela
depuis Mongoi, devenons réussis,
accédons à la collection de catégories,
copions n'importe quelle catégorie. Supposons que je copie la catégorie
des montres connectées. Revenons maintenant à Postman dans l'URL, nous ajoutons un autre paramètre de requête et la catégorie est égale
à celle des montres intelligentes Assurez-vous d'écrire le
même nom que celui que nous avons dans la collection des catégories
et d'envoyer cette demande. Et ici, nous obtenons un tableau vide. Oh, ici nous passons la page
est égale à deux, et dans cette catégorie, nous n'avons pas autant de données
que nous pouvons également
afficher sur la page. Nous changeons donc cette page en
une et envoyons la demande. Vous voyez, nous trouvons ici
tous les produits horlogers.
127. Envoyer un produit par recherche: Dans notre application,
l'utilisateur peut également rechercher les produits et vouloir voir tous les produits en fonction
de sa recherche. Nous pouvons également implémenter cela
dans cette seule requête. Il n'est pas obligatoire d'ajouter
toutes les fonctionnalités dans cette requête, mais je vous montre la pratique du monde
réel. Après cette catégorie, la recherche par
requête de coût est égale au point de
requête SRG
ou nous la définissons sur Null Après cette condition de catégorie, nous en ajoutons une autre si la condition, la recherche par
requête est disponible, puis nous définissons une autre propriété
dans l'objet de requête. Le titre du point de requête est
égal à celui de l'objet. Ici, nous ajoutons dollar jx, à query surge et pour rendre
cette requête insensible aux majuscules et minuscules, nous passons une autre propriété, dollar options, à la chaîne I. De plus,
en bas, dans ce tutoriel, nous devons transmettre l'objet de requête
dans la méthode count document J'ai oublié de le transmettre lors de la leçon précédente,
et c'est tout. Enregistrez les modifications
et jetez-y un œil. Ajoutez ici un autre paramètre de
requête, et surge est égal à ici nous ajoutons l'application et
envoyons la demande. Vous voyez, nous n'obtenons qu'une seule donnée parce que dans son
titre, il y a Apple. C'est ainsi que nous pouvons personnaliser ce Gtquery pour
obtenir tous les produits Je remarque également une chose. Nous avons correctement enregistré les images de
nos produits dans le dossier de notre serveur, mais nous ne pouvons pas y accéder. Nous devons définir
ces fichiers statiques comme nous l'avons fait pour les
catégories d'images. Dans le fichier index point js, après cette catégorie static, nous ajoutons app point ug Ici, nous ajoutons le préfixe
pour le chemin du fichier statique. Nous transférons les téléchargements de produits. Ensuite, nous utilisons
Express point static Middleware pour partager les fichiers
statiques depuis
le serveur. Dans
cette fonction, nous devons transmettre le
nom du dossier que nous voulons Télécharge donc des produits. N'oubliez pas qu'il s'agit du
préfixe de l'URL et que c'est le chemin
du dossier de nos fichiers statiques et c'est fait
128. Exercice - Obtenir des données sur un produit unique: Maintenant, lorsque
quelqu'un clique sur
la fiche produit sur le front-end , nous devons lui montrer tous les détails concernant ce produit. Voici l'exercice qu'il vous faut. Vous devez définir une nouvelle API pour obtenir les détails d'un seul
produit. Notre API devrait donc
ressembler à ceci. Supprimer les produits de l'API, supprimer l'
identifiant du produit. Cet identifiant, vous devez
trouver le produit. Essayez également d'obtenir les données
réelles du vendeur, telles que son identifiant, son nom et son adresse e-mail, non un simple identifiant de vendeur. Essayez de le résoudre et si vous avez
oublié de remplir, vous pouvez regarder la leçon à six
et sept remplir ,
puis essayer de le résoudre J'espère donc que vous résoudrez cet
exercice ou que vous essaierez de le résoudre. Ne vous inquiétez pas si vous rencontrez une erreur
ou si vous êtes bloqué à un moment donné. Cela fait partie de l'apprentissage. J'étais aussi souvent coincé là où j'ai appris le
node pour la première fois. Ne t'inquiète pas pour ça.
Voyons maintenant la solution. Nous écrivons donc router point Gt. Que transmettons-nous dans l'URL ? Comment savoir quels sont les détails
du produit que nous voulons obtenir ? C'est vrai. Ici, nous ajoutons l'
ID de colonne comme paramètre racine, et il s'agit de l'
identifiant unique d'un seul produit. Encore une fois, nous n'
ajoutons pas de middleware ici car tout utilisateur peut voir les détails d'
un seul produit Nous transmettons directement la fonction de
rappel avec demande et réponse Tout d'abord, nous avons besoin de cet ID, donc Const ID est égal à
request point VMs dot Maintenant, grâce à cet identifiant, nous pouvons
trouver ce produit. Le produit C équivaut donc à
attendre que le produit ne soit pas trouvé par identifiant. Ici, nous transmettons l'identifiant du produit. Nous rendons également cette
fonction asynchrone. Après cela, nous pouvons mettre la condition I le produit n'est pas disponible, puis nous renvoyons la réponse avec code d'
état 404 points JSObject avec la propriété du message,
produit, Maintenant, si nous obtenons le produit
de la base de données, nous
répondons simplement au
point Json pour ce produit. Dites les modifications et
testons cette API. Copiez ce premier
identifiant de produit car nous en avons besoin. Dans le postier, nous créons une nouvelle demande intitulée
Get single product Bien, sélectionnez le produit
URL API. Et ici, nous collons
notre identifiant de produit. Assurez-vous que la demande est
G et envoyez-la. Vous voyez, ici, nous obtenons les données complètes
d'un seul produit. Maintenant, si nous transmettons ici un
identifiant aléatoire et envoyons la demande, nous n'obtenons pas les données. Et si nous vérifions notre terminal, constatons que notre application s'est écrasée. Cela se produit parce que nous ne
gérons pas les erreurs dans notre API. Ne vous inquiétez pas, nous
le ferons dans la section suivante. Actuellement, nous devons redémarrer cette application avec node mod. Passons à nouveau l'
identifiant original et envoyons la demande. Sympa. Maintenant, nous
avons peu de problèmes. Sur la page des produits individuels, nous souhaitons afficher les informations du
vendeur telles que son nom et son adresse e-mail. Mais ici, nous obtenons l'identifiant du vendeur, nous devons
donc renseigner
ces données à partir de la collection de
l'utilisateur De plus, nous ne voulons pas que
cette catégorie soit remplie. Les autres choses vont bien. Tout d'abord, après une méthode fine, nous passons point populate. Au premier paramètre, nous passons le champ
que nous voulons renseigner. vrai, c'est le vendeur, dans quelles données nous
voulons renseigner le trait de soulignement, l'identifiant, le nom, Maintenant, nous voulons également
renseigner le nom de l'utilisateur, qui sera disponible
dans le tableau des critiques Ici, nous devons
renseigner les données de la NASD. C'est également très simple. Nous adoptons une autre méthode de remplissage. Au premier paramètre,
nous ajoutons review, qui est le tableau
d'accès à l'utilisateur, nous devons écrire point user. Maintenant, au deuxième paramètre, nous voulons à nouveau les mêmes remplissages. Soulignez l'identifiant, le nom et l'e-mail. Bien. Enregistrez les modifications et
jetez-y un œil. Envoyez la demande. Vous voyez, nous recevons maintenant l'
objet du vendeur avec son identifiant, son nom et son adresse e-mail. Actuellement, nous n'
avons pas d'avis. C'est pourquoi nous ne pouvons pas le voir. De plus, nous avons oublié de supprimer
ce remplissage de catégorie. À la fin, nous passons la méthode de sélection par
point et ici moins la catégorie et moins l'identifiant du trait de
soulignement Donc, les changements et jetez-y un coup d'œil. Envoyez cette demande, C, nous supprimons la catégorie et
soulignons la propriété V. C'est à quel point node js est simple. Au début, tu trouves
que c'est difficile. Mais si vous effectuez une implémentation
étape par étape, vous pouvez la maîtriser correctement. C'est pourquoi je
vous explique le code ligne par ligne. Dans la
leçon suivante, nous allons créer une API pour supprimer
le produit unique.
129. Exercice. - Supprimer le produit: Créons maintenant une API pour
supprimer le produit unique. Nous écrivons donc ici
router dot delete. Ici, nous obtenons à nouveau l'ID
en tant que paramètre de route. Ici, nous avons besoin d'un
intergiciel ou non. Bien, nous avons besoin d'un
intergiciel car seul l'utilisateur connecté peut
supprimer le produit, et nous voulons également obtenir des
informations sur cet Tout d'abord, nous adoptons un intergiciel
Oath. Ensuite, nous passons la fonction de
rappel de l'API avec demande et réponse Maintenant, tout d'abord, nous obtenons identifiant
du produit à partir du paramètre de
route. Coût, l'identifiant du produit est égal à l'identifiant point point des paramètres de la
demande. Nous devons maintenant trouver le
produit à partir de cet identifiant. Le produit coulé équivaut à attendre produit soit trouvé par identifiant, dans la mesure
où nous transmettons l'identifiant du produit. À partir de cette requête, nous
n'avons besoin que de l'identifiant du vendeur. Ajoutez une méthode de sélection, et ici nous passons les vendeurs remplis
et, en haut de la page, faisons en sorte que cette fonction soit active. Maintenant, nous mettons ici la condition
selon laquelle le produit est trouvé ou non. Nous copions donc simplement
cette condition de l'API précédente
et la collons ici. Bien. Maintenant, si nous avons trouvé un produit, nous vérifions que l'utilisateur est administrateur ou que l'utilisateur est le
vendeur de ce produit. Nous écrivons I request
point user La règle point est égale à admin ou
request point user, l' identifiant
point de soulignement est égal
au produit, point seller Si l'une de ces
conditions est vraie, nous pouvons supprimer ce produit. Maintenant, la question est de savoir
comment supprimer ce produit ? Dans cet objet produit, que nous obtenons de la base de données, Mongoose transmet également
une méthode,
à suppression par points Et c'est tout. De cette façon, le produit sera supprimé
de la base de données. De plus, nous utilisons ici une méthode de
suppression car auparavant nous obtenions le
produit de la base de données. Si nous devons
supprimer directement ce produit, nous utilisons les méthodes de recherche par
identifiant et de suppression. De plus, nous devons ajouter ici une attente car il s'agit d'une
opération asynchrone. Maintenant, après cela,
nous renvoyons simplement point de
réponse Json avec propriété du
message, le produit a
été supprimé avec succès. Actuellement, nous commentons cette logique de suppression pour vérifier
cette implémentation. Nous l'activerons
après un certain temps. Maintenant, si cette condition n'
est pas vraie, nous
renvoyons ici la réponse
avec le code d'état 403, 44 points Biden Json avec
propriété mesa, excédent refusé Seul l'administrateur ou le vendeur peut
supprimer ce produit. Essayons maintenant cette
implémentation, copions n'importe quel identifiant
de produit de notre liste de produits. Je copie ce dernier identifiant, maintenant dans le post win, je crée
une nouvelle demande appelée tilt, un produit dans cette
méthode à supprimer, ici nous écrivons l'URL, produits
API, et ici nous passons notre identifiant de produit et nous nous
assurons que la méthode est supprimer
et envoyer la demande. Oh désolé, nous devons également
envoyer un jeton JWT dans l'en-tête, accéder à l'API de
connexion, vous connecter avec vos données utilisateur, qui est le vendeur
de ce produit voyez, ici, je reçois la
clé JWT, je la copie, et dans l'API de suppression, nous allons dans les en-têtes et ajoutons
ici l'autorisation dans En tant que valeur, nous passons l'erreur, l'espace et collons la clé JWT ici Maintenant, envoyez la demande. voyez, ici, l'accès est refusé, donc nous ne nous retrouvons pas dans
cette condition d'identité. C'est pourquoi nous recevons cette erreur. Le problème est dans
cet état, il
suffit de consol dot
log dans cet état de cabine Copiez cette première condition
et collez-la ici, virgule, copiez la deuxième
condition et collez-la ici Dites les modifications, puis envoyez
à nouveau la demande. Revenons maintenant au code VS, j'ai ouvert un terminal ici
pour la première condition, nous obtenons faux, ce qui est vrai
car nous ne sommes pas administrateurs. Après cela, pour une
deuxième condition, nous obtenons également un faux. Pourquoi ce compte est
le vendeur de ce produit. Sélectionnez séparément, consultez le
journal des points, ces deux propriétés. Supprimez cette première condition, et à la place des
égaux, nous ajoutons une virgule Regardez les modifications,
et encore une fois,
renvoyons la même demande
au code VS,
et dans le terminal, vous voyez, nous obtenons d'
abord l'
ID d'objet dans une chaîne, puis nous obtenons le nouvel ID d'objet,
qui est l'ID d'objet Mongoose C'est pourquoi la chaîne et l'identifiant de
l'objet ne correspondent pas. Donc, soit nous devons
convertir ces deux éléments en ID
d'objet, soit nous pouvons les convertir
tous les deux en chaîne. Les deux fonctionneront. Nous les convertissons donc tous
les deux en chaîne. En JavaScript, nous avons la méthode point deux chaînes pour
convertir les données en chaînes. Passez cette chaîne de points pour les deux identifiants et retirez
cette console. Enregistrez les modifications et
renvoyons la demande. Vous voyez, maintenant le produit est
supprimé avec succès. Maintenant, si vous le souhaitez, vous pouvez
activer cette méthode de suppression. Maintenant, après avoir supprimé le
produit de la base de données, il est préférable de supprimer également images
de
ces produits du serveur. Pour supprimer le fichier
du serveur, nous pouvons utiliser le module FS. Donc, en haut, Fs est égal
à require Fs promises. Et nous avons également besoin d'un module de chemin. Le chemin const est donc égal
à require Path module. Maintenant, en bas, après
cette méthode de suppression, nous ajoutons fs unlin Maintenant, dans cette méthode,
nous devons transmettre le chemin complet du fichier
que nous voulons supprimer. Mais dans le tableau d'images, nous n'avons que le nom du fichier, mais nous avons besoin ici du chemin complet. Pour cela, nous devons
utiliser le module Path, qui est un autre module intégré
de node jazz. Laissez-moi vous montrer que
Const full path est égal à path point join Tout d'abord, nous passons en discothèque
et Discord leur nom, qui est le
chemin complet du répertoire de notre projet Ensuite, nous écrivons notre dossier dans
lequel nous stockons les images. Ici, nous allons un dossier plus haut parce que nous
sommes actuellement dans le dossier routes, téléchargeons les produits slash,
puis au troisième argument, nous ajoutons le nom de notre image Maintenant, nous n'avons pas
qu'une seule image. Nous avons des tableaux d'images, nous devons
donc exécuter une boucle pour cela Avant cela, nous ajoutons des images à points
du produit. Donc, pour accéder aux images,
ici, dans la méthode de sélection, nous devons transmettre des images. Bien. Désormais, les
images des produits pointent pour chacun d'entre eux. Ici, nous obtenons le nom de chaque image , la fonction de
flèche, et nous allons déplacer ces deux lignes. Maintenant, dans le fichier fs point unlink, nous transmettons ce chemin complet,
et cette opération étant donné que point unlink est
une opération asynchrone Nous devons donc respecter un
poids, et pour cela, nous devons rendre cette
fonction de couleur asynchrone. Bien. Maintenant, avant de lancer cette page, il vaut mieux vérifier que nous
avons un tableau d'images ou non. Les images du point I du produit sont disponibles et la
longueur des points des images du produit est supérieure à zéro. Ce n'est qu'alors que nous exécutons cette boucle. Déplacez ce code ici. Lors de cette opération de dissociation,
une erreur peut se produire. Avant de dissocier ce point fs, nous ajoutons le blog try and cache Déplacez cette
méthode de dissociation dans le blog tr, et dans le blog du cache,
nous obtenons cette exception Nous consultons simplement l'erreur de point
dans les métriques, l'erreur, la suppression,
le fichier, les crochets en C, le chemin
complet, la virgule,
ajoutons un objet d'erreur Regardez les modifications et jetez-y un coup d'œil. Nous allons tester cette implémentation, en copiant l'identifiant du dernier produit. Voir également le nom de son image. Ces images doivent être supprimées. Remplacez cet identifiant de produit par cet identifiant et envoyez
cette demande de suppression. voyez, ici, le produit a
été supprimé avec succès, et si nous vérifions notre dossier de
produits, voyons dans ce dossier, nous n'obtenons pas ces images. C'est ainsi que nous supprimons le
produit et ses images. Maintenant, ajoutons également le
produit que nous venons de supprimer. Donc, créez une nouvelle API de
produit et ici je change ce titre
en nouveau nom de produit. Sélectionnez ici les images. Et il vous suffit d'envoyer cette demande. Ici, j'obtiens un
jeton valide car le
précédent est expiré. Nous allons dans l'API de connexion, copions le jeton, et
dans les en-têtes, nous collons ce jeton Maintenant, envoyons cette demande. Vous voyez, ici nous obtenons de nouvelles données. Charmant. Rendez-vous dans
la prochaine leçon.
130. Recherche de produit par titre [FACULTATIF]: Désormais, sur toutes les
applications de commerce électronique, nous avons la fonction de recherche où, en bas
de la barre de recherche, nous pouvons afficher des suggestions. Nous devons donc définir une
API pour cela. De plus, cette API sera appelée lorsque chaque personnage
entrera dans la barre de recherche. Donc, outter point cat, deux suggestions de barres obliques au point de
terminaison, fonction de rappel
asynchrone
avec demande En cela, tout d'abord, nous obtenons ce que l'utilisateur recherche. La recherche de coûts est donc égale à request point query
point Sarge. Ici, nous devons utiliser une
expression régulière pour comparer et trouver
la chaîne dans le titre Const products
équivaut donc à attendre que le produit trouve
pas de condition plus passive
Objet, titre à Ici, nous utilisons dollar regex, qui est le dernier moyen d'écrire expression
régulière dans Mongo Dib Ici, nous passons notre texte de recherche et pour désactiver la distinction majuscules/minuscules, nous passons ici
les options dollar à la chaîne I. Ici, nous comparons notre
chaîne de recherche avec notre titre. Cela nous donnera des produits contenant ce mot ou cette chaîne. De plus, dans la succession,
nous ne voulons pas
afficher tous les détails comme la description, etc. Nous pouvons donc ajouter ici la méthode
Selec et nous n'obtenons que l'
ID de soulignement et la propriété du titre Nous pouvons également limiter ces données
à dix sur le front-end, nous ne suggérons que dix produits en bas de la barre de recherche. À la fin, nous répondons simplement par un
point sur ces produits. Enregistrez les modifications et
goûtons à cette API. Ouvrez Postman, créez une nouvelle demande intitulée
Get suggestions URL vers les produits API, suggestions de
barres obliques, interrogation pour
transmettre le paramètre de requête, la recherche est égale à l'adresse IP Assurez-vous que nous sélectionnons la
méthode Get et que nous envoyons la demande. Vous voyez, ici, nous ne recevons pas de produits. Voyons ce que nous
obtenons dans le terminal. Vous voyez, nous rencontrons ici
quelques problèmes avec l'identifiant de l'objet. Mais dans notre API de suggestion, nous n'avons aucun identifiant d'objet. Alors pourquoi nous en arrivons
là, erreur d'ID d'objet. En fait, cet appel d'API n'atteint pas
l'API de suggestions. Il se déplace dans cette API
get single product. Laissez-moi vous expliquer ceci. Voici la première URL de l'API
pour ce produit unique. Nous avons des produits API qui
réduisent l'identifiant du produit. Nous ajoutons un autre
produit API API, nous supprimons les suggestions. Maintenant, Express est confus. Cette chaîne de suggestion
est un identifiant d'objet ou autre. C'est pour cette raison que l'API de notre
produit unique fonctionne. Quelle est la solution ici ? Rien, il suffit
de déplacer notre API de suggestions avant cette
API de produit
unique. Express compare ainsi notre
API à une chaîne de suggestion, et si cela ne correspond pas, qu'alors qu'Express passera
à l'API du produit unique. Changez de phase et assurez-vous que le
serveur fonctionne correctement. Dans le facteur,
envoyons la même demande. Vous voyez, nous avons maintenant des suggestions de
produits. J'ai intentionnellement créé
cette erreur pour
vous montrer ce qui peut arriver lorsque vous
créez vous-même un projet. Dans la
section suivante, nous allons
apprendre à gérer les erreurs
comme un professionnel. C dans la section suivante.
131. Section 11 - Pourquoi nous traitons les erreurs ?: Actuellement, nous exécutons notre application dans
le monde idéal. Tout fonctionne parfaitement. Mais dans le monde réel,
tout peut mal tourner. Toute erreur peut se produire. Par exemple, un fichier est
introuvable ou notre connexion
avec le serveur
Mongo Deb échoue
ou l'utilisateur ne transmet pas les informations valides ou
quelque chose peut mal tourner Dans ces cas, nous
devons gérer les erreurs, et voici quelques
raisons de les gérer. Tout d'abord, lorsque
nous gérons des erreurs, nous pouvons envoyer un
message d'erreur convivial et nous pouvons afficher cette erreur amicale sur la page Web, comme si le
serveur avait des problèmes, veuillez réessayer
ultérieurement, comme ceci. Deuxième raison de
gérer les erreurs, nous pouvons les enregistrer ou, en termes simples, nous pouvons stocker les erreurs
dans un fichier séparé, puis examiner ces erreurs, lesquelles se
produisent très souvent, et ainsi, nous pouvons résoudre ces
erreurs dans notre application. La gestion des erreurs peut donc également
améliorer notre application. Maintenant, permettez-moi de vous montrer une erreur. Exécutons notre application
en utilisant nodemon index point js. Maintenant, en ce qui concerne le facteur, nous recevons
également des suggestions de la part de Sarge Supposons maintenant que le
serveur Mongoib tombe en panne. Pour le démontrer,
nous pouvons commenter le code de connexion depuis
le fichier index point js. Enregistrez les modifications et
revenons au facteur. Envoyez à nouveau la même demande. Vous voyez ici que nous abordons le
chargement, le chargement et le chargement. Et au bout de 10 secondes,
nous avons une erreur. Et si nous examinons notre terminal d'
application, voyons ici que les produits d'
opération d'erreur Mongoose ne
trouvent pas le délai d'expiration de la mémoire tampon après 10 000
millisecondes après 10 000
millisecondes Et après cela, notre
application pourrait tomber en panne. Supposons que dans le monde réel, notre serveur Mongo Deb s'éteigne ne serait-ce que
pendant deux à trois minutes, puis notre application peut tomber en
panne en production Après un certain temps, le serveur Mongo Di
B est à nouveau opérationnel. Même si elle est en ligne, notre application
restera bloquée et nous ne pourrons pas
envoyer de données au client Il est important de gérer
ce type d'erreur. De plus, la gestion des erreurs ne
signifie pas qu'une erreur ne se produise pas. La gestion des erreurs
signifie que par cette erreur, notre serveur ne tombera pas en panne. Actuellement, cette
application est en cours d'exécution, mais avant cette version
du nœud Jaz, les applications
du nœud
se bloquaient. Dans cette section, nous
verrons comment gérer les
erreurs et les enregistrer.
132. Gérer les promesses rejetées: Tout d'abord,
gérons les erreurs qui se produisent lorsque nous avons
affaire à des promesses d'API. Dans cette API de suggestions, nous appelons ici cette collection de
produits. Et comme nous le savons, il s'agit d'
une opération asynchrone, c'est pourquoi nous utilisons wait
for the response Nous avons donc ici une promesse et
cette promesse est rejetée. Mais ici, nous n'avons pas corrigé les erreurs dans le bloc «
dry and catch », comme nous l'expliquons dans la section 6. N'oubliez pas qu'ici, au bloc
try and catch, ici dans le blog sur le cache, nous obtenons un objet d'erreur. Maintenant, que voulons-nous
faire dans ce blog sur le cache ? Dans le blog sur le cache dans le monde réel, nous enregistrons d'abord l'erreur ou exception quelque part dans le
fichier ou dans la base de données, puis nous renvoyons réponse avec le
code d'état et le message d'erreur pertinents. Actuellement, nous enregistrons simplement
l'erreur dans la console. À l'avenir, nous enregistrerons cette erreur ou exception
dans un fichier séparé. Maintenant, après avoir enregistré l'erreur,
nous renvoyons la réponse
avec le code d'état 500, qui est une erreur du serveur. Ensuite, nous renvoyons également
un objet JSON avec une propriété de message appelée erreur
interne du serveur. Ou vous pouvez écrire
un problème sur le serveur. Nous pouvons écrire le
message d'erreur que nous voulons. Bien. Nous pouvons maintenant déplacer
l'ensemble de notre code dans ce blog sec. Voyons ce qui se passe, voyons les modifications, et voilà que notre
application redémarre. Mais notre base de
données Mongoib n'est toujours pas connectée. Envoyons maintenant la demande de suggestions. Laissez-le charger. Après 10 secondes, vous voyez, nous obtenons
ici la réponse avec code d'état
500 et
notre message d'erreur. Voyons également ce que
nous obtenons dans la console. voyez, ici, nous obtenons cette
erreur Mongoose, comme avant, et notre application ne
se bloque pas à cause de cette erreur Notre application
est toujours en cours d'exécution, nous avons réussi à gérer notre erreur de promesse
rejetée. Ici, nous ne consultons
ni n'enregistrons cette erreur, alors dans notre terminal, nous
ne savons même pas que nous avons eu une erreur. Maintenant, si nous essayons d'
accéder à nos autres API, par
exemple, nous envoyons cette demande pour
tous les produits. Après 10 secondes,
nous obtenons une erreur, et dans le terminal, notre
application ne plante pas. Comme nous pouvons le voir,
comment gérer erreurs de rejet de
promesse en
utilisant le bloc try and catch. De cette façon, notre application
ne plante pas, et c'est pourquoi la gestion des
erreurs est importante. Pour tous les itinéraires, nous devons encapsuler l' ensemble de
notre code avec un bloc
try and cache. Mais ici, dans notre application, nous avons près de dix
à 15 routes d'API. Nous devons encapsuler tout le code de route de
notre API dans Try and Catch Blog,
qui se répète. De plus, si un jour
nous voulons modifier le message d'erreur ou
modifier la logique de journalisation
, nous devons le
mettre à jour dans tous nos itinéraires. Maintenant, vous vous demandez peut-être s'il
existe un raccourci pour cela ? Oui, il existe un raccourci et nous le verrons
dans la prochaine leçon.
133. Créer un middleware des erreurs: Dans la leçon précédente,
nous avons vu que nous devions répéter cette erreur de journalisation et renvoyer la réponse d'erreur
dans chaque route d'API. Dans cette leçon, nous allons créer un intergiciel commun dans lequel nous allons écrire du code pour cette erreur de journalisation et
renvoyer une réponse d'erreur Ne vous inquiétez pas, c'
est très simple. Tout d'abord, dans notre fichier index point gs en bas,
après toutes les routes, nous ajoutons app point g here
we pass function, et comme nous le savons, nous
obtenons ici trois paramètres, réponse à la
demande
et la fonction suivante. Maintenant, dans cette fonction, nous allons écrire toute la logique
de gestion des erreurs. Tout d'abord, nous ajoutons
ici le journal des points de la console. Erreur, le middleware est en cours d'exécution pour s'assurer que
cela fonctionne Revenons maintenant à notre itinéraire, coupez ce code dans
le bloc de cache et collez-le simplement dans notre
nouvelle fonction middleware Maintenant, si nous voulons modifier
le message d'erreur ou toute logique liée
à la gestion des
erreurs, nous devons effectuer
les modifications ici à un seul endroit. Maintenant,
voici une chose. Comment pouvons-nous obtenir cet
objet d'erreur dans cette fonction ? Nous obtenons cet objet d'erreur comme premier paramètre de cette fonction de
rappel Assurez-vous que nous obtenons l'
objet d'erreur comme premier paramètre. Voyons maintenant comment pouvons-nous
appeler ce middleware ? Donc, vectorisez et voici dans le bloc de cache pour appeler le prochain intergiciel,
ce que nous devons faire Bien, nous pouvons utiliser la fonction suivante. Ici, nous obtenons la fonction suivante en paramètre et appelons simplement la fonction suivante
dans le bloc de cache, et nous passons l'objet d'erreur
dans cette fonction suivante. Si vous êtes un peu confus, laissez-moi
vous montrer le flux
de code de ce middleware d'erreur Comme nous le savons dans notre backend, nous n'exécutons qu'un seul fichier
, à savoir cet index point js. Alors, nœud, commence à
exécuter ce code. Tout d'abord, ce middleware
et ce code statique seront exécutés. Ensuite, nous avons toutes les routes, puis nous
ajoutons un intergiciel d'erreur Maintenant, lorsque nous exécutons la fonction
suivante sur l'une de ces routes, cette fonction suivante
exécutera cet intergiciel d'erreur Dans tous les itinéraires, nous
appellerons la fonction suivante, et comme premier argument, nous transmettrons l'objet d'erreur
depuis le bloc de cache. Si
quelque chose ne va pas dans notre triplog, cette méthode de cas s'
exécutera et cette méthode de
cache appellera
cette fonction suivante, qui exécutera cette fonction intermédiaire
d'erreur est aussi simple que ça. Regardez les modifications et vérifierons si cela
fonctionne ou non. Actuellement, notre
application fonctionne, fonctionne bien, ouvrez le facteur et envoyez
la demande de suggestions Et au bout de 10 secondes, nous obtenons une erreur, et
dans notre terminal, nous constatons que ramiddalware est en cours d'exécution, ce qui signifie que notre
ramiddleware Et après cela, nous obtenons l'erreur
Mongoose, super. Donc, si nous voulons changer quoi que ce soit dans la gestion des
erreurs de route, nous devons effectuer les modifications
à un seul endroit.
134. Supprimez les blocs d'accroche: Maintenant, notre
implémentation actuelle est bonne. Si cela vous convient,
vous pouvez utiliser cette approche. Mais beaucoup de développeurs
n'aiment pas cette approche. Vous pouvez voir que nous avons ici un bloc d'
essai et de cache, et nous devons répéter
ce bloc de cache d'essai dans chaque gestionnaire de route
ou fonction de rappel, ce qui semble un peu compliqué Dans le monde idéal, nous ne devrions
écrire que cette logique. Alors, comment pouvons-nous le faire ?
C'est vraiment simple. Je viens de vérifier cette mise à jour d'
Express Fi. Dans cette version d'Express Five, Express gère automatiquement les erreurs de rejet de
promesse ou ces erreurs qui se produisent
lors de l'opération Async Express appelle automatiquement ce prochain intergiciel
avec un objet d'erreur, qui exécutera notre intergiciel d'erreur
global Laisse-moi te montrer ça.
Alors maintenant, nous n'avons pas besoin de ce
blog sur le dry and cache. Nous pouvons l'enlever. Nous revenons donc à notre syntaxe de route
d'origine. Enregistrez ce fichier et
vérifions-le. Ouvrez le postier et envoyez
la même demande de cugion. Au bout de 10 secondes,
nous obtenons cette erreur. Et si nous vérifions notre terminal VS
code, vous voyez,
ici, nous obtenons d'abord une erreur d'exécution du
middleware,
puis nous obtenons notre erreur,
ce qui signifie que notre
intergiciel d'erreur global est puis nous obtenons notre erreur,
ce qui signifie que notre intergiciel d'erreur global C'est plutôt cool, non ? Dans l'ancienne version,
comme Express 4, cette
gestion automatique des erreurs ne fonctionne pas. cela, nous devons encapsuler chaque logique de route dans un bloc
sec et un bloc de cache, mais maintenant nous n'avons plus
besoin de le faire. Express le fait automatiquement, nous devons définir un intergiciel d'erreur
global dans le fichier index point js
. C'est aussi simple que ça.
135. Erreurs de journal dans le fichier: Dans cette leçon, nous allons donc enregistrer nos messages d'erreur dans
un fichier journal séparé comme celui-ci. C'est vraiment intéressant.
Faisons-le. Donc, actuellement, nous
enregistrons uniquement le
message d'erreur dans la console. Il est maintenant temps de stocker ces messages d'erreur
dans un fichier séparé. Ainsi, à l'avenir, nous pourrons voir les erreurs qui
se produisent fréquemment, nous pourrons les rencontrer et
améliorer notre application. Donc, pour enregistrer les
erreurs dans un fichier, utilisez un autre package NPM
, Winst C'est l'une des bibliothèques les
plus populaires pour enregistrer les erreurs, et elle la rend également très
simple. Ouvrez donc le terminal
et écrivez NPM, installez WinsterNF en utilisant exactement
la même version, nous écrivons directement 3.17
0.0 et appuyons Maintenant, configurer le Winston
est vraiment simple. Tout d'abord, nous
importons Winston, const, Winston is equal to require et nous passons le nom de notre
package Maintenant, ce Winston par défaut, donne-nous un enregistreur Cet enregistreur est suffisant pour les applications de
petite et
moyenne envergure Nous pouvons donc personnaliser
cet enregistreur comme nous le souhaitons pour les
types d'applications complexes et de grande envergure Maintenant, ce Winston ou
bûcheron a un moyen de transport. Ce transport est comme un véhicule
de livraison pour vos bûches. C'est elle qui décide où
le journal doit aller. Un transport prend les messages de l'
enregistreur créés par Winston et les envoie
vers une destination spécifique Maintenant, la destination
peut être la console qui imprime le journal sur le
terminal ou sur la ligne de commande. Ensuite, nous avons un fichier pour enregistrer les journaux dans un
fichier sur notre système, SDTP pour envoyer le
journal à une API et ensuite,
nous avons une base de données pour stocker
les journaux dans une
base de données telle que Mongo DB Nous disposons enfin de
services cloud pour envoyer des journaux à des services tels qu'AWS,
Datadog, etc. Ce sont tous des moyens de transport
fournis par Winston. Permettez-moi de vous en montrer quelques-unes. Ce package Winston
utilise par défaut le transport Consult pour
imprimer les journaux sur le terminal, mais ici nous voulons également enregistrer
les journaux dans un fichier séparé, et pour cela, nous
devons le configurer Nous écrivons donc ici Winston
point Create Logger. Maintenant, dans cette fonction, devons transmettre l'objet de
configuration, ou nous pouvons dire ce que nous
voulons personnaliser. Maintenant, la première
configuration est de niveau. Cette propriété de niveau
définit les types de messages que
nous voulons stocker ou enregistrer. Par exemple, nous
voulons uniquement stocker les erreurs, ou nous voulons enregistrer
les avertissements et
les erreurs, ou nous voulons enregistrer
tous les types de messages. À Minston, nous avons donc
plusieurs niveaux de journaux. premier est l'erreur, qui est le niveau de journalisation le plus élevé en cas
de problème grave. Exemple, échec de
connexion à la base de données. Ensuite, nous avons la guerre pour obtenir des avertissements, informations pour
des messages d'information tels que serveur fonctionnant sur un port ou une
GTB connectée, etc. Ensuite, nous avons les
verbes SDDP debug, Ci. Il s'agit du niveau maximal
ou minimal des journaux. L'erreur est le niveau le plus élevé et CLI est le niveau le plus bas des journaux. Maintenant, si dans l'étiquette, nous transmettons des informations, nous
recevons des messages d'information de niveau
supérieur, ce qui est un avertissement et
nous recevons également un journal des erreurs. Si dans le label, on passe idiot, alors on reçoit tous les messages
des niveaux supérieurs Pour une meilleure pratique,
nous transmettons ici des informations car nous ne voulons pas stocker messages
stupides dans notre fichier journal Maintenant, après l'étiquette,
nous avons les transports, et ici nous devons passer tous les transports que nous
voulons ajouter dans le tableau. En termes simples, où nous
voulons envoyer nos journaux. Nous voulons l'afficher dans la console ou le
stocker dans n'importe quel fichier. Donc, tout d'abord, pour les
informations, les avertissements et les erreurs, nous voulons afficher les journaux
dans la console. Nous ajoutons donc ici de nouveaux transports
à points Winstn. Assurez-vous qu'il s'agit de transports non de transport et point Console. Pour l'instant, il ne reste plus qu'à le consoler. Dans une minute, nous allons stocker ces journaux
dans un fichier séparé. Maintenant, pour utiliser cet enregistreur, nous le stockons dans une
variable appelée logger Et maintenant, nous pouvons utiliser
cet enregistreur dans notre application. Mais
voici une chose. Comment cet enregistreur peut-il savoir quel niveau de message
nous envoyons ? S'agit-il d'une information, d'un avertissement
ou d'une erreur ? Lequel ? Supposons qu'en bas, nous ayons ce simple message d'exécution du serveur de journalisation par
points de console . Il s'agit d'une information. Donc, au lieu d'utiliser le journal point de
la console,
nous pouvons utiliser le logger, que nous venons de créer, et cet enregistreur possède toutes les
méthodes en fonction des niveaux Donc, si nous voulons envoyer un
message sous forme d'informations, nous utilisons ici
logger point info Si nous avons un avertissement, nous utilisons logger point one Maintenant, nous voulons obtenir les informations du point de connexion, et voyons voir si nous
obtenons cette connexion dans la console ou non. Découvrez
où se situent les changements. Et si nous examinons notre terminal, voyons ici que nous obtenons ce niveau d'
objet pour le serveur d' informations et de messages
écoutant sur le port 3 000. Génial. Maintenant, ce n'est pas un
bon format pour le journal. Dans le monde réel, nous n'avons pas seulement
besoin d'une étiquette et d'un message. Nous avons besoin de beaucoup plus
d'informations sur le journal, comme les
horodatages, etc. Donc, dans la configuration, nous avons une autre
propriété appelée format. Nous définissons ici le mode d'affichage des messages du
journal. Ici, nous écrivons le format Winston
point, point Combine. Et là, nous pouvons adopter
un peu le format de Winston. Par exemple, nous ajoutons le format Winston point, point T Stem, puis Winston point format point point JSON Ne t'inquiète pas Nous ne devons
piéger Winston qu'une seule fois Ensuite, nous utilisons simplement cet enregistreur pour imprimer
et envoyer des journaux Partagez les modifications
et jetez-y un coup d'œil. Vous voyez, maintenant nous avons également un horodatage. Maintenant, dans notre
intergiciel d'erreurs, nous utilisons
le
journal des points de la console pour cet objet d'erreur Nous pouvons donc utiliser ici maintenant,
logger point message. Nous devons transmettre
le message d'erreur,
qui est un message d'erreur par point, et nous envoyons également l'objet d'erreur
complet. Voyons ce que nous allons obtenir. Enregistrez les modifications, et
revenons-en à Postman. Et nous envoyons ici une demande de
suggestion. Maintenant, après dix secondes, revenez au code Vas, ouvrez le terminal. voyez, ici, nous obtenons
le message d'
erreur de niveau par rapport au message d'erreur, et dans la propriété stack, nous obtenons l'objet d'erreur complet, que nous transmettons dans la méthode d'erreur
logger point, et à la fin,
nous obtenons time stem Nous allons maintenant rendre ce
journal plus avancé. Ici, nous recevons simplement le message du
journal et la pile de journaux, mais ici, nous ne savons pas
quelle route a causé cette erreur ni quelle méthode
a créé cette erreur. Nous voulons l'ajouter à notre journal. Cela nous donnera
des informations spécifiques. C'est vraiment simple. Ainsi, dans l'erreur logger point, à la place de ce
deuxième argument, nous pouvons passer un objet Dans cet objet, nous pouvons définir quelles sont les autres
propriétés que nous voulons afficher. Donc, d'abord, nous ajoutons une pile
à une pile de points d'erreur. Ensuite, nous voulons la méthode API, donc méthode pour demander la méthode point. Ensuite, nous voulons le chemin pour
demander l'URL d'origine du point. Assurez-vous d'écrire ici
le bon nom de propriété. Nous pouvons également commander
ces propriétés. Supposons que nous voulions afficher
le cerf à la fin, et que nous voulions d'abord la
méthode, puis le chemin Ainsi, dans cet objet, nous pouvons également définir l'ordre
des propriétés. Mais pour cela, dans notre format, nous devons ajouter ce format JSN Dans le cas contraire, cela ne fonctionnera pas. Enregistrez les ficelles et jetez-y un coup d'œil. Renvoyez la demande à partir des suggestions après 10 secondes des suggestions après 10 secondes au code VS dans le terminal. voyez, ici, nous obtenons la méthode du message
d'erreur pour obtenir le chemin d'accès à notre API, origine de cette erreur, la pile
complète de cette erreur et l'
horodatage de cette Charmant. Nous en avons donc terminé avec
le formatage de notre journal. Maintenant, stockons le journal
dans un fichier séparé, et pas seulement dans la console. Ici, dans le transport, nous ajoutons un autre fichier de
points de transport Winston point
transports Ici, nous passons l'objet
dans la propriété, le nom du fichier, les journaux, le journal des points smlogs Assurez-vous que nous utilisons votre extension de
fichier point log, qui nous aidera à
comprendre le contenu du fichier. Maintenant, énoncez les modifications
et jetez-y un coup d'œil. Dans le terminal, nous
obtenons ces informations de journal, et si nous vérifions notre application, notre fichier journal est créé
à l'adresse logs slamlogs point Et si nous ouvrons ce fichier, voyez, nous obtenons des informations
ajoutées dans le fichier. Si nous envoyons à nouveau,
recevons une demande
du facteur et
après 10 secondes, nous obtenons une erreur et si
nous revenons à notre VSCode, nous obtenons un nouveau
niveau de journalisation d' Maintenant, certains développeurs préfèrent
enregistrer uniquement les erreurs dans le fichier, non les informations et les avertissements. Je pense que c'est bien mieux.
Nous pouvons également le faire. Revenons à Winston. Ici,
après le nom du fichier, nous pouvons également spécifier
le niveau d'erreur. Cela signifie ne stocker que
les erreurs dans ce fichier, et nous pouvons également changer le
nom du fichier en error point log. Ainsi, si dans l'un de
ces transports, nous ne spécifiez pas le niveau de journalisation, ce transport
utilisera ce niveau de journalisation global. Et si nous spécifiez le
niveau de journalisation dans les transports, il remplacera
ce niveau de journalisation global Supposons que pour le transport par console, nous ajoutions le niveau de l'objet au débogage Maintenant, pour tous les niveaux
qui concernent le débogage, nous allons afficher la console de connexion et seules les erreurs seront stockées dans
le fichier journal des erreurs C'est ainsi que nous stockons
les journaux dans un fichier séparé, puis nous pouvons améliorer notre
application en conséquence. Donc, pour résumer, le journal des
points de la console n'est pas mal. Mais en utilisant Winston, nous pouvons stocker nos journaux dans un fichier séparé, ce qui rend notre application
plus professionnelle
136. Erreurs de journalisation dans mongoDB: Dans cette leçon,
nous allons maintenant stocker nos journaux dans notre base de données Mongo
DB comme ceci C'est très simple,
allons-y. Pour stocker les
journaux dans Mongo DB, nous avons besoin d'un autre
package Winston, ouvrez le terminal, et écrivez ici NPM
install Winston Mongo DB, au taux 6.0
0.0 et appuyez Minimisez ce terminal, super. Maintenant, pour ajouter ce
package en haut, nous avons besoin de Winston des Mongo DB Maintenant, dans la
configuration de Winston, nous devons ajouter un autre
transport pour Mongo DB Donc, après ce transport de fichiers, nous ajoutons un nouveau point de
transport de points Winston MongoDB Et dans ce transport, nous devons définir certaines options. Le premier est DB. Ici, nous devons
ajouter l'URL de la base de données. Il suffit de copier cette
URL de connexion à la base de données Mongo et de la coller ici Nous pouvons également transmettre
la propriété du journal niveau par niveau à
une erreur, et c'est tout. Découvrez les modifications et vérifierons simplement cette
implémentation. Exécutons notre
serveur s'il ne
fonctionne pas et envoyons la même demande de
suggestions. Après 10 secondes de
retour au code Vas
, nous obtenons l'erreur dans la console et si nous
vérifions notre base
de données, nous obtenons une nouvelle collection de journaux, et nous obtenons
notre dernière erreur. Ici, nous obtenons l'
horodatage, le niveau du journal, qui est une erreur, un message d'erreur, et enfin, nous obtenons C'est le même objet
que nous transmettons au deuxième paramètre de l'erreur
logger point error voyez, nous avons ici la méthode, le chemin et la
pile complète de l'erreur. C'est aussi simple que cela de consigner
les erreurs dans la base de données. Si vous souhaitez stocker
les journaux dans la base de données, vous pouvez conserver
ce transport. Et si vous souhaitez stocker les
journaux dans un fichier séparé, nous pouvons nous en tenir à
ce transport de fichiers. Montrez-vous dans les deux
sens, vous pouvez utiliser n'importe lequel d'entre eux
selon votre choix. Cela dépend vraiment de toi.
137. Exceptions non prises: Donc, jusqu'à présent, dans ce projet, des erreurs de gestion se sont
produites dans le gestionnaire de route et
le gestionnaire de route
transmettra l'erreur
ou l' exception au middleware d'erreur
global Maintenant, que se passe-t-il si nous obtenons une erreur dans le reste de l'application du
nœud ? Nous ne l'avons pas géré, non ? Donc, pour le démontrer, je supprime le commentaire de la connexion à la base de données Mongo et lance
simplement une nouvelle
erreur à partir de là Alors lancez une nouvelle erreur, et nous passons ici un message d'erreur, quelque chose échoue dans
l'application du nœud. Les modifications, et
dans notre terminal, arrêtent notre application, et nous exécutons notre application en utilisant
node index point js. voyez, ici nous obtenons une erreur, quelque chose échoue dans
l'application du nœud, et notre
application est également bloquée. C'est ce qu'on appelle
une exception non détectée. Une exception non détectée est comme un
invité surprise lors d'une fête Vous n'y êtes pas
préparé et cela cause le chaos car il
n'y a aucun plan pour y faire face. En termes simples, chaque fois qu'une application de
nœud un problème ou une exception qu'elle ne
sait pas comment gérer, elle appelle une exception non codée Ce sont des erreurs dans notre code, elles ne sont pas détectées par un essai et une capture appropriés
ou ne sont pas gérées correctement . Par conséquent, Node ne sait
tout simplement quoi faire et notre
application se bloque. Lorsque notre application tombe en panne, notre interface ne recevra pas
les données de notre interface principale. Notre API ne fonctionnera pas. Il est donc important de gérer
ces exceptions de décodage. La question qui se pose maintenant est de savoir comment gérer les exceptions de décodage
dans notre application de nœud ? Parce que ces exceptions ou
erreurs peuvent se produire n'importe où. Comment pouvons-nous
y faire face ? Pour cela, nous devons ajouter un écouteur pour notre application de nœud.
Laisse-moi te montrer. Donc, ici, après le Winston, nous écrivons le point de processus Cela nous aidera à ajouter un
auditeur pour un événement spécifique. Maintenant, sur quel événement,
nous voulons écouter. Écrivez, c'est une exception non codée. Assurez-vous d'écrire
le même nom d'événement. Sinon, cela ne fonctionnera pas. Maintenant, que voulons-nous faire lorsqu' exception
non codée se produit
dans notre application Que nous ajoutons une fonction de rappel et qu'il y ait une erreur ou une exception Dans la
fonction de rappel, pour l'instant, il suffit
de consulter un
journal de cet objet d'erreur Ce processus en forme de point est
comme une personne surveillante. Il surveille
notre application, et si une exception uncod se produit dans notre application, exception uncod se produit dans notre application, process point on exécutera
cette fonction de rappel Ainsi, au lieu d'
utiliser le journal point de la console, nous pouvons utiliser logger point error Et dans ce cas, nous devons d'abord transmettre une exception de chaîne non détectée, puis nous transmettre le stag d'erreur
complet Voyons si cela
fonctionne ou non. Enregistrez les modifications,
et dans le terminal,
filtrons le terminal
avec la commande CLS, puis nous exécutons notre application
en utilisant node index point js voyez, ici, nous avons notre erreur dans la console et notre application n'
est pas gazonnée d'elle-même. Mais comme nous pouvons le voir,
nous n'obtenons pas non plus les informations du serveur fonctionnant
sur le port 3 000, ce qui signifie que le serveur ne
fonctionne pas. Notre application se
trouve donc au milieu. Le serveur ne fonctionne pas et l'application ne fonctionne pas. Notre application
n'est donc pas dans un état stable. Ce que nous voulons faire maintenant, est sortir de cet état
instable. Ainsi, après l'erreur logger point, nous écrivons simplement
process point exit, et ici nous en passons
un comme code de sortie L'un signifie erreur. De plus, nous avons le code de sortie zéro, qui signifie que tout va bien, mais nous voulons quand même sortir. Et si nous passons le code de sortie 1, cela
signifie qu'une erreur se produit, et c'est pourquoi nous sortons. Donc, les changements, et
exécutons notre application
une fois de plus. Node, index point Js et C, maintenant nous quittons avec succès
notre application. Magnifique. Maintenant, vous pourriez vous poser cette question si après avoir
géré l'exception, nous sommes
toujours en train de
fermer notre application, alors à quoi bon gérer
l'exception non détectée ? La gestion des exceptions non détectées ne
consiste donc pas à
empêcher le réglage. Il s'agit de s'assurer que le montage se déroule
de manière ordonnée, sûre et informative. Lorsqu'une
exception non détectée se produit, état de
notre application est imprévisible Après un crash non accepté, certaines parties de notre application risquent de
ne pas fonctionner comme nous le souhaitons Par exemple, nous avons des connexions de
base de données
rompues, de la mémoire corrompue, des
demandes incomplètes, etc. Le redémarrage de l'application garantit qu'elle redémarre à zéro sans
problèmes supplémentaires dus à De plus, en production,
des outils tels que PM two, Docker ou Kubernets
surveillent notre application Lorsque notre application s'arrête, ces outils
redémarrent automatiquement notre application. La gestion de l'erreur
garantit la sortie
claire de l'application en utilisant le
process point exit V, et permet également à
l'outil de surveillance de redémarrer plus facilement l'outil de surveillance de redémarrer notre application sans problèmes
en suspens. De plus, une chose que je rencontre ici est que lorsque nous
effectuons une sortie par point, nos journaux ne sont pas stockés dans le fichier
ou dans la base de données, mais vous pouvez voir le journal dans la console. Qu'est-ce qui ne va pas ici ? Ainsi, lorsque nous procédons à la sortie par point, notre application de nœud est immédiatement
interrompue. Il n'attend pas la fin d'une tâche
asynchrone telle que la connexion à un fichier ou à
une base de données En termes simples,
le processus point exit one n'attend pas la fin de ces
opérations, de sorte que la partie du journal peut être partiellement
ou complètement ignorée Maintenant, comment pouvons-nous résoudre ce
problème ? C'est vraiment simple. devons quitter le processus une fois que notre enregistreur a terminé
son processus de journalisation. Donc, après cette erreur de point d'enregistrement, nous écrivons logger point on, et vous l'avez bien deviné,
c' est également un
auditeur Ici, nous passons le nom de notre événement, qui est finish, et au deuxième argument,
nous passons
la fonction de rappel, et dans ce cas, nous pouvons simplement déplacer ce
processus par un point vers la sortie 1 Pour de meilleures pratiques,
nous enregistrons également des points. Enregistrez les modifications et
voyons si cela fonctionne ou non. Lancez cette application, et si
nous vérifions notre fichier journal, voyez, ici nous obtenons un nouveau
journal, donc il fonctionne
138. Promesses non traitées: Supposons que dans notre application de
nœud, nous ayons une promesse qui
soit rejetée et que nous ayons oublié de
gérer cette erreur en utilisant blog
try and cache
ou la méthode cache. Cette promesse rejetée
doit être traitée. Donc, pour le démontrer,
nous le supprimons par erreur et nous créons
ici une nouvelle promesse. Supposons qu'une promesse de coût rejetée
soit égale à une nouvelle promesse. Comme nous le savons, ici, nous devons transmettre la fonction de
rappel avec deux paramètres,
dissolve et reject Maintenant, pour rejeter la promesse, il suffit d'appeler ici la méthode de
rejet, puis de créer une nouvelle
erreur et de transmettre un message d'erreur. Qu'est-ce qu'on écrit en cas d'erreur ? Disons qu'il y a une erreur dans la promesse. Désolé pour ce message d'erreur. Maintenant, profitons de cette promesse. Rejetez alors un point de promesse et dans cette fonction
d'erreur, nous
consultons simplement le journal des points, la
promesse fonctionne. On peut même utiliser ici OD, mais pour cela, il faut l'
encapsuler avec une fonction sin. C'est pourquoi j'utilise la méthode then, et ici nous ne gérons pas l'
erreur en utilisant la méthode du cache. Voyons maintenant ce qui va se passer. Enregistrez les ings et exécutons notre application avec
node index point js. Ici, nous obtenons le journal de cette erreur
et, comme nous pouvons le voir, une
exception non détectée est à nouveau appelée Dans les versions 15 et
supérieures à 15, rejet de promesse
non géré est traité davantage comme une exception
banale. Si nous n'avons pas géré le rejet des
promesses, cela peut être répercuté dans un gestionnaire d'exceptions
non coupé Pour stocker séparément le rejet
UnhandlePmise, nous pouvons dupliquer
ce code et simplement modifier l'événement pour
annuler le Toujours dans l'enregistreur, nous transmettons ici le message d'erreur sous forme de rejet de promesse non géré Regardez les modifications et
exécutons cette application
une fois de plus. Vous voyez, nous avons maintenant un message
d'erreur, un rejet de
promesse non géré C'est ainsi que nous pouvons
gérer les exceptions non détectées
et le rejet
d'UnhandlePmise et le rejet
d'UnhandlePmise Maintenant, dans notre application, modifions ce journal de points de
console pour la connexion Mongo Di B. Qu'est-ce qu'on écrit ici ?
Informations sur les points de l'enregistreur Et dans la méthode du cache, nous remplaçons ce
journal point de console par logger point error Et aussi, après l'
échec de la connexion, nous pouvons quitter notre
application car toute
notre application
dépend de cette connexion. Nous enveloppons donc ce code
entre crochets. À partir des auditeurs
globaux,
copiez simplement ce point d'enregistrement et ce point d'enregistrement, et collez-les Cela permettra à notre
application de stocker le journal dans le
fichier et la base de données. Maintenant, nous n'avons pas non plus besoin cette promesse d'erreur
ni de cette méthode. C'est ainsi que nous gérons les
erreurs et
les enregistrons afin d'améliorer et de
suivre notre application.
139. Récapitulatif de la gestion des erreurs et de la journalisation: Récapitulons rapidement
cette section. Donc, avant cette section
de notre application, nous ne traitions pas les erreurs. Nous traitons donc d'abord les erreurs
pour les gestionnaires de route des API. Toute erreur se produit dans
le gestionnaire de route, cette erreur sera envoyée au middleware suivant
par
la dernière version d'Express, et après toutes les routes
du fichier index point js, ajoutez un intergiciel d'erreur qui gère toutes les Maintenant, après avoir traité les erreurs, nous pouvons les stocker dans
les fichiers ou dans la base de données. Donc, pour enregistrer les erreurs, nous utilisons le package de base de données Winston et Winston
Des Mongo Ici, nous configurons l'
enregistreur Winston dans lequel nous spécifiez le format d'étiquette de journal global de notre journal et certains transports
pour envoyer notre journal vers une console, fichier et même dans Mango Di Grâce à ceux-ci, nous pouvons enregistrer
les erreurs des gestionnaires d'itinéraires. Mais que se passe-t-il si quelque chose
ne va pas en dehors de l'express ? Nous définissons donc deux auditeurs
globaux, l'un pour les exceptions non détectées et l'autre pour les rejets
non gérés N'oubliez pas que si nous n'ajoutons pas écouteur pour un rejet
non géré,
par défaut, le nœud traitera rejet de la
promesse comme une exception
non détectée De plus, dans ces auditeurs mondiaux, nous enregistrons les erreurs,
puis nous configurons notre application avec élégance
. À la fin, ce point d'enregistrement
arrêtera d'écrire de nouveaux journaux, mettra
fin à tous les journaux en attente
et fermera les flux de transport tels que les
flux de fichiers,
SDDPRQuest ou les connexions à la base
de données pour l'enregistreur fin à tous les journaux en attente
et fermera les flux de transport tels que les
flux de fichiers, et fermera les flux de transport tels que les
flux de fichiers, SDDPRQuest ou les connexions à la base Tout dépend de la gestion
et de la journalisation des erreurs. Dans la
section suivante, nous ajouterons d'autres fonctionnalités à notre application de
commerce électronique.
140. Section 12 - Créer un modèle de panier: Bienvenue dans une autre section
importante du cours No Jz ultime Dans cette section, nous allons
avancer dans notre projet de
commerce électronique. abord, nous ajouterons
quelques fonctionnalités de carte, puis nous intégrerons passerelle de
paiement dans
notre application, ce qui est vraiment important
et amusant à créer. Je suis vraiment excitée
et j'espère que vous l'êtes aussi. Commençons donc cette section. Jusqu'à présent, dans notre projet, nous avons ajouté des
catégories d'utilisateurs et une API de produits. Maintenant, lorsque l'utilisateur souhaite
acheter un produit, il ajoutera son
produit dans la carte. La carte fonctionne donc comme un panier
ou un chariot dans un supermarché. Ajoutez tous les produits que
nous voulons acheter, puis nous payons pour
ces produits. Nous le savons déjà, non ? Nous allons donc créer un nouveau
modèle pour les données CAT. Ainsi, dans le dossier des modèles, nous créons un nouveau fichier
appelé cart point js. Maintenant, pour définir le schéma, nous avons d'abord Cost Mongoose est
égal à require mongoose Ensuite, nous définissons que schéma
st CAT est égal au
nouveau schéma de points Mongoose Nous ajoutons ici notre schéma de carte. Dans ce modèle de carte, nous stockerons les détails de la carte de tous les
utilisateurs. Donc, tout d'abord, nous devons
stocker le type
d'utilisateur à objet schéma de points Mongoose, les types de
points, le point, l'ID d'objet, référence à l'utilisateur, et nous le
rendons simplement obligatoire sur true Maintenant, après utilisateur, nous voulons quels produits l'utilisateur a ajoutés à sa carte. Nous ajoutons donc des produits remplis, et comme nous le savons dans CAT, l'utilisateur peut ajouter plusieurs produits. Ce sera donc la
gamme de produits. Maintenant, pour chaque produit, nous stockons l'objet du produit, et dans cet objet, nous stockons le premier identifiant du produit. C'est encore une fois une référence, donc je copie simplement cet objet de
schéma pour l'utilisateur. Collez-le ici pour l'identifiant du produit, et assurez-vous de remplacer cet utilisateur de
référence par produit. Maintenant, après l'identifiant du produit, nous avons besoin
de la quantité de ce produit. Nous ajoutons donc la quantité
à l'objet, au type, au nombre requis pour vrai
parce que c'est nécessaire. Mais aussi, nous pouvons également ajouter une
valeur par défaut à un pour des raisons de sécurité. Maintenant, si nous imaginons
notre interface, nous voulons afficher des données comme celles-ci. Tout d'abord, nous voulons afficher le nom ou le titre
du produit, puis le prix, puis
la quantité et le total. Si nous stockons uniquement l'
identifiant du produit dans les données de la carte, nous devons exécuter le formulaire de saisie pour obtenir les détails du produit, tels que le titre, le
prix, l'image, etc., mais l'obtention des données de la carte prendra plus de temps Nous pouvons utiliser ici une approche hybride. Si les
besoins de votre application sont différents, vous
devez vous en tenir à
la seule approche de référence. Donc, si vous recherchez des performances, vous
utilisez l'hybride, et si vous souhaitez que
les données soient cohérentes lorsque le titre de vos
produits les images de
prix
changent plus souvent, vous
devez utiliser une approche de
référence. Ainsi, après la quantité,
nous ajoutons le titre, le
type à la chaîne et
required à true. Ensuite, nous avons besoin du prix, type au numéro, du
obligatoire pour vrai. Après le prix, il se peut que nous
ayons besoin d' une image qui sera l'image de
couverture du produit, du type à la chaîne et qui
doit être vraie. Enfin, nous avons besoin du prix total, qui est le prix total
du produit actuel, type par numéro et
obligatoire pour vrai. Ce prix total, nous le compterons par prix en quantité, n'est-ce pas ? C'est tout ce dont nous avons besoin dans
l'objet du produit. Maintenant, qu'est-ce qu'il nous faut
de plus dans le panier ? Revoyons la page GRT. Tout d'abord, sur tout site de
commerce électronique, nous obtenons le nombre de produits
dans le Nepar ou ailleurs Et pour la page CRT,
nous devons également afficher le prix
final du produit Nous avons donc besoin de deux autres champs
dans notre schéma de carte. Tout d'abord, le nombre total de produits à
taper est par défaut égal à zéro. Si sur notre carte, nous avons deux iPhones et
trois montres intelligentes, alors notre total de
produits sera de cinq Et après le total des produits, nous avons besoin du prix total de la carte. Nous pouvons l'associer au prix final, mais le prix total de la carte
semble plus intéressant. Donc, le prix total de la carte, type au numéro, et
la valeur par défaut est zéro. Maintenant, vous vous demandez peut-être pourquoi nous devons enregistrer
le prix total de la carte ? Pourquoi ne pouvons-nous pas calculer les
valeurs lorsque nous envoyons les données des cartes ? La raison pour laquelle nous enregistrons le prix
total de la carte est principalement
parce que l'affichage est plus rapide. Ainsi, lorsque l'utilisateur consulte sa carte, le site Web peut afficher le prix total instantanément sans le
recalculer Cela permet de gagner du temps, surtout s'il y a de nombreux
produits dans la carte. Deuxièmement, réduisez la charge
de travail du serveur. Cela est dû au fait que nous
n'avons pas besoin de calculer le prix final
plusieurs fois au lieu de cela. Imaginons donc que notre utilisateur ait dix
produits différents sur sa carte. Sans le prix total de la carte, notre serveur doit examiner
les dix produits et additionner leurs prix chaque fois
que vous ouvrez la page de la carte. Maintenant, avec le prix total de la carte, notre serveur récupère simplement le prix total
déjà enregistré en magasin Cela permettra d'économiser du temps et des efforts, et c'est pourquoi nous stockons ici prix
total de la carte
dans la base de données. Notre schéma de
carte est maintenant prêt. Si, à l'avenir, nous voulons ajouter d'autres champs ou
supprimer quelque chose, nous pouvons également le faire. Il n'y a rien de
mal à cela. De plus, ne vous en tenez pas
à une approche. En tant que développeur, nous devons
toujours réfléchir à ce
qui rend notre application ou notre produit plus utile et rapide pour les
utilisateurs finaux. C'est aussi simple que ça. Créons maintenant un modèle de panier, deuxième carte étant égale
au modèle à points mangos Tout d'abord, nous ajoutons un nom singulier, qui est cart, et
au deuxième argument, nous passons le schéma du panier. Enfin, à la fin, nous ferons en sorte que le module dot
exports soit égal à CAT.
141. Définir la liste API pour le panier: Avant de commencer à
créer les API pour les cartes, voyons lesquelles et combien d'
API nous devons créer. Cela nous apportera de la clarté. Voici donc mon processus pour
définir la liste des API. J'ai commencé à imaginer le front-end du point de vue de l'
utilisateur. En termes simples, je me mets
dans la peau d'un utilisateur normal, ce qui concerne ce que l'utilisateur
veut faire avec une carte. Tout d'abord, ils veulent simplement
ajouter un produit sur la carte. Il s'agit donc de notre première API. Après avoir ajouté le
produit à la carte, ils veulent voir leur propre panier, produits qu'ils ont ajoutés et le montant d'argent dont
ils ont besoin pour acheter. Nous avons donc besoin d'une API pour obtenir
le panier utilisateur actuel. De plus, dans la barre Nouveau, ils aiment voir le nombre de produits disponibles dans le panier. Nous pouvons donc créer une
API distincte pour les numéros de carte uniquement. Ensuite, sur la page du panier, ils peuvent augmenter
la quantité de produits ou diminuer la
quantité de produits, et ils peuvent également supprimer les produits entiers
de la carte. Ici, nous avons besoin de trois API supplémentaires, une pour l'augmentation, la
seconde pour la diminution et la dernière pour la suppression du produit. Nous avons donc ici la liste
des API pour le panier. Bien entendu, nous pouvons ajouter ou
supprimer des API de cette liste. Cela dépend vraiment de nous.
142. Ajouter des produits au panier: Commençons par notre
première API pour CAT, qui consiste à ajouter un seul
produit dans la carte. Ainsi, dans le dossier routes, nous créons un nouveau fichier
appelé card point js. Bien. Maintenant, dans ce fichier, nous créons un routeur pour l'API. Const Express est donc égal
à require Express, et après cela, cost Router est égal à express point Router Et comme nous le savons, à la fin, module point ports
est égal à Router. Avant de définir l'API, configurons ce routeur dans
notre fichier index point js. Dans le cas contraire, nos
API de panier ne fonctionneront pas. Enregistrez ce fichier, déplacez-le vers le fichier
index point js et
ici const CAT routes est égal à
require periods routes CART Assurez-vous d'écrire ici, ce n'est pas
obligatoire. J'ai récemment commis cette erreur. Maintenant, en bas,
nous ajoutons le point
g de l'application . Ici, nous ajoutons le préfixe
API slash CAT Ici, nous ajoutons des itinéraires par cartes. Charmant.
Commençons maintenant par l'API Head to Cart. Nous ajoutons donc ici le routeur. Et pouvez-vous me dire quelle
méthode nous allons utiliser ? Bien, nous utiliserons la méthode post. Donc, le point de terminaison du routeur est transféré, puis
nous ajoutons un rappel de route avec
demande et réponse Maintenant, que
voulons-nous du front end ? Nous avons principalement besoin de deux choses. Tout d'abord, nous avons besoin de
l'identifiant du produit que l'utilisateur souhaite
ajouter à la carte. Ensuite, nous voulons connaître la quantité de leur produit. À la fois, l'utilisateur ne peut
ajouter qu'un seul produit
avec sa quantité, et s'il souhaite
ajouter un autre produit, il doit appeler à nouveau
cette API. est aussi simple que ça. Nous obtenons donc d'abord les détails dans le corps du point de la
demande. Nous pouvons le restructurer ici et
obtenir l'identifiant et la quantité du produit De plus, pour plus de commodité, nous obtenons l'ID du produit
dans le paramètre de requête. Supprimez-les donc d'ici
et dans le point de terminaison, nous ajoutons l'identifiant du produit à deux points. Et pour obtenir cet identifiant de produit, nous ajoutons ici que le coût ID du produit est égal à l'identifiant du produit point
PRAM point de demande Bien. Maintenant,
qu'est-ce que nous voulons ? Oui, nous avons également besoin d'un identifiant utilisateur. Et comment pouvons-nous y parvenir ? Oui, nous pouvons ajouter un orthomidalware ici, et pour obtenir l'utilisateur, nous pouvons écrire const
user is equal
to request point user point underscore ID to request point user point Maintenant, voici une partie
logique de ce que nous voulons vraiment faire dans
l'API Head to Cart. Tout d'abord, nous vérifierons ou non l'
identifiant du produit et la quantité au
recto et au cent. Commencez toujours par la validation. Nous ajoutons que si l'
identifiant du produit n'est pas disponible ou si la quantité n'est pas disponible, nous renvoyons une erreur. Renvoie donc la réponse, l'état du point, 400 pour les champs manquants, et un objet JSON à points avec propriété
Menset, les remplissages obligatoires
manquants Bien. Maintenant, après cela, nous vérifions si le front-end transmet l'identifiant de produit
valide ou non. Y a-t-il un produit avec
cet identifiant dans notre base de données ? Pour cela, nous écrivons le coût, produit est égal au poids
du produit trouvé par identifiant, et nous passons ici l'identifiant du produit. De plus, si la saisie automatique
ne fonctionne pas
, nous devons
saisir manuellement ce modèle de produit. Donc, pour utiliser await, nous devons rendre cette
fonction asynchrone Maintenant, en bas, nous pouvons
mettre ici si la condition,
si le produit n'est pas disponible,
nous renvoyons une réponse dont le
statut est 404 point Json. Et dans la propriété messet, nous passons le produit introuvable Encore une fois, je demande ce que nous voulons faire dans l'API
Ajouter au panier. Allons-y étape par étape. Ne vous y trompez pas. Nous
voulons simplement faire une chose. Nous créons une nouvelle carte
pour l'utilisateur et
ajoutons simplement le produit actuel dans la gamme de produits
avec les informations requises. Mais il est possible que cette carte d'utilisateur soit
déjà disponible. Ici, nous ne voulons pas
créer de cartes dupliquées, nous vérifions
donc que const card
est égal à wait card Voir la saisie automatique fonctionne, point
de carte Fine One. Et ici, dans l'objet de
condition, nous passons l'identifiant de l'utilisateur à l'autre. Maintenant, comme nous le savons à la fois, un utilisateur n'a qu'
une seule carte, car si vous
retirez les produits
après le paiement avec succès, nous supprimerons la
carte utilisateur de la base de données. Si cet utilisateur a sa carte, nous l'obtenons dans
la variable de la carte. Et si l'utilisateur n'a pas de panier ? Il peut d'abord produire pour carte. Nous vérifions donc l'état. Si le panier n'est pas disponible,
que voulons-nous faire ? Bien, nous allons
créer une nouvelle carte. Donc, nouvelle carte. Et nous passons ici Object. abord, nous ajoutons l'utilisateur à l'ID utilisateur, le
produit au tableau vide pour le moment. Total des produits à zéro et prix
total de la carte à zéro. Maintenant, cela renverra le panier. Ici, nous pouvons simplement utiliser
cette variable de carte et remplacer sa valeur car
si la carte n'est pas disponible, qu'alors que nous
créerons un nouveau CAT. Sinon, nous obtenons l'objet de la carte
dans cette variable de carte. Nous utilisons ici que la carte est
égale à un nouveau panier. Donc, pour remplacer
cette variable de carte, nous devons la définir
en utilisant let. Sinon, nous aurons une erreur. Êtes-vous d'accord jusqu'à présent ? Et aussi, si vous êtes un peu
confus, ne vous inquiétez pas. Lorsque nous aurons terminé cette API, nous la récapitulerons à partir de zéro Ainsi, toute votre
confusion disparaîtra. Nous avons donc un panier et il suffit placer le produit
dans le
tableau des produits avec la quantité et d'autres champs que nous
définissons dans le schéma. Nous pouvons donc faire Cart Dot
Products Dot Push. Et ici, nous passons
l'objet du produit, que nous voulons pousser. Donc, j'oublie vraiment l'objet, quels sont les
champs. Laissez-moi vérifier le modèle CAT. OK. Donc, d'abord, de l'identifiant du produit à l'identifiant du produit, de la quantité
à la quantité. Après cela, nous avons le titre. Maintenant, comment pouvons-nous
obtenir le titre du produit ? Parce que le front-end
ne transmettra que l'identifiant du produit. Pensez-y. Nous obtenons donc détails
du produit à partir de
cette variable de produit. Voir ici, nous vérifions également que le
produit est valide ou non. Si le produit est valide, nous obtenons ses détails
dans la variable du produit. Alors maintenant, la
raison pour laquelle nous trouvons un produit est logique. Cela validera l'identifiant du produit et nous obtiendrons également
d'autres détails. Donc, du titre au point du titre du produit. Prix par point par produit, qui est le prix actuel
du produit, image, qui est l'image de couverture,
donc image par point du produit, qui est un tableau, et nous avons
simplement défini la première image. Vous vous demandez peut-être pourquoi nous n'
obtenons pas ces informations
depuis le front-end. Imaginons que nous obtenions ce
détail de prix sur le front-end. Si vous dépassez zéro
pour un produit, le prix sera enregistré
à zéro pour sa voiture Nous ne pouvons donc clairement pas nous
fier aux données initiales. Il vaut mieux obtenir des
données réelles de la base de données. Maintenant, après cette image, nous avons le prix total
de ce produit, qui est le
prix actuel exprimé en quantité. Donc, le prix du produit correspond
à la quantité. Et c'est tout ce dont nous avons besoin
dans la gamme de produits. Il ne nous reste plus
qu'à faire deux choses. Nous devons compter le
total des produits de la carte, puis le prix
total de la carte. Les deux sont très simples. Et savez-vous quelle méthode nous utiliserons pour
compter la somme ? Bien, nous utiliserons
une méthode réduite. Nous écrivons cart point total products est égal à cart point products, ce qui correspond à la réduction des points par tableau Comme nous le savons, nous devons passer deux arguments dans
la méthode réduite. La première est la fonction de rappel
dans laquelle nous calculerons la quantité de produits, puis valeur
par défaut de la
quantité qui est nulle Maintenant, dans le rappel,
nous obtenons deux paramètres, total et product, qui sont
un seul objet de produit Dès le rappel,
nous renvoyons simplement total plus la quantité de points du produit En bref, cette
méthode réduite fait tourner la boucle pour chaque produit et nous donne la
somme de la quantité de produit. Génial. Il ne nous reste plus qu'
à calculer le prix total de la carte et nous utiliserons à nouveau la
méthode de réduction pour cela. prix total de la carte par points est égal
à celui des produits par points par carte, réduction du
point. Ici encore, nous
avançons deux arguments. La première est la fonction
callbeck avec fonction flèche pour le
total et
l'objet du produit Ensuite, nous prenons simplement la valeur
par défaut de ce
total, qui est zéro. Ce que nous renvoyons de
cette fonction de rappel. Nous renvoyons simplement le total
plus le prix par point du produit dans la quantité du produit. Ou pour des raisons de simplicité, nous pouvons
renvoyer le total plus le prix total, que nous avons calculé ici. De plus, je pense que nous n'avons pas besoin de
ce champ de prix total. Cela n'a pas vraiment d'
impact. Qu'est-ce que tu en penses ? Oui, donc
supprimons-le de la méthode push, et nous devons également
le supprimer du schéma. Passez au schéma du véhicule et supprimez ce prix total indiqué dans
l'objet des produits. est aussi simple que ça. Maintenant que toutes les cartes sont
remplies de détails, nous pouvons simplement enregistrer la carte. Attendez le point C.
Après avoir enregistré la carte, nous renvoyons simplement la réponse, point status, 201 et 200 car ici nous pouvons créer une nouvelle carte ou simplement
ajouter les produits. Ajoutez également un message à
l'objet Json, le produit a été ajouté à la
carte avec succès. Et après cela, nous renvoyons simplement panier complet
dans la réponse. Si vous n'avez pas besoin d'envoyer, vous pouvez également
le supprimer. Nous allons maintenant tester cette implémentation
d'API car les tests sont
très importants. Regardez les modifications, et
revenons au facteur. Dans le cadre de notre projet, nous créons une nouvelle
collection appelée CAT. Et dans la collection CAT, nous créons une nouvelle demande
intitulée ED products to CAT. abord, nous changeons la méthode
pour publier l'URL de l'API sur l'hôte local, l'API de la
colonne 3 000 slash CART SLS et nous
devons ici transmettre l'identifiant du produit, que nous voulons ajouter dans Pour l'instant, il me suffit d'en transmettre une
et d'envoyer la demande. voyez, ici, nous obtenons un jeton
d'autorisation est requis car dans notre API, nous avons ajouté un intergiciel Générons un nouveau jeton, envoyons la demande de connexion, et voilà que nous obtenons le
jeton. Copiez ceci. Maintenant, dans l'API de la carte, nous allons dans les en-têtes et ajoutons ici l'
autorisation dans la valeur, ajoutons de l'espace dédié à la bière et collons notre jeton
sans double code Maintenant, envoyez la demande. Vous voyez, nous avons ici une erreur
interne du serveur. Et si nous vérifions notre terminal de code
VS, nous ne pouvons pas
ici
déstructurer la propriété, la
quantité de points de requête, le corps du point Cela se produit parce que nous ne
transmettons pas la quantité dans le corps du point de la
demande. Alors dirigez-vous vers
Mongoi B Compass. Dans la collection de produits, il suffit de
recopier cet identifiant iPhone 14 dans Postman ici à
la place de celui-ci, nous collons l'identifiant de l'objet Et dans le corps, permettez-moi de
supprimer ces deux propriétés. Maintenant, nous voyons raw et transmettons
simplement
à votre objet une propriété, qui est la quantité à deux. Et envoyons cette demande. Vous voyez, ici, le produit est
ajouté à la carte avec succès. Et ici, nous pouvons
également voir la carte. Permettez-moi d'augmenter ce chiffre. voyez, ici, nous obtenons un utilisateur, total des produits à deux parce que
nous passons la quantité à deux, prix
total de la carte à 2598,
ce qui est également correct Nous obtenons également ici une
gamme de produits avec tous les objets du produit. Ici, nous pouvons voir que nous
obtenons également la quantité,
le titre, le prix et l'image actuels . Essayons maintenant quelque chose de plus. Remplaçons la quantité à une et stockons simplement
le même produit. voyez, ici, nous obtenons un produit
mort avec succès, total des produits et le
prix total du panier, les deux sont également corrects. Mais si nous examinons notre gamme de
produits, vous voyez, nous obtenons
ici un autre objet de
produit, même si ce même produit est déjà disponible dans
la gamme de produits. Dans notre API, nous avons un problème. Comme nous pouvons le voir ici, nous plaçons directement le produit
dans la gamme de produits. Et si ce produit est déjà disponible dans
la gamme de produits ? Dans ce cas, nous devons simplement augmenter la quantité
de leur produit. Ici, avant que les
produits cartonnés ne soient
ajoutés, nous devons vérifier que les
produits que nous
ajoutons sont déjà disponibles
dans la gamme de produits ou non. C'est vraiment simple. Donc, pour trouver le produit, nous ajoutons des produits CRT point,
point Find index Ici, nous obtenons un objet de
produit unique, fonction
flèche, et ici
nous passons la condition, le
produit, le point, l'identifiant du produit, point deux chaînes est égal à l'identifiant
du produit point ToString Maintenant, comme nous le savons, cette méthode d'
indexation fine renverra la valeur d'indice du produit
qui
a satisfait à cette condition. Nous le stockons donc dans une variable appelée indice de produit existant. Et si le produit n'est pas trouvé
dans le tableau des produits, il renvoie
moins un comme index. Nous pouvons donc l'utiliser
dans cet état. Donc, mon index de produits existant n'
est pas égal à moins un, ce qui signifie que le produit est déjà disponible dans la gamme de produits. Dans ce cas, nous
augmenterons simplement la quantité
de ce produit, et comment pouvons-nous trouver
cet objet de produit ? Bien, en utilisant cet index de produits
existant, donc le panier met les produits
entre crochets, nous ajoutons un index de produits existant. Nous obtenons ainsi la quantité de points par
objet du produit. Plus est égal à la
quantité actuelle. C'est ça. Et si le produit n'est pas trouvé
dans le tableau de produits, qu'alors que nous insérons l'ensemble de l'objet
du produit dans le tableau. Nous adhérons donc à s et déplaçons cette méthode
push dans le blog s, et c'est tout. Consultez les modifications. Et maintenant, avant les derniers tests, retirons la carte complète
de la base de données
et créons une nouvelle carte. Retournez à Postman,
envoyez la demande. Super, nous n'avons qu'un seul produit. Maintenant, changeons la quantité à deux et envoyons simplement la demande. Vous voyez, maintenant notre quantité
ne fait qu'augmenter, et le total des produits et le prix
total de la carte sont également corrects. Il y a maintenant un petit problème
dans cette implémentation. Le produit peut avoir un stock
suffisant ou non. Nous devons vérifier cela avant d'
ajouter le produit au GAT. Donc, ici, après avoir obtenu le produit, nous passons à une condition comme celle-ci. Dans le cas d'un produit, le stock est
inférieur à la quantité, puis nous renvoyons simplement le statut du point de
réponse, objet Json à
400 points
avec la propriété du message. Le stock ne suffit pas. Voici maintenant un autre cas. Supposons que notre
stock de produits soit de quatre et que
nous voulions ajouter le produit dans le panier avec une quantité de trois. Cela passera
cette condition. Et si ce produit, qui n'en est que quatre en stock, nous avions déjà ajouté deux
quantités de produits auparavant et que nous voulions
maintenant en ajouter
trois autres pour le même produit. Dans ce cas, nous devons empêcher l' augmentation de la quantité
de
nos produits. Alors dites-moi où nous
écrivons notre condition. Écrivez, dans la condition d'
index existante. Je place les produits
entre crochets, les produits existants, quantité de points d'
index plus
la quantité que nous voulons ajouter est supérieure ou égale
au stock de points du produit. Si c'est vrai, alors nous
renvoyons la même réponse avec le code d'état 400
et dans la méthode Jasen, objet avec la propriété message, stock ne suffit pas Enfin, nous avons terminé
notre API Head to Cart. Récapitulons donc rapidement cette API. Tout d'abord, nous
vérifions si l'identifiant du produit correspond à la quantité transmise
par le front-end ou non, ce que nous pouvons dire
comme valider les entrées. Ensuite, vérifiez que le produit est disponible dans notre
base de données ou non. S'il n'est pas disponible, nous renvoyons une erreur dans la
réponse, produit introuvable. Ensuite, vérifiez que le produit
est en stock ou non. S'il n'y a pas de stock ou moins de
stock que notre quantité, nous
renvoyons
une réponse avec un message, stock n'est pas suffisant. Après cela, vérifiez que
l'utilisateur possède une carte ou non. S'il n'a pas de chariot, alors
seulement nous
créerons un nouveau chariot. Ensuite, nous vérifions si le
produit que nous
voulons ajouter est déjà disponible
dans le panier ou non. S'il est disponible, nous vérifierons à nouveau
le stock final. S'il est également disponible, nous augmentons simplement
la quantité. De plus, si le produit n'
est pas disponible, ce n'est qu'alors que nous mettons l'
objet du produit avec les détails du produit. Enfin, nous comptons
le total des produits et prix
total du panier en utilisant une méthode réduite et nous sauvegardons
le panier aussi simplement que cela. C'est ainsi que nous créons une API
Head to Cart.
143. Obtenir un panier d'utilisateurs: C'est maintenant l'heure de l'exercice. Je souhaite que vous créiez
une nouvelle API pour obtenir les informations de carte actuelles de l'utilisateur connecté. C'
est vraiment simple. Je sais que tu peux le faire. Voyons maintenant la solution. Donc, le routeur point gt et
point sur barre oblique. Ensuite, nous ajoutons une fonction de rappel
asynchrone
avec demande et réponse Maintenant, dans la fonction de rappel, const card est égal à
wait card point find one Ici, nous passons Object with user pour demander l'identifiant
point user point underscore, et à la fin,
répondez simplement point json, cette carte De plus, pour faire participer l'
utilisateur à la réponse, nous devons ajouter le middleware Orth Et c'est tout. Essayons
cette API, ouvrons le postier dans la carte, créons une nouvelle requête intitulée
Getting the user card URL vers le SDP, barre oblique
double de la colonne, hôte
local, barre oblique de l'API de colonne 3 000,
barre oblique CAT Et maintenant, nous
devons transmettre un jeton. Allez donc dans les en-têtes et
nous ajoutons ici l'autorisation. Dans la valeur, nous
passons l'espace porteur. Maintenant, allez dans l'
API de connexion, envoyez la demande, obtenez ici le nouveau jeton, copiez-le et il suffit de coller ce jeton dans notre API . Maintenant, envoyons la demande. Tu vois, ici, nous obtenons les
données des cartes. Ça a l'air simple. De plus, il est possible que
l'utilisateur actuel n'ait pas
la carte parce qu'il n'y a jamais
eu de produit sur la carte. Si tel est le cas, nous devons renvoyer une réponse
différente. Nous écrivons si la carte n'
est pas disponible, puis renvoyons le
point de réponse 404 n'
avons pas trouvé le point
Objet Json avec la propriété du message, carte
utilisateur est vide. À la fin, si nous
trouvons la carte, nous l'
envoyons telle quelle.
144. Augmentez la quantité de produit: Maintenant, comme nous le savons,
sur la page de la carte, nous devrons peut-être augmenter ou diminuer la
quantité de produit d'une unité. Définissons donc l'API
pour cette fonctionnalité. Donc Router point, quelle
méthode nous allons utiliser. Comme nous le savons, dans les données de nos cartes, il suffit de mettre à jour une petite partie des
données, à savoir la quantité, total des produits et le prix
total de la carte. Donc, pour mettre à jour les petites données, quelle méthode nous utiliserons, d'accord, nous utiliserons la
méthode patch 0.2 increase et nous avons ici besoin du produit dont l'utilisateur souhaite augmenter
la quantité dans le panier. Nous ajouterons également ici l'ID du produit en tant que paramètre de
route, comme précédemment. De plus, nous avons besoin d'un logiciel
orthomidal car seul l'utilisateur connecté peut augmenter
la quantité de la carte Ensuite, nous ajoutons la fonction de rappel
ACN
avec la fonction de flèche de demande et de
réponse Tout d'abord, nous obtenons
l'identifiant du produit à partir
du point de demande
PRMs, l'identifiant du produit Passons maintenant à la
partie logique de la requête. De nombreux étudiants me demandent comment puis-je comprendre la logique de la
requête ou d'une fonctionnalité quelconque. Laisse-moi te donner mon truc. Chaque fois que vous
voulez appliquer une logique, décrivez d'abord cette logique dans un langage
humain simple. Par exemple, nous
voulons trouver ici une logique d'
augmentation de la quantité d'une unité
pour cet identifiant de produit donné. Cela signifie simplement que nous
devons d'abord trouver la carte utilisateur actuelle pour la mettre à jour. Ensuite, nous trouverons ce produit dans la gamme des produits
cartonnés. Ensuite, après avoir
trouvé le produit, nous augmentons simplement le champ de
quantité du produit. Nous pouvons également augmenter le nombre
total de produits d'une unité et le
prix total des cartes par prix actuel du produit. Enfin, nous sauvegardons simplement
cette carte mise à jour. Voyez à quel point cela
devient simple après avoir écrit
les étapes logiques. Tout d'abord, nous trouvons la carte utilisateur
actuelle. Const cart est égal à un point de chariot de
poids Fine one. Dans l'objet de comparaison, nous ajoutons user to request dot
user dot underscore ID Maintenant, il est possible que nous
ne trouvions pas la carte, il est
donc préférable de renvoyer
une réponse par erreur. Si le panier n'est pas disponible, nous renvoyons le statut du
point de réponse 404 point JSON, objet avec
carte de message introuvable. Bien.
Passons maintenant à l'étape suivante, qui consiste à trouver le produit
dans la gamme de produits CAT. Nous l'avons déjà fait dans
l'API Head to Cart. N'oubliez pas que oui, nous
utilisons ici la méthode de l'index fin. Nous écrivons les
produits CAT point point point index. Ici, nous obtenons un
objet de produit unique, une fonction flèche, et ici nous renvoyons
l'état, le point
du produit, l'identifiant du produit. Il s'agit d'un identifiant d'objet, nous devons
donc le convertir en une chaîne égale à l'identifiant du produit, que nous obtenons à partir
du paramètre de requête. Cette expression renverra l'index du produit
que nous voulons mettre à jour. Nous le stockons donc dans
une variable appelée index. Maintenant, nous avons l'index. Ensuite, nous devons augmenter la quantité de
ce produit indiciel. Donc, les produits
à points de panier entre crochets, nous indiquons la quantité de points d'index
plus égale à un. Cela signifie en augmenter une
en quantité actuelle. Ensuite, nous
augmenterons également
le nombre total de produits par points du panier, plus est égal à un, et également le prix
total par point de la carte, plus est égal au point du
panier
entre crochets, point d'indice. Et à la fin, nous
attendrons le CV à points cartonnés. Et enfin, le point de réponse Json passe un objet avec la propriété du
message, le produit, la quantité
ont augmenté avec succès. De plus, nous envoyons la carte uniquement
pour les tests, et c'est tout. Découvrez à quel point notre API est simple et
propre. Maintenant, testons cette API, voyons les modifications
et ouvrons Post Van. Ici, nous créons une copie
de cette méthode de carte postale et reformulons son nom pour augmenter la quantité de
produit d'une unité. Nous pouvons maintenant ajouter HecRT, augmenter, identifiant
du produit que
vous souhaitez mettre De plus, nous avons ici l'autorisation des
en-têtes, et nous changeons également
la méthode pour patcher. Il ne reste plus qu'
à envoyer la demande. voyez, ici, je reçois un
jeton non valide parce que mon
jeton a expiré. Accédez donc à l'API de connexion, générez un nouveau jeton. Bien. Copiez ce jeton. Dans l'API d'augmentation, il suffit payer le jeton dans l'en-tête. Maintenant, envoyons cette demande. voyez, nous recevons ici un message de
réussite. Auparavant, nous avions
trois iPhones dans notre carte, et maintenant nous en avons quatre,
donc cela fonctionne De plus, le total des produits et prix
total de la carte
fonctionnent également . Permettez-moi de
vous poser une question. Et si nous transmettions l'identifiant du produit, qui n'est pas disponible dans la gamme de produits ? Nous
n'avons pas géré cela. Ici, après avoir
obtenu l'index,
nous répondons à la condition I : l'indice
est égal à moins un, ce qui signifie que nous ne pouvons pas trouver l'
index dans les produits cartonnés. Ensuite, nous renvoyons le
statut du point de réponse 404 points à l'objet Json avec le message « produit
introuvable dans la carte ». Goûtons ça. Donc, à la
place de cet identifiant de produit, il
nous suffit d'en transmettre un et d'
envoyer la demande. Vous voyez, nous obtenons ici un produit qui
n'a pas été trouvé dans le panier. Génial. Maintenant, quelle chose peut mal tourner dans l'API.
Réfléchissons-y. Lorsque nous augmentons la quantité de
produit, idéalement, ce produit
devrait être en stock. Par exemple, si l'iPhone 14 n'
est que six en stock, nous avons déjà six
iPhones dans le panier et que nous essayons d' augmenter le nombre d'iPhone
14, idéalement, nous pouvons le faire Nous ne pouvons pas augmenter la quantité d'
iPhone à sept car nous n'avons que
six iPhones en stock Nous pouvons également poser
une condition supplémentaire avant de mettre à jour
les détails de la carte. Si les produits cartonnés sont placés
dans un paquet carré, indexez la quantité de points, égale
au produit, point stock. Ensuite, nous renvoyons l'état du point de
réponse, objet JCN à
400 points avec un message, un produit, une rupture de stock et nous
augmentons le produit par un La question qui se pose maintenant est la suivante : comment pouvons-nous obtenir ce produit en stock ? Bien, nous devons trouver un produit dans la collection de
produits. En haut, après
cet identifiant de produit, nous pouvons confirmer que le produit est égal au point de produit Fine By ID, et ici nous passons l'identifiant du produit Maintenant, cela peut arriver, cet identifiant de
produit n'est pas valide, nous pouvons
donc
également mettre ici une condition. Nous l'avons déjà fait
dans l'API de publication. Voyez ici. Copions donc cette condition et
collons-la dans notre API d'augmentation. A à la commande précédant
la méthode de recherche, vérifiez si le produit existe. Maintenant, goûtons à
cette implémentation. Alors allez chez Postman,
envoyez la demande. Vous voyez, nous avons maintenant une erreur
interne du serveur. Sélectionnez maintenant le point de terminaison
et appuyez sur
Ctrl plus D ou Commande plus D. Pour obtenir
l'identifiant du produit d'origine. Envoyez la demande, C, augmentation de
la quantité d'une unité. Encore une fois, envoyez la demande. C, nous avons six iPhone, notre stock est de huit, nous envoyons
donc la demande
deux fois de plus. voyez, nous avons maintenant huit iPhones et envoyons
la demande une fois de plus. voyez, ici, nous obtenons une erreur, produit est en rupture de stock, impossible d'augmenter le produit d'un. Maintenant, notre API fonctionne bien.
145. Diminuez la quantité de produits ty: Définissons maintenant rapidement une API ou diminuons
la quantité de produits. Il en sera de même. Copions cette API améliorée
et collons-la en bas. Maintenant, tout d'abord, nous
ajoutons ici le meilleur commentaire, diminuons la quantité du produit. De plus, ici, nous modifions le
point de terminaison pour diminuer l'identifiant du produit. Nous allons maintenant vérifier cette
API étape par étape, afin de nous assurer de
ne rien oublier. Tout d'abord, nous obtenons le produit
dont nous avons également besoin. Après cela, nous trouvons
le chariot en bon état. Ensuite, nous trouvons l'indice.
Bon, maintenant, il y une chose à faire pour réduire la quantité
du produit à un, nous n'avons pas besoin de
vérifier le stock. Mais nous devons également
vérifier une dernière chose. S'il se trouve actuellement sur notre carte, nous n'avons qu'une seule quantité de
produit et nous essayons de réduire cette
quantité à une seule. Dans ce cas, nous devons supprimer l' objet produit
complet de la gamme
de produits. Ne vous inquiétez pas, nous écrirons la logique pour cela une fois la mise à jour
terminée. N'oubliez pas que j'
ajoute ici un commentaire, vérifiez l'état
de la quantité 1. Après cela, nous devons diminuer la quantité de produit à
moins égal à un. De plus, pour le total des produits, moins est égal à un,
et ici aussi, prix total du panier
moins est égal à, ici nous avons diminué le
prix par rapport au total. Ensuite, nous enregistrons une
carte et nous changeons ce message pour que la
quantité de produits diminue avec succès. Nous devons maintenant apporter peu de
changements à cette API. Passons à notre commentaire. Ici, nous ajoutons la condition I, produits à points du
panier, le
crochet, la quantité d'
indice est
supérieure au chignon, puis nous diminuons
la quantité d'un Nous déplaçons cette ligne dans le bloc
I
, puis nous devons supprimer l'objet produit
complet
disponible sur cet index. Pour supprimer l'élément
du tableau en JavaScript, nous utilisons la méthode Plis. Donc, les produits à points cartonnés l'index
Slic, qui est
l'index que nous voulons supprimer Ensuite, au deuxième argument, nous en passons un, ce qui signifie que nous ne
voulons supprimer qu'un seul élément. Par cette expression, l'
ensemble de cet objet de produit sera supprimé
du tableau de produits. Maintenant, voici une chose. Après avoir retiré l'ensemble de
l'objet du produit de la gamme de produits, nous ne pouvons pas déduire prix total de la carte car nous avons ici besoin
du prix du produit. Nous devons donc faire
quelque chose comme ça. prix total de la carte diminué est égal au prix par point
du produit. Ce prix de produit sera obtenu à partir de la collection
des produits. Ainsi, dans l'API augmentée, nous modifions le prix total par
points de la carte plus le prix par point
du produit. Le prix original du produit
sera donc ajouté au total. Enregistrez les modifications,
voyons cette API. Dupliquez cette API de produit
augmentée et changez son nom pour diminuer A Changez le point de terminaison de l' API en réduction de la carte
et envoyez la demande. Tu vois, maintenant nous
n'avons que sept iPhones. Diminons-le encore
deux fois. voyez, maintenant nous avons
cinq iPhones et total des produits et
le prix fonctionnent également C'est ainsi que nous diminuons la
quantité du produit.
146. Supprimer un produit unique du panier: Maintenant, sur la page de notre carte, nous avons peut-être la possibilité retirer le
produit complet de la carte. Nous ne voulons pas diminuer la quantité de produits une par une. Définissons donc l'API pour retirer le
produit de la carte. Nous commençons donc par le
routeur, la page à points, le point de
terminaison, la barre oblique, la suppression de la colonne
oblique, l'identifiant du produit De plus, nous avons besoin des informations actuelles sur
l'utilisateur, nous ajoutons
donc le middleware Orth
, puis une fonction de rappel
avec Il existe maintenant des
étapes très similaires à celles de notre API de réduction. Voyons l'API, ce dont nous avons besoin pour
supprimer le produit. Vous voyez d'abord, nous devons obtenir
un produit, puis un panier. Ensuite, nous devons également trouver
l'indice du produit, et nous avons également besoin de cette condition. Copiez ce code jusqu'ici et
collez-le dans l'API de suppression. Revenez maintenant à la réduction de l'API, et comme nous pouvons le voir pour
supprimer l'ensemble du produit, nous avons juste besoin de cette ligne. Nous le copions et le
collons dans notre API. Bien. Ensuite, nous devons mettre à jour le total des produits par
point panier
et le prix total du panier par point. Allons-y un par un. Le total des produits
moins le point du panier est égal à.
Ici, nous avons besoin de la quantité de ce produit
que nous avons
dans l'objet du produit. Supposons que nous ayons
sept produits au total et que nous ayons quatre iPhones
dans la gamme de produits Maintenant, si nous essayons de supprimer toutes les données
téléphoniques du panier, alors pour le total des produits, nous devons moins sept moins
quatre égale trois. Nous devons donc trouver
la quantité disponible dans la gamme de
produits. Donc, avant cette méthode d'épissage, nous pouvons faire quelque chose comme ça Le nombre total de produits dans le panier, moins est
égal au nombre de produits point dans le panier. Ici, nous
accédons à l'
objet du produit que nous voulons supprimer, entre
crochets, index,
puis nous saisissons la quantité
de ce produit. Vous l'avez bien deviné. Nous pouvons faire de même pour le prix total
du CAT point moins égal aux produits à points cartonnés, crochet, quantité de
points d'index dans produits à points du
panier
entre crochets, point d'index PCE La raison pour laquelle nous supprimons l'
ensemble de l'objet
du produit à la fin est que si nous
supprimons cet objet avant, comment pouvons-nous accéder à la quantité
et au prix du produit ? Enfin, nous attendons simplement le point C de la
carte, puis le point réponse à l'objet Json avec propriété du
message au produit
supprimé avec succès, et nous envoyons également la carte avec celui-ci. Maintenant, avant de goûter à cette API, nous pouvons ajouter une
condition supplémentaire dans cette API. Imaginons donc que nous
n'ayons qu'un seul produit dans le panier et
que nous le retirions également. Désormais, au lieu de stocker la carte
vierge dans la base de données, il est préférable de la retirer
pour cet utilisateur. L'utilisateur souhaite ajouter un nouvel
article dans le panier, puis dans l'API Head to Cart, nous avons déjà mis le code pour
créer le nouveau panier. Nous pouvons vérifier si
ce produit est le seul produit dans le panier ou
non. Ici, après cette condition d'
index, nous pouvons ajouter une
autre condition if. Ici, nous vérifions si longueur du point des produits à points du
panier est égale à un, et si les produits
à points CAT entre crochets, index, identifiant du produit sont
égaux à l'identifiant du produit, que nous obtenons à partir des permanentes Si cette condition est vraie, nous pouvons supprimer le CAT complet. Attendez donc le point CAT Fine By ID et DLT et passez le
point GAT underscore Ensuite, nous revenons,
répondons, assurez-vous d'ajouter ici retour. Sinon, le
code inférieur sera également exécuté. Assurez-vous donc d'
ajouter ici return. réponse Objet Json avec propriété de
message, panier
supprimé avec succès. Vous devez également convertir l' identifiant du produit de
cette carte, point en chaîne Sinon, notre condition
ne fonctionnera pas, et c'est tout. Dégustons notre implémentation, voyons les modifications
et ouvrons Postman Dupliquez cette API de réduction, changez son nom pour supprimer le
produit du panier. Bien. Envoyons maintenant
le point de terminaison de l'API pour supprimer le panier, supprimer l'identifiant du produit et envoyer la demande Et comme nous n'avons qu'
un seul produit dans notre panier, le panier a été retiré
avec succès. Comme vous pouvez le constater,
la définition de l'API n'est pas si difficile. Il suffit de suivre les étapes une par une, et si vous êtes confus, rédigez des commentaires pour chaque étape afin de dissiper
bon nombre de vos doutes.
147. Créer un modèle de commandes: Avant d'ajouter
la passerelle de paiement, créons une nouvelle
collection de commandes pour stocker les informations relatives à toutes les
commandes et à leur statut. Ainsi, dans le dossier des modèles, nous créons un nouveau fichier
appelé orders point js. Bien. Maintenant, tout d'abord, nous importons des mangues constantes, ce qui
équivaut à exiger des Après cela, le schéma d'ordre des coûts est égal au schéma de points Nu
Mongoose Nous définissons ici notre schéma
de collecte. Nous le savons déjà, non ? Nous avons créé un schéma à plusieurs reprises. Maintenant, dans la collecte des commandes, nous avons besoin de tout ce que nous avons
ajouté à la collection des cartes. Nous copions donc
le schéma complet du panier. Dans le schéma de commande, nous collons notre schéma. Nous avons un utilisateur qui commande des produits, le total des produits et
également le prix total de la carte. Vous vous demandez peut-être pourquoi nous avons
besoin de toutes ces données sur les produits ? Nous avons besoin des données de ces produits pour enregistrer l'historique
de la commande de l'utilisateur. Si l'utilisateur veut voir quels produits il
a commandés précédemment, nous devons lui montrer la liste de
ces produits. La carte et la commande sont donc
deux choses distinctes. Lors de la collecte des cartes, nous stockons tous les produits
que l'utilisateur souhaite acheter. Les produits de la carte peuvent être
ajoutés, mis à jour ou supprimés. Mais une fois que l'utilisateur
passe commande et effectue
le paiement, les données de la carte sont
converties en commande, et nous les supprimons
de la collecte des cartes. Lors de la collecte des commandes, nous stockons les données de manière permanente pour les transactions
effectuées. Ainsi, les utilisateurs peuvent voir
leurs commandes précédentes. Maintenant, dans cette collection, nous devons ajouter quelques remplissages supplémentaires. Tout d'abord, nous réduisons le prix total
de la carte au prix total. Ensuite, nous avons besoin de l'identifiant de paiement, de la chaîne de caractères et
de la valeur true. Il s'agit de l'identifiant du paiement. Nous obtiendrons cet identifiant auprès de
la passerelle de paiement. Et grâce à cet identifiant, nous pouvons voir quel mode de paiement
l'utilisateur utilise pour le paiement,
UPI, carte ou réseau bancaire
ou autre. Ensuite, le statut du paiement à l'objet, type à la chaîne doit être vrai. Et dans ce statut, on peut mentionner le paiement payé ou effectué. Ensuite, ce que nous voulons,
c'est l'adresse de livraison, type dans la chaîne et la valeur
obligatoire sur true. Au fur et à mesure que nous le déplaçons
en dessous du prix total pour des
raisons de commodité. Peu importe. Maintenant, après cela, nous voulons le statut de la
commande, le type vers la chaîne, et ici nous pouvons ajouter
des valeurs possibles pour ce champ, qui est enum to array La première valeur peut être en attente. Ensuite, nous pouvons procéder au traitement suivant, CB. Il peut également être livré ou
annulé par défaut, nous ferons en sorte que le
statut de notre commande soit en attente. Ici, il ne s'agit pas du statut du paiement, mais du statut de la commande. Ensuite, nous pouvons enregistrer la date à laquelle l'utilisateur passe cette
commande, créée dans le type d'objet à ce jour et
la valeur par défaut à date point now. Comme nous voulons la date à laquelle
cette commande est livrée, livrée dans le type
d'objet à ce jour. Pour l'instant, ces
champs sont suffisants. Si à l'avenir nous avons
besoin de plus de champs, alors comme nous le savons, nous pouvons facilement ajouter des remplissages dans
cette collection. Créons maintenant une collection. L'ordre des coûts est donc égal
au modèle à points Mongoose. Ici, nous passons un nom singulier, qui est ordre, et ici
nous passons un schéma de commande. Ensuite,
nous allons enfin moduler les exportations de points
équivalant à la collecte des commandes,
et c'est tout.
148. Flux des paiements: Nous avons déjà ajouté et mis à jour
les fonctionnalités de la carte. Désormais, lorsque notre utilisateur souhaite acheter les éléments
disponibles sur la carte, nous devons intégrer le
paiement dans notre application. Donc, avant de
passer directement au code, comprenons d'abord le flux de travail
complet du paiement. Imaginez donc qu'il s'agit de notre utilisateur, voyez les produits ajoutés à la carte
et, sur la page de la carte, cliquez sur le bouton de paiement
ou de paiement. La première étape est que nous appellerons notre API de paiement en appuyant sur
ce bouton Comme nous le savons, nous avons les
détails de notre carte dans notre base de données, nous obtenons
donc le montant total
du prix de sa carte. Nous pouvons également indiquer dans quelle
devise elle souhaite payer. Maintenant, à la
deuxième étape, les détails, prix et la devise, nous les
enverrons à Payment Gateway. Maintenant, étape numéro trois,
Payment Gateway créera un formulaire de paiement et l'
affichera sur son navigateur ou son téléphone. Étape numéro quatre, voir
saisir ses informations de paiement comme la carte, l'UPI ou le
portefeuille que vous souhaitez utiliser, voir saisir ces informations dans le formulaire de paiement
et cliquer sur payer N'oubliez pas que les informations
de paiement des utilisateurs sont transmises à la passerelle de paiement, et
non au back-end, et
c'est pourquoi elles sont sécurisées. Maintenant, étape de passerelle de paiement, envoyez les
informations de paiement à la banque, banque valide les données de paiement. Si c'est vrai, la banque
renverra le résultat, et si c'est faux
, si notre utilisateur
n'a pas un solde suffisant
ou si quelque chose ne va pas, la banque annulera le retour. La banque enverra donc ce statut de réussite ou d'échec à
Payment Gateway. Maintenant, étape numéro six, passerelle
de paiement, envoyez le
statut de réussite ou d'échec à notre backend. cas de succès, nous
effectuerons une tâche
dans le back-end que nous souhaitons
effectuer, comme ajouter données de
la carte à la collecte des
commandes, définir le statut du paiement sur payé
ou faire ce que nous voulons faire. Maintenant, après avoir terminé tout
le processus à l'étape 7,
depuis le backend,
nous indiquons que le paiement de l'utilisateur est réussi ou que le paiement
échoue, c'est aussi simple que cela. La passerelle de paiement est donc comme un intermédiaire qui s'
occupe des paiements sécurisés, du mode de paiement et du transfert
direct de
l'argent sur notre compte Il existe désormais de nombreuses passerelles de
paiement disponibles, telles que Stripe, Paper, Razor Pay
et bien Mais ces trois-là sont les meilleurs. Maintenant, comment pouvons-nous décider passerelle de paiement que
nous voulons utiliser ? Donc, si nous
ciblons un public mondial, Stripe est une bonne option car il permet les paiements
internationaux, et il autorise également l'UPI Maintenant, les gens autorisent également les paiements
internationaux, et les gens sont également une bonne option. Maintenant, si notre entreprise est
basée en Inde, alors sorpay est ce qu'il y a de mieux pour nous Resorpay peut également gérer les paiements
internationaux, mais il ne convient qu'aux
entreprises basées en Inde pour les transactions
étrangères En termes simples,
en termes simples, entreprises sont enregistrées en Inde et souhaitent également
obtenir des transactions étrangères. Pour les entreprises
internationales du monde entier, les passerelles telles que Stripe ou Paper peuvent être un
meilleur choix Donc, dans ce cours,
je vais vous montrer fois comment réserver pour les entreprises
indiennes, et si votre entreprise se
trouve en dehors de l'Inde, je
vous montrerai également l'intégration papier La raison pour laquelle je ne peux pas vous montrer le Stripe, c'est que pour les démos, Stripe n'autorise pas
les comptes dans certains pays, mais peu importe la passerelle de
paiement que je vous montre Si vous comprenez la
logique de la passerelle de paiement, vous pouvez appliquer vous-même n'importe quelle passerelle de
paiement. Et c'est là mon objectif principal. Il suffit donc de voir ces leçons. Je vais clarifier la logique
qui sous-tend la passerelle de paiement.
149. Mettre en œuvre la passerelle de paiement Razorpay: Configurons un CV pour notre application de nœud
Cardwig. Nous allons créer et déguster des paiements comme celui-ci.
Ce sera amusant. De plus, si vous êtes
en dehors de l'Inde, vous pouvez sauter cette leçon car vous ne pouvez vous inscrire au CV que si vous êtes en Inde ou si votre entreprise est
enregistrée en Inde Après cette leçon, nous
appliquerons
le paiement papier sur lequel tout
utilisateur du pays pourra créer un compte. Voyons maintenant en gros comment
ce paiement fonctionnera. Ainsi, lorsque l'utilisateur clique
sur le bouton PayNW, le front end appelle une
API. Allons vérifier. Dans cette API, nous
créerons une commande pour AserPay en fournissant des
informations sur notre montant
que nous voulons collecter auprès de l'utilisateur et la devise dans laquelle
nous voulons effectuer le paiement. Désormais, lorsque RSR PE obtient
ces informations, il génère de l'ordre, qui est l'objet d'informations
avec un identifiant d'objet unique Ensuite, nous devons transmettre cet identifiant d'
objet au front-end. C'est le travail de la première API. Désormais, lorsque le front end
obtient l'ID de l'objet, front end ouvre la
fenêtre de paiement sorp. Transmettez l'identifiant de l'objet
et quelques informations. Vous pouvez maintenant vous demander pourquoi nous
devons transmettre l'ID de l'objet. Par cet identifiant d'objet, seul le reser PA obtient les
informations relatives au paiement Cela nous aidera également dans la vérification des paiements
et dans de nombreux autres avantages. Maintenant, l'utilisateur saisira les détails du paiement
et cliquera sur payer maintenant. Si le paiement est réussi, reser Pay génère un identifiant de paiement avec signature
unique, puis nous
appellerons notre deuxième API, qui vérifiera notre paiement Dans la deuxième API, nous
vérifierons le paiement. La raison pour laquelle nous devons le
vérifier est que cette API appelle
depuis le front end. N'importe
qui peut facilement manipuler ces informations et réussir
le paiement. Nous allons donc vérifier le paiement de
manière très sécurisée, ce que nous allons également
implémenter dans cette leçon. Ce n'est qu'après le
processus de vérification, en cas de succès, que nous créerons une nouvelle commande
dans notre collection de commandes, puis supprimerons cette carte utilisateur. Pensez à Sor Pay, c'est comme
une billetterie de cinéma. Pour l'API 1, vous vous rendez au
comptoir, qui est Razor Pay, leur
dites quel
film vous souhaitez regarder en leur indiquant le
montant et la devise, puis ils vous donnent un ticket, qui est un numéro de commande unique Maintenant, pour l'API 2, après avoir
présenté le ticket à la sécurité, vous regardez le film. Le
compteur vérifie que le ticket a été utilisé correctement
et met à jour les enregistrements Donc, pour Razor Pay dans le backend, nous devons créer deux API Tout d'abord, pour créer un ordre de paiement
Razor, et la deuxième API sert à vérifier
le paiement de Razor Si nous avons
vérifié le paiement avec succès
, à la dernière étape, nous créerons une nouvelle commande dans le cadre de la collecte des commandes
et retirerons notre carte. Commençons maintenant par
créer la première API, qui sert à créer un ordre de paiement
ser. Dans le dossier route,
vous allez créer un nouveau fichier appelé orders point gs. Maintenant, pour
ajouter rapidement le routeur, nous ouvrons le fichier de route de la carte, déplaçons cette
ligne du routeur en haut et copions ces deux premières lignes. Dans notre
fichier orders point JS, nous le collons ici. Maintenant, en bas, nous devons faire en sorte que le module point ports soit
égal au routeur. Passons maintenant à ce routeur
dans le fichier JS du point d'index. Donc, en haut, const,
order, Rowe est égal à require Nous passons ici au
dossier des itinéraires et aux commandes. Et en bas,
après les itinéraires par carte, nous ajoutons app.us slash
API slash Order
et passons ici Order et passons ici Bien. Nous pouvons désormais nous concentrer
sur la création d'API. Donc, routeur point post, pointez sur barre oblique lors du paiement. De plus, nous avons besoin d'un intergiciel Moth car nous voulons que seuls
les utilisateurs connectés puissent payer, et au moins une fonction
de
rappel avec demande ,
car nous voulons que seuls
les utilisateurs connectés puissent payer,
et au moins une fonction
de
rappel avec demande et réponse. Ici, dans cette API, nous voulons créer un ordre de paiement ser. Et pour cela, nous avons besoin d'une instance de paiement par
utilisateur. Donc, dans le terminal, nous
installons le package reser pay, NPM installe ser pay at the rate, 2.9 0.5, qui est la dernière version moment où j'enregistre ces scores Bien. Maintenant, en haut, nous saisissons le coût du ser P égal à require ser P.
Pouvez-vous me dire pourquoi je donne
cette majuscule ? C'est vrai parce que c'est une question de classe. Maintenant, dans notre API, nous créons Cast
reserp Instance is
equal to New reserp à l'intérieur de celle-ci, nous devons transmettre un objet
avec deux propriétés ID de soulignement clé. Il s'agit de l'identifiant clé de
notre application Reser Pay. Dans notre application, nous
stockerons cette clé dans le fichier point ENV car nous
devons la garder privée Donc, traitez point nv point reser py underscore key underscore ID Ne vous inquiétez pas, nous les
définirons dans un moment. Après l'identifiant de la clé, nous avons besoin du secret de soulignement de la
clé pour traiter point nv point ser pay, underscore, key, Maintenant, définissons ces deux
variables dans le fichier ENV à points. Sor pay, underscore, key, underscore ID équivaut
à le laisser vide Et ensuite ReserpUnerScore,
key, underscore secret. Nous les ajouterons lors de la
création du compte Resorpay. Pour l'instant, complétons notre API de
paiement, puis nous créerons un compte
Reser Pay Après avoir créé l'instance, nous pouvons créer un ordre. Le coût de l'ordre est égal à wait reserpy instance point
orders point Créez ici, nous devons transmettre
l'objet d'options pour cette commande Le premier est le montant. Disons que nous allons passer ici les 500. Après cela, nous devons
transmettre la propriété de la devise. Cela indiquera dans quelle devise nous voulons
effectuer le paiement. Supposons que nous voulions effectuer le
paiement en roupie indienne, puis que nous transmettions ici l'INR, et si nous voulons effectuer le
paiement en dollar américain,
nous indiquons ici Mais assurez-vous que si vous utilisez la devise d'un
autre pays, votre compte de réserve paiement
interne de votre compte de réserve
doit être actif. Pour l'instant, nous passons simplement l'INR. Et enfin, nous devons
transmettre un reçu unique. Il s'agit d'une
étiquette nominative pour la commande. Cela n'affecte pas le paiement, mais aide les développeurs ou les entreprises à reconnaître
quelle commande est laquelle. Par exemple, si nous
avons plusieurs commandes, nous pouvons utiliser ce numéro de
reçu pour trouver une commande spécifique dans le tableau de
bord RSR Pi ou dans notre base de données Nous passons donc ici les backticks reçus, soulignent le
dollar Calibackets, point de
date maintenant pour générer des reçus
uniques Cela générera de la commande pour nous. Ici, nous renvoyons simplement point de
réponse Json, ici nous passons un objet avec
peu de propriétés. Tout d'abord, le succès devient vrai, ce qui signifie que nous
réussissons à créer de l'ordre. Ensuite, du numéro de commande
au numéro de point de commande. Montant suivant pour commander le nombre de
points et devise
pour commander la devise par points. C'est tout pour la première API. ne s'agit pas de l'API finale, nous l'améliorerons ultérieurement. Maintenant, avant
de tester cette API, créons également une deuxième API afin que vous ne soyez pas confus
lors des tests. Je sais que vous avez de nombreuses questions, mais ne vous inquiétez pas à la
fin de cette leçon, tout sera clair. Après cette API, nous créons une nouvelle API de publication et vérifions que nous avons également besoin d'un middleware Os pour
cette API et enfin fonction
ASN avec Maintenant, dans cette API, nous avons besoin de trois éléments
provenant du corps de la requête. Le second objet est égal
au corps du point demandé. Le premier est set pay, underscore order, underscore ID Ensuite, utilisez le paiement, le paiement
souligné, ID de
soulignement et la signature du dernier
paiement À l'aide de ce numéro de
commande et de ce numéro de paiement, nous devons créer un
type de signature. Si cette signature et le trait de
soulignement de l'utilisateur identiques lorsque nous considérons que notre paiement est vérifié.
Ne vous y trompez pas. C'est vraiment simple. signature générée par Secst
est égale à ici, nous devons utiliser un module
nodejs intégré qui En haut, nous importons que la
cryptographie constante soit égale à la cryptographie
requise Au bas de notre deuxième point cryptographique
API, créez HMAC. Il s'agit de la
méthode Nojs pour créer un code
d'authentification
de message de base, HMAC Maintenant, au premier paramètre, nous devons écrire l'algorithme
de création du HMAC, qui est un tel 256 Au deuxième paramètre, nous devons transmettre le secret resorp Traitez donc point Env point ResorPunderscore, K, underscore secret. Maintenant, après cette méthode de
création HMAC, nous ajoutons une autre méthode
appelée update Cela prend les
données que nous voulons avoir. Ici, nous renvoyons les ticks, les dollars en paquets Cali, nous réinitialisons le trait de
soulignement, la
commande, l'identifiant de soulignement Ici, nous ajoutons le symbole Bar, le dollar, paquets
Cully, le sor pe, le trait de
soulignement, le paiement, l'identifiant de
soulignement Ensuite, nous ajoutons une autre
méthode point digest et nous passons
ici X. Je trouve ce code dans la documentation de
Reser P. Vous pouvez consulter la documentation
pour plus de détails. Ce code
générera une signature. Nous pouvons maintenant le comparer à
cette signature de soulignement réinitialisée Si la signature générée
n'est pas égale à ser pay
underscore signature S'ils ne sont pas
égaux,
nous renvoyons ici le statut du point de réponse, GSN à
400 points avec Object, succès à faux et message à la signature de
paiement non valide Ensuite,
nous répondons simplement point Json success à true et du message au paiement
vérifié avec succès Donc, si, depuis le front-end, quelqu'un transmet un faux
numéro de commande ou de paiement ,
nous pouvons le vérifier par ce processus. Si le paiement n'est pas vérifié, nous renvoyons une réponse
avec un message rempli. Et s'il est vérifié, nous
renvoyons une réponse
avec un message de réussite. Ce n'est donc pas un code complet. Nous le mettrons à jour
après la dégustation. Maintenant, avant de tester cette API, nous avons besoin de l'identifiant clé et du
secret de Reser Pay. N'oubliez pas que nous laissons
des variables vides dans le fichier Dart NV. Créons un compte sur ser pay et générons cet identifiant de
clé et cette clé secrète. Ils sont très similaires à l'
identifiant et à la clé secrète que nous avons générés lors de
la mise en œuvre de l'
authentification Google et Facebook. Accédez au site web reserp.com. Et comme vous pouvez le voir ici, nous n'avons que l'option Inde, Malaisie et Singapour, ce qui signifie que seules les entreprises basées
dans ces pays peuvent configurer le paiement par réinitialisation Mais nous pouvons également accepter les
paiements de n'importe quel pays. Alors inscrivez-vous sur glicon, entrez votre adresse e-mail Créez ensuite un mot de passe. Assurez-vous de suivre
ces modèles de mot de passe, puis cliquez sur Continuer. Cela enverra l'OTP par e-mail J'ajoute
donc rapidement l'OTP
ici et je clique sur Vérifier Maintenant, voici le truc.
Sélectionnez le pays dans lequel
votre entreprise est
constituée, à savoir l'Inde. Nous pouvons continuer, et maintenant nous
devons suivre quelques étapes supplémentaires. Évidemment, nous
acceptons le paiement. configuration n'est pas simple car
nous appelons une autre API de site Web. Nous devons fournir nos coordonnées. De plus, ces plateformes de paiement peuvent changer
d'interface très souvent. Donc, si à l'avenir, vous n'obtenez pas la même
interface que moi, ne
vous y trompez pas. Fournissez simplement les
informations
demandées et créez un
compte sur Reser Pay. Après avoir créé un compte, nous pouvons créer un
identifiant clé et un secret clé. Ici, il vous demande où souhaitez-vous
accepter le paiement ? Pour l'instant, sélectionnez en ligne
et commencez à embarquer. Maintenant, d'où viennent vos
clients pour payer ? Si vos clients viennent d'
Inde, sélectionnez Inde. Mais ici, je choisis en dehors de l'
Inde et je commence à embarquer. Cela va prendre un certain temps.
Maintenant, nous écrivons notre nom. Assurez-vous d'écrire
votre nom légal. Continuez. Ensuite, vérifiez
vos coordonnées, écrivez votre numéro de téléphone portable, et il enverra l'ODP, écrivez cet ODP et
cliquez sur Continuer Acceptez maintenant le paiement ici
que je sélectionne sur mon site Web. Si vous voulez une application ou quoi que ce soit d'autre, vous pouvez également
les sélectionner et continuer. Ici, nous devons ajouter le lien de
notre site Web. Également, voir payer vérifier
ce site Web. Est-ce légal ou non ? Donc, si vous avez votre site Web, ajoutez-le ici. Pour l'instant, je n'en ai pas, alors cliquez sur Ajouter une lettre
et ajouter une lettre. Sélectionnez maintenant votre type d'entreprise. Je sélectionne Non enregistré. De plus, si vous sélectionnez un type d'entreprise
non enregistré, vous ne pouvez pas accepter les paiements
internationaux
en mode direct Pour cela, vous avez besoin d'une entreprise
enregistrée. Nous n'avons actuellement
aucune entreprise enregistrée,
mais si vous l'avez déjà fait, sélectionnez « Enregistré ». De plus, ne vous inquiétez pas si vous acceptez les paiements
internationaux. Nous n'avons pas besoin de faire
de travail supplémentaire. Nous avons juste besoin d'une entreprise
enregistrée, et Reserpy
vous permettra d'accepter les paiements
internationaux Ajoutez maintenant votre numéro Pan
personnel, que nous avons tous modifié
ici, puis cliquez sur Continuer. Ici, je reçois une erreur dans mon nom, alors j'écris mon nom légal, que j'ai sur la carte
Pun, et je continue Téléchargez maintenant votre carte
PN personnelle, sélectionnez, téléchargez, sélectionnez votre
document et ouvrez-le. Cela prendra
du temps. Et continuez. Maintenant, ils
nous suggèrent de terminer le QIC. Sélectionnez votre catégorie d'entreprise, je sélectionne votre formation. Si vous avez une autre catégorie, sélectionnez-la en fonction de celle-ci. Ensuite, sélectionnez votre sous-catégorie,
sélectionnez ce que vous voulez. Ensuite, quel est votre modèle
commercial ? Sélectionnez également cette option en fonction
de vos besoins et continuez. Ensuite, nous devons
ajouter les coordonnées bancaires. Ici, nous avons besoin du
numéro de compte et
du code IFSE de la succursale de votre compte Vous les inscrivez tous les deux sur votre livret. Assurez-vous d'inscrire le numéro de compte dans lequel
vous souhaitez accepter le paiement. Je remplis ces informations
et je clique sur Continuer. Il vérifiera ces
informations. Et c'est fait. Ensuite, nous devons
sélectionner le code d'objectif. Permettez-moi d'essayer de continuer directement. Cela donne une erreur. Nous devons sélectionner le code d'objectif. Nous pouvons le rechercher par groupe. Mais pour tester, je sélectionne
simplement ce p00 14 et je continue Ensuite, avez-vous un code
importateur-exportateur ? Non, je n'ai pas accepté les
conditions et je clique sur Continuer. L'heure est maintenant à la politique
commerciale. Ici, ils posent de nombreuses questions importantes telles que annulation et le délai de remboursement. Je les sélectionne entre sept et sept jours, vous pouvez sélectionner en fonction
de vos besoins, délai de traitement des
remboursements est de trois
à cinq jours, ce qui est bien, mais de
neuf à 15 jours pour des raisons de sécurité. De plus, le temps de saut est de
8 à 14 jours. Maintenant, nous devons également fournir le numéro de contact de l'
assistance. J'essaie également de l'ignorer, mais cela donne une erreur. J'écris donc mon numéro mon adresse e-mail et je clique
sur Créer des pages de politique. Ici, vous pouvez voir les pages,
cliquez sur Continuer. Vous trouverez ici des
liens vers les politiques. Continuez. Soumettez votre candidature. Ici, j'essaie de terminer
le processus vidéo KYC, mais ici j'ai une erreur, alors j'essaie plusieurs fois,
mais rien ne se passe Je décide de ne pas le faire. Je ferme toutes les pages et j'
essaie d'ouvrir serpy.com. Et essayez de vous connecter avec le
compte que je viens de créer, mais il se charge et se charge. Ouvrez donc la
fenêtre de navigation privée et openerp.com. Si vous aimez l'identifiant,
entrez l'e-mail, continuez et entrez
votre mot de passe. Bien. Ici, nous obtenons le tableau de bord SRP Pour l'instant, nous sommes
en mode dégustation. Nous pouvons le modifier d'ici, mais ne le changez pas pour le moment. Maintenant, pour obtenir l'APIKey, nous allons à l'option de compte
et de configuration Et ici, dans les paramètres du site Web
et de l'application, nous optons pour les clés API et
générons la clé Taste, elle nous enverra un OTP, écrira l'OTP et cliquera
simplement sur Soumettre Vous voyez, ici, nous obtenons l'
identifiant et le secret de la clé. Maintenant, nous copions d'abord l'
ID de clé dans le code VS, et dans le fichier ENV, nous collons l'ID de clé
pour cette variable Copiez à nouveau le secret clé et collez-le dans la variable secrète du
fichier ANV Enregistrez ce fichier, et
depuis le site Web, vous pouvez simplement cliquer sur
Télécharger pour une sauvegarde. Maintenant, testons nos deux API. Cela fonctionne ou non. Comme nous le savons, nous avons besoin d'un
front-end pour tester ces API, car sur le front-end, nous ouvrirons la page RSRPEpayment J'ai donc créé ici une simple page SDML appelée RSRPFront end Vous trouverez cette page en
dessous de cette leçon Elle est également disponible dans le dossier Resources project to. Téléchargez-le et faites-le simplement
dans votre projet actuel. Maintenant, exécutons ce fichier STML. Cliquez donc avec le bouton droit de la souris dessus
et cliquez sur Copier le chemin. Dans notre navigateur, suivez ce chemin. Vous voyez, nous avons ici le titre
et un simple bouton. Si vous voulez voir ce qui s'est passé lorsque nous
cliquons sur ce bouton, alors vous pouvez regarder le
fichier STML, c'est vraiment simple Permettez-moi de vous montrer également que nous devons modifier certaines valeurs. Donc, ici en bas,
dans la balise script, j'ai ajouté une variable que
vous pouvez transmettre pour vos données. Tout d'abord, nous avons le point de terminaison de commande, qui est le point
de terminaison de notre première API. Et deuxièmement, nous avons un point
de terminaison de vérification. Vous avez différents points de terminaison, vous pouvez
alors les remplacer en
fonction de votre point de terminaison Ensuite, nous avons l'adresse de livraison. Ici, tu peux écrire ton adresse. Ensuite, la devise de l'utilisateur, qui est définie sur INR, mais vous pouvez également
transmettre l'USD ou l'euro
, etc., si votre paiement
est activé pour le paiement international Ensuite, nous avons l'identifiant de la clé SRP. Ici, vous devez
inscrire votre identifiant de clé. Je copie mon identifiant de clé depuis le fichier
ENV et je le colle ici. Assurez-vous d'écrire
votre propre identifiant de clé. Dans le cas contraire, cela ne fonctionnera pas. Ensuite, nous avons togon. Ici, vous devez
transmettre votre jeton JWT. Maintenant, actuellement, dans
notre application, nous ne fixons que 2 heures de péremption, ce qui est un peu
gênant pour la dégustation. Parce que nous devons créer un jeton
JWT encore et encore. Nous pouvons donc supprimer l'
expiration de la connexion et simplement ajouter l'expiration à l'étape
finale du projet. Ouvrez les itinéraires utilisateur,
et en bas, nous supprimons cet objet dont la propriété a
expiré. Nous allons maintenant générer un jeton
qui n'a jamais expiré. Ouvrez Postman et ouvrez l'API de connexion et envoyez simplement la demande Ici, nous copions ce jeton
et dans le fichier SDML, nous le collons simplement ici Ensuite, j'ai ajouté cet
événement « on click » pour ce bouton de paiement. Dans ce cas,
nous appelons tout d'abord cette API de commande en utilisant méthode
fetch et
avec ce jeton Comme nous le savons grâce à l'API de commande, nous obtiendrons les
données de commande. C'est ce que nous trouvons ici. Si les données échouent, nous affichons une alerte
avec un message d'échec. Maintenant, que se passerait-il si nous obtenions ordre
de paiement de réinitialisation avec succès
depuis le back-end ? Ensuite, nous ouvrirons la fenêtre de paiement
Resorb. Ici, depuis le front-end, nous devons transmettre ces
options avec reserp. voyez, nous avons ici le montant de la clé, devise, le nom, le numéro de commande et enfin, nous avons un gestionnaire Ce gestionnaire est vraiment
important, c'est-à-dire la fonction. RSR P exécute cette
fonction de gestionnaire lorsque l'utilisateur saisit les informations correctes et que le
paiement est effectué avec succès. Ainsi, après un paiement réussi, nous appelons notre deuxième API
pour vérifier le paiement. Si cette vérification
est réussie, nous
affichons une alerte de réussite, et si elle
échoue, nous affichons une erreur de champ. Enfin, pour ouvrir une ressource,
nous créons une nouvelle instance de réserve
et passons des options complètes ici Ensuite, en utilisant simplement
reserp point Open, nous ouvrons la
page ReserpPayment avec ces options Enfin, nous avons ce
champ de point de paiement qui s'exécute lorsque l'utilisateur saisit de mauvaises informations de
paiement ou s'il n'a pas un solde
suffisant, cette fonction
fonctionnera aussi simplement que cela. Maintenant, goûtons simplement à
notre implémentation. Je suis très enthousiaste à ce sujet. Enregistrez ce fichier et
retournez dans notre navigateur, actualisez la page et cliquez
simplement sur le bouton de
paiement Taste. Il arrive des choses, ce n'est pas juste. Voyons ce qui se passe. Donc, lors de l'inspection à l'aide de F
12 ici dans la console, nous pouvons constater que nous avons une erreur L'accès à l'API de
paiement FechTo depuis origin null a été
bloqué par la politique du cours Il s'agit d'une erreur très courante
chez les développeurs full stack. Cela se produit parce que par défaut, notre application Express ne peut pas accepter les appels
d'API, quelle que soit leur origine. Vous devez activer le cours
dans notre application Express. Revenons donc au code VS, ouvrez un nouveau terminal et écrivez, installez le cours
NPM
et appuyez sur Entrée Maintenant, dans le fichier
JS à points d'index en haut, nous importons le coût du cours
égal au cours obligatoire. Ensuite, en bas, avant ce point express JS
et au milieu où nous ajoutons point d'
application Ug nous appelons cette
fonction de cours, et c'est tout Enregistrez les modifications et assurez-vous que notre serveur fonctionne. Bien. Actualisez maintenant la page et cliquez à nouveau
sur le bouton de paiement. Vous voyez, la
fenêtre de paiement RSR P est arrivée. Nous avons ici ces types de méthodes de
paiement comme les cartes, services bancaires en ligne, le portefeuille,
les lettres de facturation, etc. Je pense que l'UPI n'est pas là parce que mon entreprise n'
est pas vérifiée Maintenant, sur le côté gauche,
nous avons le résumé des prix, qui est de cinq roupies en
fin de compte,
nous passons les 500, nous obtenons
ici des roupies pi Pourquoi ? Donc, dans le montant rempli, nous devons indiquer le montant dans la plus petite unité
de la devise. Et quelle est la plus petite
unité de notre pays, le PSA, qui est de 100 PSA,
équivaut à une roupie Et nous passons ici 500 PSA, qui se convertissent en roupies Pi Donc, si nous
le changeons en, disons, 50 000, enregistrez les modifications
et actualisez la page. Et si nous cliquons à nouveau
sur le bouton de paiement, voyez, nous obtenons ici 500 roupies Assurez-vous donc du
montant du paiement. C'est pourquoi j'ai créé
ce modèle frontal, afin que vous puissiez comprendre très clairement l'ensemble
du processus. De plus, en haut à droite, nous pouvons voir que nous sommes en mode
dégustation car nous avons créé un identifiant clé et
un secret clé pour le mode dégustation. Maintenant, goûtons au paiement. Donc, pour goûter au paiement, nous passons d'
abord aux cartes. Ici, à des fins de dégustation, ser pay fournit
certains détails de la carte. Ils ont également fourni tous les
détails sur la documentation. Je vais vous donner le lien de
cette page sur le côté droit ci-dessous
de cette leçon. Passons donc aux cartes. Testons la carte indienne, copions ce numéro de carte, et dans notre page, collons-le ici. Maintenant, indiquez ici toute date d'expiration
future, comme le 12, 30 et le code CVV, passons le 111,
effectuons le paiement,
sécurisons la carte, peut-être C'est du traitement et quel scénario
nous voulons d'abord tester, un
succès ou d'un échec, optons
pour l'échec. Il est en cours de chargement. Et vous voyez, le paiement a échoué, et nous recevons également une alerte d'échec du
paiement. Essayons maintenant de réussir. Encore une fois, à ce numéro de carte,
vérifiez qu'elle est en cours de chargement,
sélectionnez Success. Et ici, nous obtenons cette
belle animation, puis le
paiement est réussi. Et aussi, nous obtenons ici un paiement vérifié
avec succès, que nous obtenons grâce à
notre deuxième API. Nos deux API fonctionnent donc bien. Si vous souhaitez essayer
un autre mode de paiement, vous pouvez également le faire. Il suffit de consulter la documentation
de cette méthode de test. Mettons maintenant à jour notre
API pour une utilisation réelle. Donc, comme nous le savons, notre
paiement fonctionne. Nous pouvons désormais améliorer nos API
et les rendre réalistes. C'est vraiment simple.
Laisse-moi te montrer. Alors, que souhaitez-vous
modifier dans l'API de commande ? Tout d'abord,
nous adoptons actuellement montant
statique ici,
mais ce n'est pas correct. Nous devons répercuter le prix total de la
carte de l'utilisateur. Deuxièmement, nous
transmettons également votre devise IR , mais l'utilisateur peut décider dans quelle
devise il souhaite payer. Nous voulons donc effectuer ces
deux modifications uniquement. Commençons par obtenir le
montant de la carte. Donc, avant cette
instance de réinitialisation, nous écrivons const, cart et wait cart C, la
saisie automatique ne fonctionne pas. Donc, au sommet, le coût, panier est égal à exiger nous mettions un dossier dans
les modèles et dans ce panier. Maintenant, dans notre
panier d'API point Fine one, et ici dans l'objet, nous passons un identifiant de soulignement point
utilisateur à point utilisateur Maintenant, cela
renverra l'objet du panier, mais nous devons passer la condition
si le CAT n'est pas disponible ou si la
longueur du point des produits à points CAT est égale à zéro, puis nous renvoyons la réponse avec un message JCN de 404 points au CRT introuvable Maintenant, à la place de ce montant, nous devons passer le prix
total du CRT cent, car nous devons transférer le montant dans la plus petite
unité de devise Goûtons,
enregistrons les modifications, actualisons la page et
cliquons sur Taste Payment. Si nous vérifions la console, nous avons ici une erreur. Il s'agit de l'erreur 404, ce qui signifie que la carte est introuvable. Oh, n'oubliez pas que dans la
leçon de suppression du panier, nous retirons
le panier en retirant le dernier produit de la gamme de produits Nous devons
donc ajouter un
produit dans notre panier, accéder à Postman, ouvrir
sur l'API du panier Ici, nous devons mettre à jour Togan, copier depuis l'API de connexion et le coller dans l'en-tête
d'autorisation Bien. Maintenant, envoyez la
demande, produit ajouté. C'est un iPhone, sympa. Retournez maintenant au navigateur
et actualisez la page, et encore une fois, goûtez au paiement. Tu vois, c'est ici que nous obtenons le prix de notre carte. Maintenant, comme nous le savons, dans la base de données, nous stockons le
prix de tous les produits en dollars américains, et c'est pourquoi nous achetons
deux iPhones à ce prix Mais si vous utilisez Razor Pay, votre entreprise
sera située en Inde et il est fort probable que vos utilisateurs cibles
seront également des Indiens Dans ce cas,
dans la base de données, vous devez enregistrer le prix
dans la devise indienne. Supposons maintenant que
vous souhaitiez cibler un public
mondial et que vous stockiez le
prix en dollars américains. Dans ce cas, vous devez
convertir le prix du dollar en monnaie
indienne
, puis le répercuter sur le montant. Je vais
vous montrer comment nous pouvons le faire. Donc, pour convertir
la valeur du dollar dans la devise indienne, nous avons besoin du taux de change actuel. Nous ne pouvons pas nous fier au taux de change
statique. Nous allons donc appeler une API pour obtenir le taux de change
exact. Rendez-vous donc sur Groom et
recherchez le taux de change api.com. Il s'agit de l'API de taux
de change la plus populaire. Maintenant, pour obtenir le taux de change, nous avons besoin d'une clé API pour cela. Nous saisissons donc ici notre e-mail et
cliquons simplement sur GetVree Key Ici, nous devons
créer un mot de passe, accepter les termes et générer une
clé API. Qu'est-ce que c'est ? Terminez la
vérification, puis ils vous enverront la
clé d'activation de l'API dans votre e-mail. Ouvrez ce lien, et
nous obtenons ici la clé API. Nous pouvons voir que nous pouvons envoyer
1 500 demandes d'échange. Si vous souhaitez obtenir plus de demandes, vous devez payer pour cela. Comment fonctionnent toutes les API
de taux de change. Pour l'instant, ne t'inquiète pas pour ça. Copiez simplement cette clé
et dans notre fichier ENV, nous ajoutons l'API de
score de taux de change clé de
soulignement est égale à
coller votre clé d'API ici Enregistrez ce fichier et revenez
à la page des taux de change. Ici, nous devons trouver l'API, aller à l'aperçu de Doc. Ici, nous avons des API, une pour obtenir
tous les taux de change et une pour obtenir la paire. Nous passons à une conversation à deux. Ici, nous obtenons l'
API, alors copiez-la, et dans notre API, créons une fonction distincte pour obtenir le taux de change. Donc, Const, le taux de change de la montre
est égal à la fonction flèche. Maintenant, dans cette fonction, nous appellerons cette API de taux de
change. La réponse constante est donc égale à wedge,
et ici, dans les backticks, il suffit de coller l'
IIURL. Nous devons maintenant changer
un certain nombre de choses. Ici, à la place de votre API, nous devons écrire des crochets Cully en
dollars,
traiter le point nw point Exchange, le taux de soulignement, la clé de
soulignement de l'API de soulignement Assurez-vous d'écrire le
bon nom de variable ENV. Maintenant, nous
avons enfin deux devises. premier est la devise de base, c'est-à-dire la devise dans laquelle nous ajoutons le prix
dans notre base de données, et
le second est la devise cible dans laquelle
nous voulons convertir. Notre devise de base est donc le
dollar américain, car dans la base de données, nous avons ajouté le prix des produits en dollars américains et nous voulons convertir
cette devise en INR. Notre devise cible est donc l'INR. Également au lieu de transmettre la valeur
statique de la devise
cible, nous pouvons la rendre variable. Donc, dans le paramètre, nous obtenons devise
cible et nous transmettons cette devise
cible calibrée en dollars Maintenant, comme nous le savons, l'
API de récupération est une tâche asynchrone. Nous devons attendre ici
la réponse. Et pour utiliser await, nous devons rendre cette
fonction asynchrone. Luly. Maintenant, cette réponse
renverra des données comme celles-ci. Ici, nous avons besoin de ce taux de
conversation. Après avoir obtenu la réponse, nous devons convertir
ces données en JSON. Les données de coût sont égales au point de réponse JSON d'
attente. Maintenant, à partir de cette fonction, nous pouvons simplement renvoyer taux
de
soulignement de la conversation par points Bien. Maintenant, dans notre OrderyPI, nous comptons
simplement ici le
montant, le taux de change, taux de
soulignement est égal au
poids, au patch, au taux de change, fonction, et comme argument, nous transmettons notre
devise cible, qui Maintenant, après avoir obtenu
le taux de change, nous créons que le montant constant
est égal au prix total de la carte au
point de la carte dans le taux de soulignement de
change, et nous devons arrondir cette Enveloppez donc cette expression
entre parenthèses et ajoutez
simplement un point à fixed
et passez-en deux ici Maintenant, dans le montant, nous
passons le montant à 100. Nous allons maintenant vérifier cette
implémentation. Enregistrez à nouveau ce fichier dans le navigateur, actualisez la page et
cliquez sur Taste payment. Vous voyez, maintenant nous obtenons la valeur
en monnaie indienne. Génial. Supposons maintenant que nous voulions que notre utilisateur puisse
transmettre la valeur cible. Nous obtenons donc la
valeur cible de l'utilisateur dans le corps du point de demande. L'objet Secst est égal
au corps du point de requête, et nous obtenons ici une devise Et pour la valeur par défaut, nous transmettons ici la
devise de notre base de données, qui est l'USD. Maintenant, à la place de cette devise cible codée en
dur, nous transmettons notre variable monétaire, que notre utilisateur transmet dans
le corps du point de demande. Et voici la seule chose. Si notre devise de base et notre devise
cible sont les mêmes, nous n'avons pas besoin de récupérer le taux de
change, n'est-ce Faisons donc des modifications
dans notre code. Avant ce taux de change, nous passons à la condition que
la devise soit égale à l'USD, qui est notre
valeur de prix dans la base de données. Si les deux sont égaux, alors nous devons faire en sorte que le
montant soit égal au prix total de la carte par point. Sinon, nous pouvons calculer
le montant comme ceci. Il suffit donc de déplacer ces deux
lignes ici, de supprimer cette constante
et, en haut, de définir que le
montant est égal à zéro Nous remplaçons donc cette valeur en fonction de notre état. Et également en ce qui concerne les options de commande, nous devons transmettre cette devise, économiser les modifications et
goûter à notre implémentation Référez-nous la page, cliquez
sur Goûtez au paiement pour voir, ici nous obtenons des INR parce que
depuis le front-end, nous envoyons des devises sous forme d'INR Si vous souhaitez changer
cela, ouvrez STMLFle faire défiler l'écran jusqu'à ces variables Ici, dans la devise de l'utilisateur, nous passons le dollar canadien au dollar canadien. Enregistrez ce fichier, actualisez la
page et envoyez la demande. Voyez ici que nous obtenons de la valeur
en dollar canadien. De plus, si nous ne transmettons pas votre champ de devise
lors de l'appel EPI, enregistrez-le, actualisez la page et renvoyez la demande. Vous voyez, par défaut, il atteint un pic en dollars américains. Génial. De plus, si votre compte Razor
Pay ne dispose pas de fonction de paiement
international, vous ne pouvez pas effectuer de paiement
international C'est la politique du paiement par l'utilisateur. Si vous souhaitez vérifier
la fonctionnalité de
paiement international de votre compte, accédez à vos
comptes et aux
options de configuration de votre compte Ser Bay. Vérifiez que vous êtes
en mode live. Ici, je ne peux pas passer en mode
e car ce
compte n'est pas vérifié. Si vous pouvez passer en mode direct, rendez-vous sur les
paiements internationaux sur le blog des paiements. Que vous puissiez voir que votre fonction de paiement
international est activée ou non. Actuellement, nous sommes
en mode test et nous testerons
également
nos paiements internationaux. Nous améliorons donc notre première API. Passons maintenant à la seconde. Améliorons maintenant
notre deuxième API. Ne vous inquiétez pas, nous n'
avons pas grand-chose à faire. Nous allons simplement créer
de nouvelles données de commande dans la base de données et supprimer la carte utilisateur si le
paiement est réussi. Si le paiement n'est pas vérifié, nous exécutons
ce bloc de code. Si le paiement est réussi, nous pouvons écrire le code ici avant de renvoyer
une réponse de confirmation. Ici, nous créons des coûts, une nouvelle commande est égale à une nouvelle commande. Assurez-vous que nous avons saisi
ce modèle de commande. Donc, au sommet, le coût de l'
ordre est égal à exiger que nous fassions le plein des
modèles et dans ces commandes Bien. Maintenant, en bas, nous devons passer un nouvel objet
de commande ici. Tout d'abord, dans cet ordre, nous ajoutons un identifiant user à request dot
user point underscore ID Après cela, nous avons besoin de
produits, et dans ce cadre, nous stockerons tous les
produits que nous commanderons Comment pouvons-nous obtenir ces informations ? Bien, on peut l'obtenir
depuis le backend. Avant cette commande, nous trouvons le coût, le panier est égal à huit points de
chariot Fine Vn. Ici, dans l'objet, nous passons la condition user à request
dot user point underscore ID Simplement lors de la commande de produits, nous passons les produits aux produits
CAT point. Ensuite, ajoutez le total des produits
à CRT Total Products. Ensuite, nous avons le prix total par
rapport au prix total du CRT. Ensuite, nous avons l'adresse de livraison
, que nous devons obtenir
par le front-end. Pour l'instant, laissez-le tel quel. Ensuite, nous ajoutons le
statut du paiement à payé, identifiant de
paiement pour réserver le paiement, le trait de
soulignement, le paiement, l'identifiant de
soulignement Et comme information supplémentaire,
150. Paiement international avec Paypal: Voyons comment implémenter passerelle de paiement
internationale
dans notre application de nœud. Comme nous le savons, pour le paiement
mondial, nous avons deux options très
populaires. Nous avons des rayures et
du papier. Dans cette leçon, nous allons
implémenter un papier comme celui-ci. Nous l'
implémenterons dans notre back-end, le
dégusterons avec le front-end, et nous pourrons également
voir ici les paiements gustatifs. Ce sera donc amusant. Cette vidéo s'adresse aux
habitants de tous les pays. Commençons par ça. De plus, actuellement, Stripe est une option sur demande uniquement
pour mon pays, je peux
donc vous montrer la
démonstration de Stripe. Si, à l'avenir, ils le permettent, je créerai également une
leçon à ce sujet. Voyons maintenant
le flux de travail de la passerelle de paiement Paper. Ainsi, lorsque l'utilisateur clique
sur le bouton Checkout, nous créons une API, disons, créons une commande. L'API créera un ordre
pour le paiement papier avec quelques détails tels que montant
que nous voulons recevoir, dans quelle devise nous voulons que
l'utilisateur paie en USD ou en euro. N'oubliez pas que cette commande
est une commande papier et non notre collection de commandes. Désormais, cette API
générera un numéro de commande en utilisant du papier et renverra simplement
ce numéro de commande au front-end. En utilisant ce numéro de commande, Paper ouvrira une page de paiement où l'utilisateur pourra saisir
les détails du paiement. Maintenant, une fois que l'utilisateur aura
saisi les informations de paiement, nous appellerons une autre API pour
capturer ce paiement. En gros, grâce à cette API, nous autoriserons les utilisateurs à payer, ajouterons notre compte Paper
Business, puis nous créerons les données de commande, et une fois le paiement réussi, nous créerons les données de commande et
confirmerons la commande de l'utilisateur. Donc, pour implémenter le paiement
papier, nous devons créer deux API
dans notre backhand nodejs abord pour créer une commande, puis pour saisir le paiement
sur notre compte. Je sais que tu as beaucoup de
questions, mais ne t'inquiète pas. Après avoir terminé cette leçon, vous comprendrez mieux
l'ensemble du flux de travail. Créons donc ces deux API. De plus, si vous implémentez passerelle de paiement
SRP comme
dans la leçon précédente, vous
devez
répéter de petites choses comme supprimer
l'expiration des jetons, etc. Je dois le répéter pour que nous soyons
tous sur la même longueur d'onde. Je suis désolée pour ça. J'espère que
tu peux comprendre cela. Maintenant, dans le dossier routes, vous devez créer un nouveau
fichier appelé orders point js. J'ai créé ce fichier avec deux API car dans
la leçon précédente, j'ai montré l'intégration SRP, mais ces deux API sont distinctes de cette intégration de
paiement Tu peux totalement ignorer ça. Désormais, pour
ajouter rapidement l'itinéraire, il
vous suffit de copier les
deux premières lignes de code des itinéraires de la carte et de les coller
dans le fichier d'itinéraire des commandes. À la fin, vous devez faire en sorte que le module point Xbards
soit égal à Router Vous devez également ajouter ce routeur dans le fichier
index point js, donc Const Order
routes est égal à
require Got routes
folder et Orders En bas, après les itinéraires de
la carte, vous pouvez ajouter app.us slash API slash Order
et passer Order Vous pouvez désormais vous concentrer
sur la création d'API. Donc, dans notre fichier, le
routeur poste et pointez pour slash People
slash Create Order Ici, nous avons également besoin du
middleware OS car nous voulons que seuls
les utilisateurs connectés puissent accéder à cette API Assurez-vous également que vous avez saisi Osmddleware en
haut et que vous êtes ensuite en mode rappel Maintenant, dans cette fonction, nous savons que nous voulons
créer une commande papier. Pour cela, nous
devons d'abord configurer P. Dans le dossier de configuration, nous devons créer un nouveau
fichier appelé paper point js. Tout d'abord, nous allons définir
une variable pour certains détails. Le papier const est donc
égal à un objet. Tout d'abord, l'ID client, qui est l'ID client de notre
application, puis le secret client, qui est la clé secrète de notre application
papier, et enfin, nous avons
également besoin d'une URL de base. Il s'agit de l'URL
de base de l'API papier. Nous stockerons tous ces détails dans le fichier NNV
pour des raisons de sécurité Ici, nous passons le processus
point par point sur papier,
soulignons l'identifiant de soulignement du client Et dans la deuxième propriété, nous écrivons process.nw dot
paper, underscore Enfin, nous écrivons le point de
processus E et le papier, le trait de
soulignement, la base, l'URL de
soulignement Maintenant, définissons ces trois
variables dans le fichier ENV. Ainsi, PPL souligne l'ID de
soulignement du client équivaut
à le laisser vide,
et ensuite, le trait de soulignement papier, secret est égal à L'URL du trait de soulignement de base du point de
soulignement papier est égale à. Nous les ajouterons lorsque nous
enregistrerons un compte professionnel papier. OK ? Pour l'instant,
laissez-le tel quel. Maintenant, sur papier, lorsque nous voulons créer une commande papier ou que
nous voulons capturer le paiement au
démarrage, nous devons
créer un jeton unique tel que JWT Donc, pour générer ce jeton, nous pouvons créer une fonction pour cela. Le jeton Const G Xs est
égal à la fonction flèche. Maintenant, pour générer le jeton, nous allons utiliser l'API des personnes
officielles. Donc, pour appeler l'API,
nous utiliserons Axos. Axios est le package permettant d'
appeler l'API en JavaScript. C'est beaucoup plus facile que d'
utiliser la méthode fetch. Stylet terminal, NPM,
installez Axios. Bien. Maintenant, pour utiliser ce package
Axios au sommet,
le coût d'importation d'Axios est
égal à celui d'avoir besoin de Xos Maintenant, dans notre Gate
as to confunction, nous attendons un point axios ici, nous devons ajouter la
méthode SDDP, Et dans cette méthode, à
la première position, ajoutez le point de terminaison de l'API dans les backticks, dollar Cali Brackets,
point BRL V un, O oth, deux, barre oblique Maintenant, à la deuxième place, qui est le corps, nous devons
adopter des codes doubles. Grant, le type de soulignement est égal aux informations d'identification du trait de soulignement
du client Et à la troisième place,
nous passons Configure Object. Tout d'abord, Oh, pour vous opposer, utilisez un nom P point ID client. Et ensuite, nous avons le mot
de passe du secret du client ppt. Maintenant, après Oath,
nous ajoutons des en-têtes à l'objet en type de contenu à double
code, deux en double code, applications codées par URL xWWWfm Et c'est tout pour cette API. Cette API générera un jeton
excédentaire pour nous, nous le stockons
donc en réponse
variable. Ensuite, nous renvoyons simplement
la réponse, point de données, le point X
et sous forme de jeton de code. Maintenant, pour utiliser await, nous rendons cette fonction asynchrone et peut-être que ce code
peut nous donner une erreur Il est donc préférable d'encapsuler ce
code dans un bloc try and cache. Donc,
bloquez Try and Catch et déplacez ce
code dans le blog Try. Et dans le cache,
nous enregistrons les points de la console, erreur lors de la récupération du jeton d'accès Et nous écrivons ce message
d'erreur à points. Simplement à la fin, nous faisons en sorte que le module dot exports
soit égal à object. Et ici, nous ajoutons du papier à papier, ou nous pouvons écrire uniquement du papier et obtenir un jeton d'accès
pour obtenir AcessTken Enregistrez ce fichier et revenez
à notre itinéraire de commandes. Maintenant, pour créer une
nouvelle commande papier, nous allons utiliser une autre API P. Vous pouvez obtenir toutes ces API dans la documentation papier.
Ne t'inquiète pas pour ça. Le coût de réponse est donc égal à attendre Axios pour
l'envoi des demandes et à la demande que nous
voulons envoyer par courrier Donc, postez dès le premier argument, nous devons passer et pointer
Batis dollar Cali Brackets, papier ArllasV Slash checkout Slash Commandes. De plus, pour utiliser cette variable
papier, que nous définissons dans le fichier de configuration
papier, nous devons l'importer en haut. Const CIBacketsPaper, et
nous avons également besoin d'un
jeton d'accès gat , c'est égal à exiger que nous ouvrions un dossier, une
configuration et un De plus, nous importons const Axios
est égal à require Axos. Maintenant, dans notre API dans Axios,
au deuxième paramètre, nous pouvons transmettre le corps
de la requête Ici, nous passons un objet
avec certaines propriétés. Le premier est l'intention. Cela définit l'intention de
la commande à capturer. Cela indique aux utilisateurs que
le paiement sera immédiatement saisi lorsque
l'utilisateur l'aura approuvé. Pour cette raison, nous
capturerons immédiatement le paiement
dans une deuxième API. La propriété suivante que nous ajoutons est
l'achat d'unités soulignées. Pour créer un tableau. Cela
représente les articles ou les services que l'utilisateur
achète et leur coût. Pour l'instant, nous
passons simplement un objet, et nous passons la description
à l'ordre du panier d'achat, et une autre propriété
pour le montant à l'objet. Dans ce cadre, nous devons indiquer dans quelle devise nous voulons
accepter le paiement. Donc, le code de devise est en USD,
puis la valeur en dix. Nous voulons de la part de l'utilisateur une valeur D
ténue. Maintenant, après l'achat d'unités, nous passons les contextes d'application et de
soulignement. Cela fournit sur papier
des instructions sur ce qu'il faut faire une fois que l'utilisateur
a terminé avec le formulaire de paiement papier. Dans cet objet,
nous devons donc transmettre deux propriétés. La première est une URL de
soulignement écrite. Il s'agit de l'URL sur laquelle
nous voulons rediriger notre utilisateur une fois le paiement vérifié
avec succès sur papier. Et la deuxième propriété est l'URL de soulignement d'
annulation, c'est l'URL sur
laquelle nous voulons
rediriger l'utilisateur après le
rejet ou l'annulation du paiement Pour l'instant, laissez ce
champ tel quel. Nous le remplirons lorsque nous
goûterons à cette implémentation. Maintenant, après le corps
de la demande, nous pouvons transmettre d'autres configurations
telles que l'en-tête à l'objet, type de
contenu à l'application, ZSN et nous devons également transmettre en-tête
d'autorisation
à Batis beer,
space, et ici nous
ajouterons Pouvez-vous nous dire comment
générer ce jeton ? Nous pouvons utiliser GXSSTKenFunction. En haut, le jeton const est égal à un poids car il
s'agit d'une fonction vous obtenez le jeton excédentaire dans l'en-tête
d'autorisation, nous transmettrons le jeton dollar
Calibrakets, et c'est tout pour
cette API papier Maintenant, cette API va créer une
nouvelle commande, comme des données écrites, comme un numéro de commande et des liens. Ici, il suffit
de renvoyer le lien, qui est le lien papier. Si nous ouvrons ce lien
dans le navigateur, nous obtiendrons une page de paiement
papier. Nous renvoyons donc simplement l'URL d'approbation de l'objet Json par
point de réponse, deux points de réponse par point thêta. Links
point find Ici, nous obtenons la fonction de flèche à
lien unique, le point de lien L est égal aux codes, approuvons le point extérieur
HRF, et c'est tout Notre première API est terminée. Définissons maintenant rapidement notre deuxième API pour
capturer le paiement, puis nous testerons
cette implémentation. Donc, routeur, point post
et point pour slash, ordre de capture
du papier Ensuite, c'est un rappel
avec demande et réponse. Désormais, la saisie du paiement
est très simple. Tout d'abord, nous allons
obtenir le numéro de commande à partir
du corps du point de demande,
car
nous devons l' envoyer dès le début et nous avons besoin ce numéro de commande pour
saisir le paiement. De plus, à des fins de vérification, nous
pouvons mettre une condition ici Si le numéro de commande n'est pas disponible, nous
renvoyons simplement le statut du point de
réponse, objet Json à
400 points
avec la propriété du message, veuillez envoyer le numéro de commande
ou fournir le numéro de commande. Fournir des sons bons.
Qu'est-ce que tu en dis ? Oui Maintenant, si nous avons un numéro de commande, nous
avons besoin d'un jeton
pour l'API de capture PL. Le jeton Gs est donc égal à wait, G excess token, et à la fin, nous appellerons simplement une API. Attendez le point axios pour le
point de terminaison, nous adoptons les taxes BC, dollar ClacketSP point BRL deux,
slash checkouts, commandes, crochets en dollars En tant que capture. Maintenant, au deuxième paramètre, nous devons passer le corps. Pour cette API, nous n'avons pas
besoin de transmettre quoi que ce soit, nous passons
donc un objet vide. Nous obtenons maintenant le statut et quelques détails sur la
capture à partir de cette API. Nous pouvons donc le stocker en
réponse, et à la fin, nous
renvoyons simplement statut de l'objet Json à la réponse, données
point, l'état du point. Ce statut
indiquera que le paiement a été capturé avec succès
ou non, et c'est tout. Vous pouvez voir à quel point c'est simple. Il suffit d'appeler l'API People. Maintenant, vous vous demandez peut-être pourquoi ne pouvons-nous pas appeler ces API
depuis le front-end ? Supposons que nous appelions directement cette API
de
création de commande depuis le front-end. Maintenant, comme nous le savons, l'utilisateur dispose d'
un excédent sur le front-end. Ils peuvent simplement modifier cette valeur de montant et la
rendre nulle ou 0,5. Imaginez combien d'argent l'
entreprise perdra et que certaines personnes utiliseront certaines informations à
mauvais escient. C'est pourquoi nous
devons implémenter ces fonctionnalités de paiement
dans notre back-end. Nous complétons ici nos deux
API pour p. Ne vous inquiétez pas, agit que d'une
implémentation de base. Nous améliorerons ces API après tests, car dans
la deuxième API, fois le
paiement capturé avec succès, nous devons créer
une nouvelle commande pour cet utilisateur et supprimer les informations de
la carte. Pour l'instant, nous ne
voulons pas cette complexité, alors nous le ferons plus tard
dans cette leçon, n'est-ce pas ? Avant de tester ces API, nous avons besoin d'une clé client papier, un secret personnel et d'une URL de base de
personnes. N'oubliez pas que nous utilisons
des variables vides dans le fichier ENV, nous devons d'abord ajouter ces
trois champs, et pour cela, nous devons
configurer un compte People Business Configurons maintenant le compte Paper
Business. Créons un nouveau compte papier et goûtons à cette implémentation. Dans ce processus, vous aurez peut-être besoin certains documents juridiques
et de vos coordonnées bancaires. Rendez-vous donc sur la page papier destinée aux
développeurs, developer.paper.com Si vous avez déjà un compte professionnel
papier, c'est bien, mais la plupart des étudiants n'ont pas de compte professionnel
papier. Je parle ici de compte
professionnel, pas de compte personnel. Vous pouvez également convertir
votre compte personnel en compte professionnel
à
partir de ce paramètre. Ici, nous cliquons sur C
pour créer un nouveau compte. Assurez-vous ici de sélectionner le compte professionnel
et de commencer. Entrez votre adresse e-mail
ici et soumettez-la. Maintenant, créez votre mot de passe. Assurez-vous de suivre ces
instructions et de les soumettre. Maintenant, décrivez votre type
d'entreprise, je sélectionne votre individu, et ici nous devons également
donner ces informations. Produit ou service,
disons, des places de marché. J'écris des détails aléatoires, mais dans le monde réel, vous
devez écrire vos détails originaux. Code d'objectif, laissez-moi
voir ce qu'ils ont. Sélectionnez vos services
de divertissement. Ensuite, je dois inscrire le numéro de
ma carte d'identité. Pour votre pays, il
se peut que ce soit autre chose, vous devez
donc écrire
les informations correctes. Nom de la déclaration à, disons, que Dieu vous bénisse et
soumettez le formulaire. Maintenant, nous devons renseigner les informations
personnelles et professionnelles, je les remplis
donc rapidement. Ces plateformes de paiement
changent donc très souvent
d'interface. Donc, si à l'avenir, vous n'obtenez pas la même
interface que moi, ne
vous y trompez pas. Fournissez simplement les
informations
demandées et créez un
compte professionnel sur papier. Après avoir créé un compte, nous pouvons créer un
identifiant client et un secret client. De plus, ici, je sélectionne la
devise principale par rapport au dollar américain. Vous pouvez choisir ce que vous
voulez accepter et continuer. Ici, ils demandent de
vérifier votre identité. Si vous prévoyez d'effectuer vos paiements en mode direct, effectuez ce processus
dès que possible. Pour l'instant, je veux juste tester, sélectionner, le faire plus tard. Cela nous permettra de passer à
la page papier. Maintenant, en haut,
cliquez sur développeurs, et comme vous pouvez le voir, nous
sommes maintenant en mode Sandbox, c'
est-à-dire en mode test Maintenant, pour créer un
identifiant client et un secret client, nous passons aux applications et aux informations d'identification. Cliquez sur Créer une application. Écrivez le nom de votre application, n'importe quoi. Disons le nœud Cardwish. Nous créons un compte pour le commerçant et créons simplement une application. Il est en cours de chargement et vous voyez, ici nous obtenons l'
identifiant du client et le secret. Donc, d'abord, copiez l'ID client et collez-le dans notre
fichier ENV Client ID Maintenant, copiez la clé secrète et
collez-la également à la valeur secrète. Pour les
URL papier, nous transmettons les TDP, deux
points, double barre oblique Bien. Enregistrez ce fichier. Maintenant, pour tester avec paiement, nous avons également besoin d'un
compte de test sandbox pour envoyer le paiement Nous passons donc aux outils de test et nous utilisons des comptes sandbox. Vous voyez,
ici, nous avons deux comptes de
test, un pour les entreprises et
un pour le personnel Pour le moment, il n'est pas
nécessaire de créer un nouveau compte. Si nous en avons besoin, nous créerons. Maintenant, comme nous le savons, nous avons
besoin d'un front-end
pour tester cette API car
sur le front-end, nous ouvrirons une page de paiement papier. Maintenant, comme nous le savons, nous avons
besoin d'un front-end
pour tester ces API,
car sur le front-end, nous allons ouvrir une page de paiement papier. J'ai donc créé ici une simple page
SDML appelée p
tasting point SDML Vous trouverez cette page en
dessous de cette leçon, et elle est également disponible dans le dossier de ressources du projet. Téléchargez-le et
ajoutez-le simplement à votre projet en cours. Maintenant, exécutons ce
fichier SDML dans le navigateur. Accédez donc à
SDMLFle dans l'explorateur de fichiers ou Finder et
ouvrez-le simplement dans Chrome Ici, nous avons le titre
et un simple bouton. Si vous voulez voir ce qui s'est passé lorsque nous
cliquons sur ce bouton, vous pouvez regarder
le fichier SDML C'est vraiment simple. Vous voyez, il fonctionne
actuellement à partir des fichiers locaux de notre machine.
Maintenant, voici la seule chose. N'oubliez pas que dans l'API de commande, nous devons transmettre les
contacts de l'application. Tu vois, ici. En gros, nous devons passer la page de réussite
et la page d'annulation. Dans l'API de commande, nous ne pouvons pas transmettre le chemin du dossier local, nous devons transmettre l'URL. Quelle est donc la solution ici ? Nous pouvons héberger notre
fichier SDML sur un serveur local, puis nous
transmettrons ce chemin ici Laissez-moi vous montrer que c'
est très simple. Donc, dans l'onglet extension,
recherchez Live Server. Et installez cette extension. En utilisant cette extension, nous pouvons exécuter notre application
sur un serveur local. Retournez aux fichiers et cliquez sur
le lien droit sur le fichier PDF de dégustation papier et sélectionnez Ouvrir
avec Live Server Et vous voyez, il est ouvert
dans le navigateur, mais maintenant il fonctionne
sur ce port. Copiez simplement cette URL, revenez au code Vas, et collez-la simplement dans l'URL écrite et
également dans l'URL d'annulation, collez la même URL. Mais pour vérifier si cela
fonctionne ou non, on passe ici pour annuler. Dans le monde réel, demander au développeur
frontal
quelle page il souhaite
afficher en cas de succès,
annuler et modifier le
chemin en fonction de cela. Je passe ce chemin
juste pour tester. Enregistrez ce fichier et
assurez-vous que le serveur fonctionne. Ici, j'ai une erreur, des paramètres
dupliqués. Oh, je passe ici la réponse
sur le lieu de la demande. Et aussi, permettez-moi de
vérifier une autre API. Oui, voici également une demande. Enregistrez ce fichier et
assurez-vous que notre serveur fonctionne. Bien. Cela fonctionne. Retournez maintenant dans la chambre et
cliquez simplement sur payer avec papal. Rien ne se passe
Ce n'est pas juste. Voyons ce qui se passe. Donc, effectuez une inspection panoramique à l'aide de FL, accédez à la console, et ici
nous pouvons voir que nous avons une erreur. L'accès pour récupérer ou
créer une API de commande depuis Origin Null a été
bloqué par la politique du cours Il s'agit d'une erreur très courante
chez les développeurs full stack. Cela se produit parce que par défaut, notre application Express ne peut pas accepter les appels
d'API, quelle que soit leur origine. Nous devons activer le cours
dans notre application Express. Revenez donc au terminal et écrivez NPM install CRE. Et appuyez sur Entrée. Maintenant, dans le fichier d'index js en
haut, nous importons le coût. Le cours est égal au cours
obligatoire. Ensuite, en bas,
avant cet express
DJ et ce middleware,
nous ajoutons app point g
course, et c'est tout avant cet express
DJ et ce middleware, nous ajoutons app point g
course, et c'est Consultez les modifications. Assurez-vous que
notre serveur fonctionne. Bien. Il vous suffit maintenant de cliquer sur le bouton «
payer avec du papier ». Ici, je reçois une erreur
lors de la création de la commande, ce qui signifie que nous
recevons une erreur dans l'API 1. Voyons ce qui se passe
ici. Ouvrez donc la console. Ici, je reçois 400 mauvaises demandes. Revenons donc au code VS
dans le terminal, C, nous obtenons un jeton comme porteur Entrez votre jeton JWT, ce qui signifie que nous transmettons le mauvais
jeton depuis le front-end Donc, ouvrez le point de test papier SDMLFle ici, nous devons
entrer notre jeton Ouvrez Postman, ouvrez l'API de connexion, générez un nouveau jeton Bien, copiez ce jeton, et
transmettez-le dans notre fichier STML Enregistrez ce fichier, moins celui-ci. Cliquez sur payer avec du papier. Il faudra un certain temps pour voir,
ici, nous obtenons une page de connexion papier, ce qui signifie que notre première API de création de
commande fonctionne bien. Maintenant, avant de vous connecter,
annulons le paiement. Vous voyez, nous redirigeons vers l'URL d'annulation. Maintenant, revenez deux fois en arrière pour nos parcours frontaux et
cliquez sur payer avec Paper. Nous obtenons la page de connexion Paper. Ici, dans le monde réel, notre client se connectera à aide de son
identifiant papier et de son mot de passe. Mais ici pour la dégustation, nous utiliserons le compte Sandbox Pensez à un compte Sandbox en papier,
c'est comme un compte Dummi pour la
dégustation Nous passons donc à notre tableau de bord papier. Ici, nous avons un
compte personnel. Cliquez dessus. Ici, vous voyez, nous recevons informations de
connexion, nous copions un e-mail et sur notre
interface, nous ajoutons cet e-mail. Revenez maintenant au tableau de bord
, copiez le mot
de passe , collez-le dans le mot de passe
et cliquez sur Connexion. Ici, nous recevons une lettre
d'erreur du vendeur. Nous ne sommes pas en mesure de traiter votre paiement à l'aide de votre compte
papier pour le moment. Retournez chez le marchand et essayez d'utiliser un autre mode
de paiement. Alors laisse-moi réessayer. Vous voyez, nous avons
toujours la même erreur. Maintenant, laisse-moi essayer autre chose. Actuellement, ma demande
est basée sur un compte indien, et ici j'essaie de
payer de l'Inde à l'Inde. Le papier n'autorise pas les paiements
nationaux en
Inde via des portefeuilles en papier Même dans le compte sandbox, nous essayons une transaction entre
deux comptes indiens, puis cela
nous donnera également une erreur si le paiement entre l'Inde et l'Inde a une autre passerelle de paiement,
comme Raiser Pay Créons un
compte de test pour un autre pays. Le type de compte est
personnel et ici, sélectionnez n'importe quel pays,
mais ne sélectionnez pas le même pays
que ce compte professionnel.
Créez un compte. Essayons maintenant de nous connecter
avec ce nouveau compte. Revenons à notre front end. Ici, je reçois le même message d'erreur car mon compte est connecté. Ouvrons donc cette interface dans l'onglet Incognito et
payons avec Ici, j'ai la page de connexion. Assurez-vous de vous connecter avec
un
compte dans un autre pays, d'ajouter un e-mail, ajouter ici un mot de passe
et de vous connecter avec ce compte Vous voyez, nous avons ici la page de paiement
papier. En haut, nous obtenons
le compte utilisateur, et ici nous obtenons le prix à payer. De plus, ici en bas, nous proposons différentes
méthodes de paiement telles que le solde papier, coopérative de
crédit en utilisant
une carte, un crédit papier, et vous pouvez
également ajouter votre propre carte. Il s'agit d'un compte de test, et c'est pourquoi nous
ne faisons rien. De plus, nous obtenons ici l'
adresse de ce compte. Voici les détails
du compte de dégustation. Maintenant, nous allons cliquer sur
Continuer pour vérifier la commande. Donc, ici, le paiement a échoué. Laissez-moi vérifier ce qui ne va pas. Ouvrez bien la console en utilisant
F et voyez, nous avons
ici une erreur dans l'API d'ordre de
capture. Donc, dans notre code VS
dans le terminal, j'ai
ici cette longue erreur, alors faites défiler rapidement vers le haut. Ici, nous obtenons une erreur, impossible de lire les propriétés dont l'état de lecture
n'est pas défini Ainsi, dans notre deuxième API, nous n'obtenons pas de statut. Laissez-moi vérifier ce qui
ne va pas. Oh, désolée. Ici, j'ai oublié d'écrire. Enregistrez ce fichier et
revenez à notre interface. Permettez-moi d'essayer de supprimer
ce jeton et cet identifiant
de paire de l'URL et d'exécuter
ce simple fichier SGML Cliquez maintenant sur payer avec du papier. Pour que nous recevions le paiement papal, cliquez
simplement sur Continuer
pour vérifier la commande Ici, je reçois à nouveau le remplissage du paiement. N'oubliez pas que chaque fois que nous
appliquons de nouvelles fonctionnalités, des erreurs se produiront certainement. Ne soyez pas frustré, concentrez-vous sur les solutions, pas sur les problèmes. Vous voyez, ici j'ai une erreur
interne du serveur. Permettez-moi de vérifier la
demande de terminal remplie avec code d'
état 400 dans notre API de commande de
capture, ce qui signifie que nous n'
obtenons pas le numéro de commande. Oh, ici je n'écris que le corps du point de
demande. Vous devez ajouter un numéro de commande à points, enregistrer les modifications et,
dans notre interface, payer en papier. Continuez à passer en revue la commande. voyez, nous passons à
notre page de réussite, et c'est là que le
paiement est également réussi, ce qui signifie que notre deuxième API capture des paiements
fonctionne également. Vous voyez, dans notre URL, nous obtenons
également un jeton, qui est le numéro de commande, et nous allons récupérer ce
paramètre dans notre interface,
puis nous appelons la deuxième API de
capture de paiement
et nous transmettons cet
identifiant de commande dans le corps du message Et ainsi, nous enregistrons le
paiement sur un compte papier. Vérifions notre compte
professionnel,
recevons le paiement de 10$ ou non. Pour cela, nous devons
accéder au tableau de bord Pap. Dans les outils de test, accédez aux notifications du bac à sable Maintenant, dans ce menu déroulant, nous sélectionnons notre
compte professionnel et cliquons sur Rechercher. Et au bas de la page,
nous recevons le paiement. Si vous ne recevez pas le paiement, assurez-vous d'attendre
deux à trois minutes, car il faut
parfois du temps
pour afficher le paiement ici. Maintenant, si nous l'ouvrons, nous pouvons voir le
paiement de 10$ reçu de John, qui teste le nom du compte. Ici, nous pouvons voir la date
de la transaction. Il s'agit du format PST, qui correspond à l'heure standard spécifique Ne vous laissez pas embrouiller par cela. Vous vous demandez peut-être pourquoi nous recevons le paiement sur ce compte
professionnel. La raison pour laquelle nous recevons le paiement ce compte professionnel est
qu'en utilisant ce compte, nous créons notre application,
puis nous obtenons un
identifiant client et un secret papier. C'est pourquoi nous recevons le paiement
sur ce compte professionnel. Maintenant, nous goûtons au
paiement pour les utilisateurs américains. Tu vois, ici nous obtenons
le code du pays. Maintenant, pour déguster un paiement
dans un autre pays, nous pouvons créer un nouveau compte. Sélectionnez ici le compte personnel,
qui est le compte de l'acheteur, et ici nous pouvons sélectionner le pays. Disons que je sélectionne ici le pays, le Canada, vous pouvez sélectionner n'importe quel
pays et créer un compte. C'est vraiment amusant.
Vous voyez, en haut, nous obtenons le nouveau compte
pour un utilisateur canadien. Ouvrez cet utilisateur et
copiez simplement son adresse e-mail. Revenons maintenant à notre interface utilisateur et nous passons à une simple URL de test
papier. Assurez-vous que nous retirons ce jeton car il s'agit de la page
de suivi du paiement réussi. Cliquez maintenant sur payer avec du papier. Ici, nous obtenons à nouveau le compte précédent parce que
nous nous sommes connectés avec celui-ci. Donc, pour supprimer ce compte, nous cliquons ici sur cette icône JD. Voir en bas de page, nous obtenons Logout. Cliquez dessus. Maintenant, cliquez sur cette adresse e-mail de
changement d'utilisateur et collez ici cette
nouvelle adresse e-mail de compte. Maintenant, revenez à deskbard, copiez le mot de passe,
collez-le ici et connectez-vous avec celui-ci Bien. Maintenant, voyez ici en haut,
je reçois le montant de l'ordre,
mais ici, à partir de mon compte, je peux payer en
devise canadienne, c'est-à-dire en dollars canadiens. De plus, nous avons des méthodes de
paiement limitées, et voyons ici que le taux de conversation
des
gens est égal à 0,6 9549 USD Ici, les gens paient leurs frais de
transaction, mais nous pouvons payer dans la devise de notre
pays. Continuons à revoir la commande. Vous voyez, ici,
les paiements sont réussis. Et si nous consultons les notifications de notre
sandbox, recherchez ici le compte
professionnel Cela peut prendre peu de temps, et nous recevons ici
un autre paiement de 10$. En bas, comme nous pouvons le voir, nous trouvons l'emplacement du Canada. De plus, ce compte professionnel
reçoit son paiement en dollars américains,
même si le client paie
dans une autre devise. Ce client doit payer
les frais de transaction papaux. Donc, comme nous le savons, notre
paiement fonctionne. Nous pouvons désormais améliorer nos API
et les rendre réalistes. C'est vraiment simple.
Laisse-moi te montrer. Donc, ce que nous voulons
changer dans l'API de commande, nous transmettons actuellement montant
statique ici,
mais ce n'est pas correct. Nous devons répercuter le prix total de la
carte de l'utilisateur. Nous allons donc obtenir le prix
total de la carte. Donc, avant ce
jeton d'accès, nous écrivons le coût, panier est égal à un poids, panier Assurez-vous de saisir ce modèle de
carte point Fine un. Et ici, dans l'objet, nous passons un identifiant utilisateur à request point
user point underscore ID Et aussi, pour cet ID utilisateur, nous devons ajouter Osmidalware Assurez-vous de
le saisir également. Cela renverra l'objet de la carte, mais nous devons
passer son état si le panier n'est pas disponible ou si la
longueur des points des produits de la carte est égale à zéro, puis nous renvoyons la réponse avec code d'
état 404 points Json Object, propriété du
message
au panier introuvable. Maintenant, à la place de ce montant, nous devons indiquer le prix total de la carte par
point. Et ici, nous ne
changeons pas de devise parce que nous voulons être
payés en dollars américains. Si vous souhaitez recevoir un paiement
dans une autre devise, vous pouvez transmettre
ce code de devise dans ce code de devise. Mais il faut vérifier que les devises
sont acceptées sur papier ou non. Pour l'instant, goûtons ça. Enregistrez les modifications et accédez à Paper tasting point SDMLFle, laissez-moi vous expliquer ce
code très rapidement Nous passons donc ici le jeton JWT
pour lequel nous ajoutons un produit. Actuellement, dans notre application, nous ne fixons que 2 heures d'expiration, ce qui est un peu gênant
pour la dégustation car ici nous devons créer un
jeton JWT encore et encore Nous pouvons donc supprimer l'
expiration de la connexion et simplement ajouter l'expiration à l'étape
finale du projet. Ainsi, sur les itinéraires
des utilisateurs et en bas de page, nous supprimons cet objet
dont la propriété est expirée. Nous allons maintenant générer un nouveau
jeton qui n'expire jamais. Ouvrez Bostman et ouvrez l'API de connexion et envoyez simplement la demande Bien. Ici, nous copions ce
jeton dans le fichier SDML, il suffit de le coller ici Vous pouvez également transmettre ici
votre adresse de livraison. Maintenant, après cela, j'ai ajouté ici cet événement « on click »
pour ce bouton de paiement. Dans ce cas,
nous appelons tout d'abord notre API de commande en utilisant méthode
fetch et
avec ce jeton Et comme nous le savons grâce à
l'API de commande, nous obtiendrons l'URL d'approbation. C'est ce que nous avons trouvé ici. Si ces données n'aboutissent pas, nous affichons une alerte avec une
erreur lors de la création de la commande. Et si nous obtenions l'URL d'approbation avec succès depuis le backend ? Ensuite, nous redirigerons
l'utilisateur vers cette page. Maintenant, l'utilisateur entre
les informations correctes et le paiement est effectué avec succès. Maintenant, les utilisateurs transmettent un jeton
dans les paramètres de l'URL, qui est notre numéro de commande. Ainsi, après un paiement réussi, nous obtenons le jeton dans
les paramètres de l'URL. Ensuite, nous appelons notre deuxième API pour
capturer le paiement. Et si ce paiement
est correctement enregistré, nous
transmettons le statut dans la réponse depuis le back-end. Ici, nous vérifions que le
statut est terminé, puis nous affichons une
alerte de réussite et en cas d'échec, nous
affichons une
erreur d'échec, c' est aussi simple que cela. Maintenant, goûtons simplement à
notre implémentation. Je suis très enthousiaste à ce sujet. Enregistrez ce fichier et actualisez
maintenant la page, puis cliquez à nouveau
sur le bouton de paiement. Nous obtenons une erreur lors de la création de la commande
si nous vérifions la console. Vous voyez, ici nous avons une erreur. Il y a 400 erreurs, ce qui signifie que le panier est introuvable. Ou, n'oubliez pas que dans la
leçon de suppression du panier, nous retirons la carte en retirant les derniers produits de
la gamme de produits. Nous devons ajouter un
produit à notre carte, accéder à l'API Postman Open
Head to Cart Ici, nous devons mettre à jour le jeton, copier depuis l'API de connexion et simplement le coller dans
l'en-tête d'autorisation. Bien. Maintenant,
envoyons la demande. C, produits ajoutés. C'est un iPhone, chouette. Actualisons maintenant la page, et encore une fois, goûtons au paiement. Tu vois, c'est ici que nous obtenons le prix de notre carte. Charmant. Maintenant, nous
annulons simplement le paiement et nous passons au point de
dégustation de papier STMLPage Bien. Améliorons maintenant
notre deuxième EPI Ne vous inquiétez pas, nous n'
avons pas grand-chose à faire. Nous allons simplement créer de nouvelles données
de commande dans la base de données. Supprimez la carte actuelle de l'utilisateur
si le paiement est réussi. Ici, nous passons condition I : le paiement est
capturé avec succès, donc le statut du point de réponse, que nous obtenons grâce à
cette API de capture, si le paiement est égal
à terminé, nous écrivons le code ici
dans le bloc I. Nous créons donc ici des coûts. Une nouvelle commande est égale à une nouvelle commande. Assurez-vous que nous avons saisi
ce modèle de commande. Bien. Nous devons maintenant passer un
nouvel objet de commande ici. Donc, tout d'abord, dans cet ordre, nous ajoutons user to request dot
user point underscore ID Mais ici, pour obtenir les détails de
l'utilisateur, nous devons ajouter notre
middleware Maintenant, après cela,
nous avons besoin de produits, et nous y stockerons
tous les produits que nous commanderons. Et comment pouvons-nous obtenir
ces informations ? C'est vrai, on le
trouve dans le back-end. Donc, avant cette commande,
nous trouvons const, Card est égal à attendre que le
panier n'en trouve un Et ici, dans l'objet, nous passons la condition user à request
dot user point underscore ID Simplement dans la commande de produits, nous transmettons les produits au panier. Ensuite, le total des produits dans
le panier correspond au total des produits. Ensuite, nous avons le prix total, au point du prix total du panier. Ensuite, nous avons l'adresse de livraison
, que nous devons obtenir
par le front-end. Pour l'instant, laissez-le tel quel. Ensuite, nous ajoutons le
statut du paiement à payé, identifiant
de paiement au
point de réponse à l'identifiant du point de réponse. Et si vous souhaitez enregistrer
des informations supplémentaires, vous pouvez évaluer que
cela dépend vraiment de vous. De plus, si vous
souhaitez ajouter un nouveau champ, vous
devez ajouter ce
champ dans notre schéma de commande. Pour l'instant, nous transmettons toutes les
informations nécessaires. Nous pouvons maintenant enregistrer cette nouvelle commande, alors attendez que la nouvelle commande soit enregistrée
151. Obtenir l'historique des commandes: Définissons maintenant rapidement
d'autres API pour les commandes. Trouvons l'
historique de toutes les commandes de l'utilisateur actuel. Après cette API papale, nous ajoutons le point de routeur Get et le
point to forward slash De plus, pour trouver les informations de
l'utilisateur, nous ajoutons le middleware Os, puis nous utilisons la fonction de rappel avec demande Maintenant, ici, nous obtenons directement que const orders est
égal à un poids,
order point find, et ici
nous passons un objet de comparaison, utilisateur à demande point
utilisateur point point underscore ID Nous devons également raccourcir
ces données par date. Méthode Dot Short, et
ici dans l'objet, nous passons la valeur créée à deux moins
un par ordre décroissant Ici, à partir de la collecte des commandes, nous ne voulons pas afficher tous les remplissages. Sélectionnez un point, moins l'utilisateur,
moins l'adresse postale, moins l'identifiant de paiement,
et à la fin, nous pouvons envoyer une réponse, point JSN et transmettre ces commandes
ici Nous allons tester cette API. Donc, sur Postman, ici
dans le CardWZpject, nous créons un nouveau Dans le dossier Commandes, nous ajoutons une nouvelle demande
appelée Historique des commandes. Maintenant, point de terminaison vers le SCTP, colonne double pour notre
hôte local,
colonne 3 000, barre oblique l'
ordre et envoie Désolé, nous avons oublié de
transmettre le jeton JWT. Passez donc aux en-têtes. Tout d'abord, nous transmettons
l'autorisation au porteur, et ici nous transmettons le jeton Nous nous connectons donc à nouveau. Ici, nous obtenons un jeton,
copions ce jeton le
collons dans cette API
et envoyons la demande. Vous voyez, ici nous obtenons les
données des commandes adorables. Dans la
leçon suivante, nous allons définir notre dernière API pour ce projet.
152. Mise à jour de l'état par l'administrateur: Créons une API pour l'administrateur. Grâce à cette API, il ou elle peut modifier le
statut de la commande en cours de traitement, C livré ou en
tout ce qu'il souhaite. Donc, comme nous
voulons modifier une seule
propriété, pas l'ensemble du document, et pointer vers une barre oblique statut de l'
ordre D, nous avons
également besoin de l'ID de commande Nous transmettons
donc l'ID de commande par colonne Nous ajoutons donc le middleware Os
pour le jeton JWT. Et ici, nous devons également
vérifier la règle utilisateur. Est-ce un administrateur ou non ? Nous ajoutons donc ici la règle Jack, le middleware, la
saisie automatique C ne fonctionnait pas Et à l'intérieur de cela, nous devons
transmettre le rôle, qui est admin. Maintenant, en haut,
saisissons ce middleware. Const, check role est équivalent à exiger que nous accédions à un dossier,
intergiciel, et
que nous occupions ce rôle de Nous l'utilisons déjà dans
le parcours des produits. Si vous avez oublié, vous
pouvez regarder le code de route. Maintenant, il suffit de
transmettre une fonction avec
demande et réponse Génial. Maintenant, nous obtenons d'abord la commande à partir de la collecte
des commandes. SeccTudated order est égal à
wait order point find By ID. De plus, au lieu de cela, nous pouvons utiliser fine
by ID et mettre à jour. Ici, pour le premier argument, nous devons transmettre l'identifiant de commande, qui est request point
params point order ID Et au deuxième argument, nous passons l'objet
des valeurs mises à jour. Donc, l'objet classe le statut à
n'importe quelle valeur au passage moyen. Et comment pouvons-nous obtenir cette valeur directement depuis le corps de la demande ? Ici, avant la mise à jour de la commande, statut des coûts était égal au corps du point de la demande, au statut du point. Et ici, nous passons le
statut de la commande au statut. Et après cela,
au troisième argument, nous passons l'objet avec new à vrai. Indiquera aux mangues de renvoyer de nouvelles données mises à jour dans
cette valeur de commande Nous l'avons déjà vu dans
la section Mongo DB. Maintenant, il est possible
que nous n'ayons pas trouvé de commande. Si la commande mise à jour
n'est pas disponiblelabel, alors nous renvoyons la réponse, point status 404 point Json Object, propriété du
message à la
commande introuvable Enfin, nous passons simplement le point de
réponse json, Object,
message property au
statut de la commande mis à jour avec succès,
puis à la
commande mise à jour à la commande mise à jour. Ou nous pouvons également le supprimer et
c'est fait. Si vous souhaitez modifier quelque chose, vous pouvez effectuer ces modifications en
fonction de vos besoins. Testons cette API,
ouvrons Postman, ajoutons une nouvelle demande dans la collection de commandes
appelée mise à jour du statut de la commande, sélection de la demande sur la page, point de terminaison pour slash API, Sélectionnez également la page, le statut de la commande, et nous ajoutons ici le numéro de commande. Lors de l'appel d'API précédent, il
me suffit de copier cet identifiant de commande
et de le coller dans le point de terminaison. Maintenant, dans notre API, nous passons l'
en-tête à l'autorisation, et nous copions également la valeur de l'API précédente
et la collons ici. Envoyez la demande.
Ici, j'ai une erreur. Laissez-moi vérifier le terminal. Je connais une erreur de vérification des rôles. Donc, en haut, j'ai une faute de frappe, donc je change cela pour vérifier le rôle Les modifications et
envoyez la demande. voyez, ici, nous obtenons une erreur 403
interdite, accès refusé uniquement en tant qu'administrateur. Nous devons modifier la
règle utilisateur pour ce compte. Accédez à MongoivCompass, ouvrez la collection utilisateur et trouvez le compte par
lequel vous vous êtes connecté Sans cela, je change simplement
la règle pour que l'administrateur la mette à jour. Nous devons maintenant générer à nouveau
le jeton Web JSN. Connectez-vous et
envoyez la demande, copiez ce jeton et remplacez notre jeton
par ce nouveau jeton. Maintenant, dans body raw, nous devons également transmettre un objet
JSON avec le statut du champ à IB
et envoyer la demande. voyez, nous recevons ici un message de confirmation et également des données de
commande mises à jour. Charmant.
153. Nettoyage du code pour le fichier d'index: Donc, actuellement, notre
application est propre. Il suffit de vous embrouiller avec
le fichier JS à points d'index. Nous pouvons voir que cela n'a
pas l'air propre. Au sommet, beaucoup,
beaucoup ont besoin de
fonctions pour la saisie. Ensuite, nous avons un code pour créer un enregistreur et des gestionnaires d'erreurs
globaux Ensuite,
nous sommes connectés à MongoDB, puis nous appliquons des
intergiciels et des routes, et enfin nous
écoutons notre serveur Beaucoup de choses se passent
dans ce fichier de points d'index. Nous pouvons le nettoyer et stocker chaque logique dans
un fichier séparé. Ce n'est pas obligatoire, mais
de nombreux développeurs le font, mais cela peut vous embrouiller. Il existe donc un autre moyen au lieu de
séparer le code, nous pouvons le nettoyer en ajoutant commandes et en
les séparant les unes des autres. Je peux choisir de toute façon, cela dépend
totalement de vous. Laisse-moi te montrer mon chemin. En haut, nous avons une configuration, donc adhere, command
global config. Ensuite, nous
avons cet Express,
Mongoose, Winston, et Nous ajoutons des commandes,
des modules tiers. Que nous avons cette application. Nous ne voulons pas y toucher maintenant. En haut, nous ajoutons
toutes nos entrées. Certaines de ces importations de routes
concernent cette application et ajoutent des commentaires, des modules
personnalisés, ou vous
pouvez dire module de routes Il n'y a aucune règle
pour le commentaire. Tu peux écrire le commentaire
, comme tu veux. Gardez simplement à l'esprit que
vous verrez ce commentaire à l'avenir. Donc, à ce moment-là, vous
ne vous y trompez pas. Maintenant, après cela, nous
pouvons ajouter une commande pour cette application, initialiser l'application
express Maintenant, nous avons cet enregistreur
et aussi en bas, nous avons ce port, nous pouvons
donc le déplacer ici et
l'appeler constant Ensuite, pour cette
exception non détectée, nous ajoutons les erreurs synchrones catch, unhandle qui n'
ont pas été détectées dans les blocs
try Pour les rejets non gérés, nous
ajoutons les rejets catch
unhandlePmise Grâce à ces commentaires,
nous pouvons nous rappeler pourquoi nous ajoutons le code même
après une longue période. Après cela, nous avons ici la connexion à la
base de données. Ensuite, nous avons ces deux
intergiciels, donc les intergiciels,
puis pour les fichiers statiques, nous ajoutons des fichiers statiques nous ajoutons Ensuite, pour les routes,
nous ajoutons des routes API. Ensuite, nous avons un intergiciel
d'erreur, nous ajoutons
donc un gestionnaire d'erreurs personnalisé et nous démarrons enfin Maintenant, si nous examinons notre fichier
index point js, vous voyez, il semble maintenant un
peu plus propre. Oui, la séparation du code
rendra les choses plus propres, mais cela peut également nous embrouiller. Vous pouvez également séparer le code. Je dépend totalement de toi. Voilà, notre
projet de commerce électronique est terminé. Maintenant, dans la section suivante, nous allons passer à
notre troisième projet, qui est une application de
médias sociaux.
154. Section 13 - Introduction du projet 03: Bienvenue dans la nouvelle section
du cours ultime de Node JS. À partir de cette section, nous
allons construire un tout nouveau projet.
Peux-tu deviner ? Oui, nous allons créer un
backend d' applications de réseaux
sociaux à l'aide de NodeJS Nous appellerons ce
projet notre Linky Pi. Ce projet est l'un de
mes projets préférés. Permettez-moi de vous expliquer ce que nous
aborderons dans ce projet. Dans ce projet, nous allons créer une API pour les abonnés suivants, notamment en envoyant des demandes
à des comptes privés, en envoyant des e-mails depuis
notre application. Nous créerons également des API pour les publications avec des likes et des commentaires. Ensuite, nous créerons une
API pour le chat, le chat
personnel et le chat de groupe. De plus, nous appliquerons des
expériences de chat en temps
réel avec socket
et bien d'autres choses encore. Si vous comprenez
et développez vraiment ce projet, votre portefeuille
s'améliorera vraiment. Ça va être
amusant. Tu es excitée ? Je suis vraiment excitée
et j'espère que vous l'êtes aussi. Commençons donc à construire
ce projet incroyable.
155. Configurer le projet 03: Configurons maintenant
notre nouveau projet. Donc, dans le dossier des projets, je crée un nouveau dossier
appelé notre Linky File Maintenant, ouvrons ce
dossier dans le code VS. Bien. Dans le terminal, nous écrivons NPM en Y pour l'initialisation et pour la
création du package Créons également un fichier
index dogs, qui est notre fichier principal. Maintenant, comme nous le savons, nous allons configurer notre application dans ce fichier. Et pour cela, nous avons
besoin de certains packages. Dans le terminal, nous
écrivons donc NPM, install,
Express, Mongos pour Mongo DB, cours pour activer le cours De plus, nous ajoutons Dt NV, nous en avons besoin et appuyons sur Entrée Cela va prendre un certain
temps. Bien. Maintenant, configurons rapidement notre application. Tout d'abord, Const Express est équivalent à require from Express Après cela, st app est égal à, ici nous appelons Express
pour écouter cette application, nous ajoutons ici le point LISN. Ici, au premier argument, nous devons passer le port. Après l'application const, nous définissons qu'
un autre port de const est égal à traiter un nouveau port point ou 3 000
ou 5 000, comme vous le souhaitez Lors de la production,
notre application prendra le port de
la variable de port ENV Au deuxième argument,
nous devons transmettre
la fonction de rappel qui consiste
simplement à enregistrer les points de la console Dans ce cas, le serveur
fonctionne sur un port, et nous imprimons ici notre port port
dollar calibracets Nous devons également ajouter
des intergiciels d'applications. Au sommet, le cours est
égal à un cours obligatoire. Et ici nous ajoutons app point g, appelez
simplement ici le cours. Ensuite, pour
transmettre des données en JSON, nous utilisons app.us, express point JSON Sans ce
middleware, nous ne pouvons pas obtenir de données dans la
requête du corps Voyons maintenant cette
implémentation. Regardez les modifications et
dans le terminal, nodemon index point js C, le serveur est en cours d'exécution. Génial. Maintenant, connectons également cette application à la base
de données. Pour cela, nous avons besoin de mangues. Donc, au sommet, le coût des mangues est
égal à celui que l'on exige de la mangouste Maintenant, après cette variable, nous ajoutons Mongoose point connect Ici, nous devons transmettre la chaîne de connexion
de notre base de données. Auparavant, on
passait directement le fil ici, mais c'est peu risqué. Faisons en sorte que ce soit sûr. Dans notre projet, nous créons
un nouveau fichier appelé point ENV. Dans ce fichier, nous créons
une nouvelle variable appelée
DvES equal do, Mongo DB, column,
double for slash, local host,
column 27017, column 27017, qui est notre chaîne de connexion
Mongo B locale Vous pouvez l'obtenir à partir de
la boussole Mongo Divi, et ensuite, moins transférer. Et ici, nous saisissons le nom de notre
projet, notre Slinky Pi. Maintenant, pour utiliser cette variable d'
environnement, nous devons configurer D E et
V. Ainsi, dans le fichier d'index Gs, tout en haut, nous avons besoin de la configuration
point Env point config Dans la
méthode mangos point Connect, que ferons-nous passer ? Bien, nous passons le processus
point w point d. Nous
pouvons voir à quel point
cela devient simple après avoir simplement créé des applications à un ou
deux nœuds. Cela
s'améliorera progressivement et vous serez plus à
l'aise avec le nœud. Maintenant, comme nous le savons, cette connexion par points mangos
renvoie une promesse, nous devons
donc gérer
cette promesse Point puis méthode, fonction de
rappel, et ici nous
consultons simplement le journal des points, Mango Div s'est connecté
avec succès. Ensuite, après cette méthode, nous ajoutons une méthode de capture pour
gérer le rejet des promesses, et nous obtenons ici une erreur, une fonction
d'erreur, et
nous enregistrons les points de la console, connexion
Mongo Di a échoué et nous respectons simplement cette erreur Nous allons également vérifier
cette implémentation. Enregistrez ce fichier, et
dans le terminal, voyez, Mongo Di
B est connecté avec succès Pour le moment, c'est bon. Nous ajouterons Winston et Lager à la toute fin de ce
projet selon nos besoins Dans la leçon suivante, nous allons créer notre modèle utilisateur.
156. Créer un modèle utilisateur: C'est maintenant l'heure de faire de l'exercice. Il s'agit donc
d'un petit échantillon de document utilisateur. Sur cette base, vous devez
créer un schéma utilisateur. Vous pouvez également consulter le code du projet
précédent. Ne t'inquiète pas pour ça. Passez donc un peu de temps à
terminer cet exercice. Et après cela,
observez la solution. Voyons maintenant la solution. Dans notre projet, nous créons
un nouveau dossier appelé models, dans lequel nous
créons un nouveau fichier appelé users point js. Bien. Maintenant, tout d'abord,
nous importons le coût, mangues sont égales à ce que l'on
exige des mangues Ensuite, nous définissons const, schéma
utilisateur est égal au nouveau schéma de points mangos et nous passons ici le
schéma dans l'objet Maintenant, tout d'abord, pour
notre application de réseau social, nous avons besoin du nom d'utilisateur pour objet, type, chaîne
requise, vrai. De plus, nous ne voulons pas d'
espaces blancs dans le nom d'utilisateur. Pour cela, nous passons
stream à true. Indiquez également une longueur maximale de trois, et une longueur maximale, disons 30 ou 40, selon ce que
vous voulez prendre. Après le nom d'utilisateur, nous ajoutons l'e-mail
à l'objet, le type à la chaîne, obligatoire à vrai, l'
unique à vrai, rêve à la réalité, car nous n'avons pas
besoin d'espace dans le courrier électronique également. Et nous convertissons toujours
nos e-mails en minuscules, donc les minuscules en vraies également Après cela, nous avons besoin d'un
mot de passe pour objecter, type pour une chaîne et d'un
obligatoire pour vrai. Nous voulons également stocker certains détails du
profil de l'utilisateur, et ces détails que l'utilisateur peut ajouter à partir de paramètres tels qu'Instagram. Cela ne devrait pas être obligatoire. Nous pouvons donc obtenir un nom de
profil simple, qui est du type à la chaîne, et nous n'avons pas besoin qu'il soit unique ni obligatoire Nous n'ajoutons
donc
aucun validateur ici Maintenant, bio dans objet,
tapez dans chaîne. Et la longueur maximale est de 150. Ensuite, nous ajoutons les comptes, le statut, type à la chaîne, euh, au tableau. Ici, nous transmettons des valeurs, active, suivante, désactive et courbée. Nous avons défini la valeur par défaut sur Active. Ensuite, ce que nous pouvons ajouter est vérifié comme objet, saisi en bullian et valeur
par défaut en faux Ensuite,
nous ajoutons is private,
object, type à bullian
et default à false Ensuite, l'utilisateur peut ajouter le
type de genre à la chaîne, euh au tableau, et ici nous passons un homme, une femme, non binaire, ou l'utilisateur peut
dire préférer ne pas le dire. Ensuite, nous prenons également le numéro de
téléphone pour l'objet, type pour la chaîne, car l'utilisateur
peut y ajouter le code du pays. Et ici, nous arrivons également à la réalité. Maintenant, ce que nous pouvons ajouter, je pense que
c'est suffisant pour le moment. Si, à l'avenir, nous avons
besoin de plus de détails, nous
pourrons ajouter d'autres
champs à l'avenir. Voici notre schéma. Créons maintenant un modèle d'utilisateurs. Le coût par utilisateur est donc égal
au modèle à points de Mongo. Ici, nous passons un
nom singulier, qui est user. Ensuite, nous passons le schéma, qui est le schéma utilisateur. Maintenant, pour interagir avec
ce modèle utilisateur, nous devons l'exporter. Les exportations de modules sont donc
égales à user and done. Dans la
leçon suivante, nous allons créer API pour enregistrer un nouvel utilisateur.
157. Enregistrement d'un nouvel utilisateur: Créons notre premier
EPI pour cette application. Ici, nous créons un nouveau
dossier appelé Routes, et à l'intérieur de ce dossier, nous créons un nouveau fichier
appelé users point js. Bien. Maintenant, tout d'abord, nous devons créer un routeur. We import Express est
égal à require Express, et après cela, cost Router est égal à express point Router. À la fin, nous modulons simplement que point exports est égal à Router. Ajoutons maintenant cette route dans
notre fichier d'index principal point js. Après ces entrées, nous le coût des itinéraires utilisateur
égal à require. Nous passons ici au
dossier Routes slash users. Maintenant, après les intergiciels, nous ajoutons app point U. Ici, en première position, nous ajoutons un préfixe Donc, supprimez l'utilisateur de l'API. Et ici, nous
ajoutons simplement des itinéraires utilisateur. Créons maintenant une API d'inscription. Revenons donc au fichier de routage des utilisateurs. Ici, nous ajoutons un point sur le routeur
et un point sur une barre oblique, puis une fonction de rappel asynchrone avec demande Maintenant, tout d'abord,
nous devons obtenir des réponses à la
demande du corps. Mais la question est de savoir quelles sont les réponses dont
nous avons besoin pour enregistrer
un nouvel utilisateur. Ainsi, pour les
applications de réseaux sociaux, les entreprises
utilisent généralement un minimum de données pour enregistrer un nouvel utilisateur. Parce que si nous prenons dix à 15 remplissages comme première
étape du processus, peu de personnes créeront un compte sur notre application de
réseau social. Il est donc préférable de ne prendre que les données
requises pour notre schéma. En outre, l'utilisateur peut facilement
remplir ces informations, et c'est pourquoi, si vous remarquez, presque toutes les
applications de réseaux sociaux ne prennent que le nom, identifiant
e-mail de l'
utilisateur et le mot de passe. Seulement ces remplissages. Ils effectueront d'autres remplissages ultérieurement à partir
des paramètres utilisateur. C'est pourquoi l'ouverture d'un compte sur les applications
de réseaux
sociaux est très simple. Ici, nous ne prendrons que
trois remplissages de la part de l'utilisateur. L'objet de coût est égal
au corps du point de demande, et nous obtenons ici le
nom d'utilisateur, l'e-mail et le mot de passe. Maintenant, si nous n'
obtenons pas ces remplissages, nous renvoyons une erreur. Donc, si le nom d'utilisateur n'est pas valide
ou si l'e-mail n'est pas disponible, ou si le mot de passe n'est pas disponible, nous renvoyons
une réponse avec le statut 400 et nous transmettons objet
Json avec un message d'erreur sans les champs de formulaire obligatoires. Ensuite, nous
passons également le succès aux chutes. Ce champ de réussite aidera le
front-end à afficher les erreurs. Maintenant, nous trouvons également ici que l'utilisateur est déjà disponible dans
notre base de données ou non. Const user est égal à un poids. Ici, nous ajoutons le modèle utilisateur, C, saisie
automatique
fonctionne point par point sur un objet. Et ici, nous avons besoin d'
un dollar ou d'un opérateur pour établir un tableau, et ici nous transmettons plusieurs
conditions dans des objets distincts. Notre première condition
est donc un nom d'utilisateur à nom d'utilisateur, et deuxièmement, un e-mail à un e-mail. Si l'une de ces
conditions est vraie, nous obtenons cet utilisateur. Nous passons donc ici à la condition. Si l'utilisateur est disponible, renvoyez la réponse avec code d'
état du message d'objet
Json à 400 points pour que nous passions la condition. Le nom d'utilisateur point est
égal à notre nom d'utilisateur. Si c'est vrai, point d'interrogation, nom d'utilisateur déjà utilisé, sinon l'e-mail est
déjà enregistré. Et après cela, nous
passons du succès aux échecs. Maintenant, si l'utilisateur n'est pas
déjà enregistré, il suffit de
créer un nouvel utilisateur. Le coût du nouvel utilisateur est donc
égal au coût du nouvel utilisateur. Ici, nous transmettons l'objet
utilisateur, le nom d'utilisateur à l'utilisateur, ou nous pouvons simplement supprimer cet e-mail à l'e-mail et le
mot de passe au mot de passe. Maintenant, comme nous le savons, nous ne transmettons pas ici le mot de passe en texte normal, nous devons le chiffrer Et pour cela, quel package
nous utilisons, essayez de vous en souvenir. Oui, c'est une crypte. Installez donc NPM,
cryptez et appuyez sur Entrée. Bien, minimisez le terminal, et dans notre
fichier de routes en haut, const, crypt équivaut
à require Maintenant, dans notre API, nous créons Cost het pass
is equal to await, nous créons des points s. Et ici,
au premier argument, nous devons transmettre notre mot de passe, et au deuxième argument, nous passons le
nombre de sel, qui est dix. Maintenant, nous pouvons simplement définir le
mot de passe sur st password. Et après cela, nous
pouvons simplement attendre un nouvel utilisateur point c. Que voulons-nous faire
après avoir créé un nouvel utilisateur ? Bien, nous générons un
jeton JWT pour cet utilisateur, et pour cela, nous avons besoin d'un package de jetons Web
JSN NPM installe donc le jeton Web JSON, au taux de 9,0 à
0,2, et appuie sur Entrée Bien. Réduisez maintenant
ce terminal et saisissons ce jeton
Web JSN en haut Sacst JWT équivaut à
requérir le bouton JSN. Maintenant, comme nous l'avons fait précédemment, nous créons une fonction pour
générer JSN WebTgon car nous avons également besoin que dans notre API de
connexion SacstGenerate, le
jeton soit égal à ici, nous obtenons données sous forme de fonction d'erreur de
paramètre Et dans ce cas, nous renvoyons simplement
le signe point JWT. Dans un premier temps, nous transmettons les données, puis nous devons
transmettre la clé secrète de JWT Donc, traitez le point, le point, le point, la touche de soulignement
JWT. Nous devons maintenant ajouter cette
variable clé dans notre fichier ENV. La clé de soulignement JWT est égale à ici, nous pouvons transmettre n'importe
quelle clé sécurisée Par exemple, clé de sécurité JWT. Ne l'utilisez pas pour la production. Je le passe au hasard. Vous devez créer
votre propre clé de sécurité. De plus, ici, je n'
ajoute pas d'expiration notre jeton, car pour les applications de réseaux
sociaux, l' expiration du
jeton n'est pas une bonne chose. Les utilisateurs souhaitent
accéder rapidement à notre site Web. Imaginez également que vous visitez Instagram tous les jours et que vous devez vous connecter tous les
jours. Si vous devez utiliser cette
application pendant longtemps, non. En tant que développeur, nous devons toujours penser du point de vue de l'
utilisateur. Maintenant, dans notre rappel de route d'API, nous avons simplement const token
égal à generate Ici, en bas, je supprime Typo du nom de
ma fonction Maintenant, dans notre fonction de génération de
jetons, nous devons transmettre les données de l'utilisateur que
nous voulons ajouter à
notre charge utile de jetons. Donc, Object, underscore ID vers le
nouvel utilisateur, point de soulignement, ID de soulignement, et nom d'utilisateur vers le
nouveau point, nom d'utilisateur Et à la fin, nous renvoyons simplement statut du point de
réponse à 01 pour le
nouveau point de création de données GSN, et nous transmettons directement ce jeton Maintenant, goûtons à cette API. Alors ouvre Postman. Ici, nous créons une nouvelle collection, collection vierge pour notre nouveau projet
appelé Our Linky Fi Et dans ce dossier, nous ajoutons un nouveau dossier
appelé users, et dans ce dossier,
nous ajoutons une nouvelle demande, appelée register, un nouvel utilisateur. Bien. Maintenant, tapez la requête pour publier et pointez sur SDDP, colonne double barre oblique vers l'hôte local,
colonne 3 000
slash API slash user Et envoyez la demande.
Vous voyez, ici nous obtenons une erreur, 500 ne peut pas déstructurer les remplissages
manquants Passons tous les formulaires à
remplir qui sont nécessaires. Sélectionnez body, raw, et
nous passons ici notre objet JSON. Nom d'utilisateur à coder,
souligner, bénir. Au fait, c'est mon pseudo
Instagram. Prochain e-mail pour coder sur
le gmail.com rouge. Enfin, nous envoyons le mot de passe 212-34-5678 et Vous voyez, ici, nous recevons un
jeton en guise de réponse. Et si nous consultons notre base de données, nous obtenons
ici notre base
de données liée, et dans la collection de l'utilisateur, voyez, nous obtenons
également de nouvelles données utilisateur De plus, nous obtenons que le statut du compte est
actif, vérifié et
privé, les deux sont faux. Nous avons défini toutes ces valeurs
par défaut dans notre schéma utilisateur. De plus, j'ai oublié d'
ajouter unique à vrai pour ce nom d'utilisateur
car ici nous voulons que ce nom d'utilisateur soit unique
pour tous nos utilisateurs.
158. Exercice - API de connexion utilisateur: Faisons maintenant un autre exercice. Dans cet exercice, vous devez
créer une API de connexion qui vérifiera le nom d'utilisateur
et le mot de passe de l'utilisateur. Nous l'avons déjà fait dans
notre projet précédent, mais je veux
que vous le fassiez vous-même. Vous pouvez voir ce code de
vérification du mot de passe, mais
vous devez créer vous-même le reste de l'API . Je sais que vous pouvez le faire, alors complétez cet exercice, puis quelle est la solution.
159. Solution - API de connexion utilisateur: J'espère que vous aurez terminé l'exercice
ou que vous essayerez de le résoudre. Voyons maintenant la solution. Donc routeur, point post et point pour slash se connectent Et ici, nous passons fonction
asynchrone avec
demande et réponse Maintenant, tout d'abord, dans
cette fonction de rappel, nous obtenons les données du corps
de la requête L'objet de coût est donc égal
au corps du point de demande. Et là, nous arrivons au
nom d'utilisateur et au mot de passe. Maintenant, nous pouvons passer la
condition si le nom d'utilisateur
n'est pas disponible ou le mot de passe n'
est pas disponible, puis nous renvoyons une erreur. Donc, renvoyez la réponse,
le statut, 400 Json. Ici, nous passons le
succès de l'objet à false et un message pour vous demander de fournir un
nom d'utilisateur et un mot de passe. Ensuite, nous trouverons l'utilisateur portant ce nom d'utilisateur. Le coût par utilisateur est égal à
await user point Fine one. Ici, dans l'objet, nous passons le nom d'utilisateur au nom d'utilisateur, ou nous pouvons également le supprimer. Maintenant, il est possible
que nous ne trouvions aucun utilisateur portant le nom d'utilisateur
donné. Si l'utilisateur n'est pas disponible, nous
renvoyons le statut du point de
réponse, objet Json à
400 points avec succès à false et le message
aux informations d'identification non valides. Maintenant, si nous avons trouvé l'utilisateur, nous devons comparer le mot de
passe à l'aide de la bibliothèque BCRP. Deuxièmement, un mot de passe valide
équivaut à wait, B crypt point compare abord, nous transmettons le mot de passe d'entrée, qui se trouve
dans le corps de la requête, et au deuxième argument, nous transmettons le mot de passe utilisateur point Nous passons simplement ici
une autre condition si le mot de passe valide est
faux ou non disponible, puis nous renvoyons
le code d'état 401, qui signifie jeton d'authentification non valide ou
manquant. De plus, nous envoyons un
objet Json avec succès à false et un message à des informations d'identification
non valides. Ici, si nous spécifiez un
mot de passe non correspondant, cela signifie que nous avons trouvé utilisateur et que le mot de passe ne
correspond pas. De plus, ici, je pense que
nous devons transmettre le même code de statut
pour l'utilisateur introuvable. Remplacez ce 400 par 401 et le message contient également des informations d'identification
non valides. Maintenant, si le mot de passe est vérifié
, nous pouvons générer un nouveau jeton et l'envoyer dans la réponse. Donc, const token est égal
à generate token. Ici, nous transmettons l'objet de données avec un soulignement à l'ID de soulignement du
point utilisateur et le nom d'
utilisateur au nom d'utilisateur du point d'utilisateur Enfin, le point de réponse Json
envoie ce jeton. C'est ça. Dégustons maintenant cette API. Dans le postier, nous créons une nouvelle demande appelée
Login a user Ici, nous sélectionnons la méthode SDTP
pour publier le point de terminaison sur SDTP, colonne double pour ou slash, hôte
local, colonne
3 000, API slash, user
slash login colonne double pour ou slash, hôte
local, colonne
3 000, API slash, slash user
slash login et envoyer la demande. voyez, ici nous obtenons une erreur, impossible de déstructurer le nom d'utilisateur de
la propriété Ici, nous devons
transmettre les données dans le corps. Sélectionnez le corps, brut, ici nous passons l'objet avec le
nom d'utilisateur au code, le bénis et le mot de passe au 12345678
et envoyons voyez, ici, nous recevons le message, informations d'identification
non valides parce que
je transmets un mauvais nom d'utilisateur. Je change mon nom d'utilisateur pour le code
original underscore bless, et j'envoie la demande voyez, ici nous obtenons le jeton, ce qui signifie que notre API
fonctionne bien.
160. Mettre en œuvre le jeton d'accès et le jeton de rafraîchissement [MISE À JOUR]: Maintenant, comme nous l'avons vu dans notre projet précédent sur l'
enregistrement et la connexion,
nous revenons aux jetons, 14 jetons d'accès, qui correspondent à une feuille de tri ou à une date d'expiration SOT, et un autre est un jeton d'actualisation, qui est un jeton à feuilles
longues ou à expiration longue. En bref, lorsque le
jeton d'accès expire, front end envoie
une demande à un point de terminaison, comme repress. Lors de la répression, nous vérifions
le jeton d'actualisation, puis nous renvoyons
un nouveau jeton d'accès Telle est la logique. Mettons-le maintenant rapidement en œuvre
dans notre troisième projet. Donc, en bas, nous avons la fonction de
génération de jetons. Nous pouvons le renommer
pour générer des jetons. Nous devons maintenant revenir aux jetons
à partir d'ici. Nous stockons donc ce premier jeton dans la variable appelée
excess token, puis nous le définissons ici
pour qu'il expire dans la propriété, disons 1 heure. En production, nous pouvons ajouter l'expiration excédentaire des jetons
à trois ou quatre heures. Mais
pour tester facilement cette application, je ne fixe pas de
date d'expiration pour les jetons excédentaires. Encore une fois, je vous le dis uniquement
pour les tests, afin que nous n'ayons pas besoin de générer un autre jeton excédentaire pour
nos prochaines API. Maintenant, dupliquez cette ligne, changez-la comme variable
pour actualiser le jeton, ta, nous la changeons en objet, l' soulignement en ID de soulignement de
point de données Et ici, nous ajoutons la scène d'expiration à 30 jours, car il s'agit enfin d'une application de réseau
social, nous transformons simplement un objet avec un accès et un jeton d'actualisation. De plus, nous avons défini une clé secrète
différente pour le jeton d'accès
et le jeton d'actualisation. Ce n'est pas nécessaire, mais
il vaut mieux le faire. fichier NV à la
place de la clé JWT, nous ajoutons un jeton d'accès, clé et après cela, nous définissons une autre variable, réprimons le jeton, la clé est
égale à notre Sauvegardez-le et revenez à
notre fichier de sortie utilisateur. Ici, nous changeons la
clé secrète en clé de jeton d'accès. Et pour le jeton d'actualisation, nous le changeons en
actualiser la clé de jeton. Maintenant, dans l'API de connexion, modifiez le
nom de cette fonction pour générer des jetons. À l'endroit où nous obtenons le jeton, nous obtenons l'objet et nous déstructurons le jeton
excédentaire et actualisons le
jeton à partir de cette fonction Bien. Maintenant, nous avons un
excédent dans la réponse. Pouvez-vous également
me dire ce que nous devons
faire avant d'envoyer le
jeton excédentaire dans la réponse ? C'est vrai. Nous devons stocker jeton d'
actualisation dans la collection de
l'utilisateur, puis vendre le jeton d'actualisation
dans le cookie SDTP uniquement Nous attendons donc le point
Bcrt s. Ici,
nous passons le jeton d'actualisation, nous passons le jeton d'actualisation virgule nous passons ici le sel à dix Cette expression renvoie le jeton. Nous le stockons donc dans une variable
appelée Nu the repres token. Après cela, le jeton user point
repress est
égal à New has repress token égal à New has repress Ensuite, nous devons attendre le point
C de l'utilisateur. Il ne nous reste plus qu'à définir un jeton d'
actualisation dans le
cookie pour nous souvenir de façon dont nous utilisons le cookie du point de réponse. Ici, nous transmettons le nom du cookie, qui est le jeton d'actualisation. Ici, nous ajoutons un jeton d'actualisation
et au troisième paramètre, nous devons transmettre l'objet
de configuration. Ici, la première propriété
est uniquement le SDDP, que nous avons
défini sur true, secure sur false, mais
assurez-vous que lors de la production,
vous Même site à suivre
pour le même domaine, mais actuellement, nous l'avons défini sur aucun, et enfin,
nous pouvons passer un message à 30
jours, 24 heures,
60 minutes, 60 secondes
, 1 000
millisecondes et c' nous pouvons passer un message à 30
jours, 24 heures 60 minutes, 60 secondes 1 000
millisecondes Nous devons maintenant simplement copier cette logique de la
génération du jeton à l'envoi réponse et la
coller ici dans cette API. Et ici, nous devons remplacer uniquement l'identifiant de soulignement par point utilisateur par le nouvel identifiant de soulignement par point utilisateur, nouveau
nom d'utilisateur point, le nouvel utilisateur, jeton d'actualisation par
points et
également par Nwuser Enfin, dans la réponse, nous ajoutons également le statut à 201.
161. Route de rafraîchissement et de déconnexion [MISE À JOUR]: Maintenant, créons une
route pour l'actualisation, donc Route point post slash refresh et ajoutons ici fonction de rappel
ASN avec
demande Maintenant, tout d'abord, nous devons
obtenir un jeton
d'actualisation à partir du cookie. jeton d'actualisation de l'utilisateur const est donc égal à request point Cookie,
point refresh token Ici, nous n'obtenons pas ce cookie car dans
notre middleware Express,
nous n'avons pas utilisé le middleware DDT Cookie Parser
, et pour cela, nous
avons besoin d'un
package d'analyseur de cookies, d'un terminal ouvert, et ici nous écrivons l'analyseur de cookies
NPM install Cookies
et appuyons ce cookie car dans
notre middleware Express,
nous n'avons pas utilisé le middleware DDT Cookie Parser
, et pour cela, nous
avons besoin d'un
package d'analyseur de cookies, d'un terminal ouvert, et ici nous écrivons l'analyseur de cookies
NPM install Cookies
et appuyons sur Entrée. Bien. Ouvrez maintenant le fichier
index point gs. En haut, nous saisissons const Cookie parser qui est égal à
require Cookie En bas, nous ajoutons app
point g, Cookie parser. Assurez-vous d'appeler
cette fonction ici. Enregistrez ce fichier et
revenez à notre itinéraire. Ici, on passe la condition. Si le jeton d'actualisation de l'utilisateur n'
est pas disponible, nous renvoyons le statut du
point de réponse 401 point Json, et ici nous transmettons le message. Non, jeton d'actualisation fourni. Ensuite, nous avons besoin de l'ID utilisateur
qui envoie la demande de
jeton d'accès et comment nous allons l'obtenir
à partir du jeton d'actualisation, nous devons décoder
ce jeton d'actualisation Le coût utilisateur décodé est égal au point
JWT. Vérifiez ici nous transmettons le
jeton d'actualisation de l'utilisateur, puis que nous
transmettons la clé
secrète d'actualisation, point de traitement, point ENV, jeton d'actualisation Maintenant, cette expression peut
renvoyer une erreur, alors nous l'ajoutons ici, essayons et gatchblog déplace simplement
cette ligne dans le blog sec. Et dans le blog sur le cache, nous renvoyons le statut 403 du
point de réponse, 44 points PDN, JSON, et nous transmettons votre message
à un jeton d'actualisation non valide De plus, comme nous le savons, lorsque nous définissons un coût d'utilisation
variable, celui-ci ne sera accessible que dans
ce blog sec. Il faut donc le définir
avant de passer au blog sec. Et éliminez les coûts à partir de là. Maintenant, après cela, le coût utilisateur
est égal à un poids, point
utilisateur fin BYD Et ici, nous passons un identifiant de soulignement par point
utilisateur décodé. Et puis si l'utilisateur n'
est pas disponible, nous
renvoyons le statut du
point de réponse 404 point Json. Et ici, nous ajoutons la
propriété du message à l'utilisateur introuvable. Maintenant, si nous trouvons un utilisateur, nous devons comparer les jetons, et pour cela, nous
utilisons simplement le package BCRP Alors attendez, comparez les points BCRP. Nous transmettons le jeton d'actualisation utilisateur
, que nous obtenons du cookie et comparons au jeton d'actualisation par
point utilisateur. Cette expression renvoie le
résultat de la comparaison. La seconde est valide. Et là aussi, nous passons une autre condition I
is valid is false, puis nous renvoyons à nouveau le point de
réponse status 403
point Json avec un message pour
actualiser le jeton n'est pas valide. Maintenant, si les jetons sont
valides, que ferons-nous ? Nous allons créer de nouveaux jetons, stocker le jeton d'actualisation dans
la collection de l'utilisateur, définir le jeton d'actualisation dans
le cookie SDDPoly, puis renvoyer
le jeton excédentaire Nous avons déjà effectué ces étapes dans l'API d'enregistrement et de connexion. Copiez l'API, il suffit de le coller
pour l'actualiser et c'est fait. Définissons maintenant rapidement l'
API pour la déconnexion également. Ensuite, nous dégusterons ces
deux API ensemble. Itinéraire, fléchette, poteau,
barre oblique Déconnexion. N'oubliez pas que pour ce
projet en front-end, nous devons appuyer sur API
pour l'API slash, slash user, slash
refresh ou Logout point car nous les ajoutons
dans Ici, nous ajoutons un rappel ASN
avec demande et réponse. Maintenant, pouvez-vous me dire ce que nous
devons faire en cas de lock-out ? C'est vrai, c'est très simple. Nous devons supprimer le
jeton d'actualisation du cookie, puis nous
le retirons simplement de la collection de
l'utilisateur. De plus, en discutant avec vous
de la collection de l'utilisateur, je me souviens que nous n'avions pas ajouté jeton d'
actualisation dans
la collection de l'utilisateur. Faisons-le d'abord,
puis nous terminerons
cette procédure de verrouillage. Donc, le modèle d'un utilisateur,
et en bas, nous ajoutons un astken rempli à
l'objet, au type, à la chaîne Nous ne respectons pas les exigences,
car lorsque notre utilisateur se
verrouille, nous devons
supprimer l'astken Si nous ajoutons obligatoire, cela ne nous
permettra pas de le faire. est aussi simple que ça. Désormais,
dans l'API de déconnexion, tâche
de démarrage est très
similaire à l'API d'actualisation Par exemple, nous devons également
obtenir un jeton à partir du cookie, trouver le jeton d'actualisation de l'utilisateur, puis le rendre nul. Copions donc le code de
l'API d'actualisation
et collons-le ici. Bien. Maintenant, vérifions
ce code depuis le début. C'est une bonne chose. C'est également
bon jusqu'à ce que nous obtenions l'utilisateur. Ici, nous n'avons pas besoin de créer des jetons, nous pouvons donc les supprimer. De plus, nous n'avons pas besoin
de le définir comme jeton, nous pouvons
donc supprimer cette ligne, puis nous stockons la
valeur null dans le jeton de répression. Maintenant, sur le lieu de réponse, dart Cookie, nous utilisons un cookie de
réponse, point clear Dans un premier temps, nous transmettons le nom du
cookie, qui est correct. Ensuite,
nous n'avons pas besoin de
transmettre cette variable de
jeton d'actualisation, mais nous avons besoin de cet objet de
configuration, et enfin, nous renvoyons simplement le message au
lieu du jeton d'accès, verrouillé
avec succès et terminé. Maintenant,
testons rapidement ces API. Donc, un postier dans
le dossier de l'utilisateur crée une nouvelle demande
appelée repress access token. Nous avons besoin d'une demande de courrier. Pointez sur SDD P, double
barre oblique en
colonne, hôte local Colonne 3 000, slash APIs user, slash repress et
send the request voyez, ici, nous obtenons une erreur
car nous n'avons pas de cookie Accédez à Login Route, envoyez la demande
avec les informations d'écriture. Vous voyez ici que nous obtenons un jeton et que le jeton de répression
est défini sur Cookie Revenons maintenant à l'API repress, envoyez à nouveau la demande. voyez, nous avons ici le
nouveau jeton. Génial. Essayons maintenant l'API Logout. Il suffit de dupliquer ce modèle de
demande et nous modifierons le nom de la demande pour déconnecter un utilisateur, et nous modifierons également le point de
terminaison de l'API pour supprimer l'utilisateur, couper la session et
envoyer voyez, nous recevons un message de confirmation, et si nous vérifions le cookie, vous
voyez, ici nous ne
recevons pas de jeton d'actualisation, les deux API fonctionnent bien. Je tiens également à vous dire cette
leçon actuelle et précédente sont des leçons mises à jour. Si à l'avenir, vous ne
voyez pas ce code dans mon enregistrement d'
écran, ne
vous inquiétez pas, vous pouvez absolument suivre ces leçons. Je veux juste que les cours soient
aussi à jour que possible. Vous découvrirez également les
meilleures pratiques actuelles pour Node jazz.
162. Détails de l'utilisateur actuellement connecté Details: Créons une autre API pour envoyer les informations
des utilisateurs connectés. Nous ajoutons donc ici un autre
point de routeur Get point to forward slash et passons simplement ici fonction de rappel
ASN avec
demande Bien. Désormais, dans cette fonction, cost user est égal à
await user point find By ID. Et ici, nous transmettons simplement le nom d'utilisateur. Mais comment pouvons-nous obtenir cet identifiant ? Oui, nous devons extraire
cet identifiant du jeton JWT. Et pour cela, nous devons
créer Osmddalware. Pour l'instant, nous complétons cette API, puis nous
ajouterons Othmidalware Ici, nous transmettons l'identifiant
request point user point underscore. Maintenant, nous ne voulons pas envoyer de
mot de passe avec ces données. Nous ajoutons ici la méthode de sélection par points, et dans la chaîne, nous
ajoutons le mot de passe négatif. , si nous
n'obtenons pas l'utilisateur, Ensuite, si nous
n'obtenons pas l'utilisateur, nous passons la condition I, l'utilisateur n'est pas disponible, puis nous renvoyons le
point de réponse 404. Transmettez également le point GSN Object avec succès aux chutes et le
message à l'utilisateur, introuvable Si nous avons trouvé l'utilisateur, nous le renvoyons simplement
en réponse au point Json user. Maintenant, de nombreux étudiants pourraient se demander pouvons-nous voir le code des projets
précédents lorsque nous l'appliquons
dans notre nouveau projet ? Oui, bien sûr, vous
pouvez voir ce code. Réfléchissez simplement, y a-t-il quelque chose que vous pouvez
améliorer dans ce code ? Si oui, alors améliorez-le, et si non, restez
avec ce code. Il n'y a rien de
mal à cela. Créons un intergiciel pour le système d'exploitation. Dans notre projet, nous créons donc un nouveau dossier appelé middleware Et dans ce dossier, nous créons un nouveau fichier intergiciel
appelé oth point js Maintenant, tout d'abord,
nous créons ici une fonction appelée OT et nous savons qu'il s'
agit d'une fonction middleware Nous allons donc obtenir ici
trois paramètres, demande, réponse et suivant. Maintenant, dans cette fonction, nous
obtenons d'abord un jeton à partir de
l'en-tête de la requête. Vous souvenez-vous dans quel en-tête notre interface va
transmettre le jeton ? Écrivez dans l'en-tête
d'autorisation, l'en-tête SecondsTo est égal à l' point des en-têtes de
demande Après cela, nous vérifions
l'état. Si l'en-tête d'authentification n'est pas disponible ou si les deux points d'en-tête
commencent par here dans les codes, nous passons l'espace Barr. Si ce n'est pas le cas, nous renvoyons une erreur. Donc, renvoyez la réponse, le point status 401 pour un objet
Json non autorisé, succès à forcer, et un message d'autorisation,
jeton requis. Maintenant, si nous obtenons les deux
en-têtes, nous devons extraire notre
jeton de cet en-tête. Le jeton de coût est donc égal à
la méthode du fractionnement par points d'en-tête, dans les codes, nous passons le rythme, et ici nous avons besoin du deuxième élément, donc du crochet, de l'index un. Nous l'avons déjà vu dans
le projet précédent. C'est vrai. Nous avons donc maintenant un jeton. La seule chose à faire est que nous
devons vérifier le jeton et définir les données de nos utilisateurs
dans request point user. L'utilisateur décodé Secct est
égal à JWT point Verify. Ici, nous passons d'abord notre jeton, que nous obtenons de l'en-tête. Et puis dans le deuxième argument, nous passons le point de soulignement du point de processus EV
point JWT Nous pouvons simplement définir cette
variable en tant que request point user. L'utilisateur du point de requête est
égal à l'utilisateur décodé, puis nous appelons la fonction suivante C'est la chose la plus importante. Et si nous n'
obtenons pas cet utilisateur décodé ? Si nous ne gérons pas
cela, nous aurons une erreur. Nous gérons donc cela avec le bloc
try and catch. Ici, nous essayons le bloc de cache et déplaçons
simplement ces trois
lignes dans le bloc d'essai. Dans le bloc de cache, nous renvoyons simplement réponse,
point status, 401, point Json, Object, le succès à faux et le message au jeton
non valide. Et c'est fait. Exportons maintenant cette fonction. Le module dot exports
est donc égal à OT. Revenons maintenant à l'itinéraire de nos utilisateurs. Ici, dans notre GIPI, nous ajoutons les deux intergiciels,
voir l' entrée fonctionne Sympa. Maintenant, goûtons ça. Ainsi, lorsque Postman, nous
ajoutons ici une nouvelle demande appelée
current locked in
user point to SJDP, Column double four
slash Local host, Column 3,000 API slash
user et voyez, ici nous obtenons une erreur, jeton
d'autorisation est requis. Ainsi, à partir de l'appel d'API précédent, nous copions ce jeton JWT, et dans notre
API actuelle, nous passons aux en-têtes Ici, nous ajoutons un en-tête
d'autorisation. Valorisez l'espace
Barr collez notre jeton
et envoyez la demande voyez, ici, je reçois un jeton non valide, mais pourquoi je transmets le jeton valide. Vérifie le terminal. Vous voyez, le serveur est également en cours d'exécution. Je pense qu'une erreur se produit
dans le bloc dry et le bloc cache. C'est pourquoi mon serveur
fonctionne toujours. Ici, dans le bloc de cache, nous ajoutons cette erreur
à la console. Définissez les modifications et
envoyez à nouveau la demande. Revenons maintenant au code VS,
revenons au terminal, et là nous obtenons une erreur, JWT n'est pas défini Oh, j'ai oublié d'importer JWT depuis le package de jetons
Web JSON Ainsi, en haut de la configuration, JWT est égal au jeton Web JSN
requis Vous pouvez voir que c'est ainsi que
nous pouvons résoudre les erreurs. Ne paniquez pas si des erreurs
apparaissent dans votre code. Essayez de le résoudre étape par étape. Si de nombreuses erreurs se produisent, nous pouvons en
apprendre davantage sur nos erreurs et ainsi
améliorer notre code. Ne vous inquiétez donc pas pour les erreurs. Regardez les modifications et jetez-y un coup d'œil. Vous voyez, ici, nous obtenons les
détails d'utilisation sans mot de passe.
163. Réinitialiser le mot de passe utilisateur: Implémentons maintenant la fonctionnalité
de réinitialisation du mot de passe dans
notre application. Commençons par comprendre l'
aperçu de cette fonctionnalité. Ainsi, lorsque l'utilisateur
saisit son e-mail et clique sur
le bouton de réinitialisation du mot de passe, nous appellerons notre première demande d'
API Password Reset. Maintenant, cette API va
générer un nouveau jeton et envoyer une URL avec ce
jeton sur leur e-mail. Lorsque les utilisateurs
cliquent sur le lien de ce site Web, nous prenons le nouveau
mot de passe de l'utilisateur, et lorsque les utilisateurs cliquent sur Soumettre, nous appelons notre deuxième mot de passe de réinitialisation de
l'API. Dans cette API, nous vérifierons ce jeton et mettrons à jour le nouveau mot de passe dans
le document utilisateur. Si tout fonctionne correctement, nous
vous renverrons le message, mot de passe, réinitialisé avec succès. Ici, nous devons
créer deux API, demander la réinitialisation du mot de passe
et réinitialiser le mot de passe. Commençons donc par
créer la première API, afin que le routeur ne poste le point de terminaison
pour demander le mot de passe Ds, D reset, et nous ajoutons également fonction de rappel
ASN avec
demande et réponse Nous n'
ajoutons donc pas de logiciel orthomidal car nous voulons que tout le monde
puisse réinitialiser son mot Ils réinitialisent leur mot de passe
parce que dans 99 % des cas, ils ont oublié leur mot de passe et ne peuvent
donc pas se connecter.
C'est pourquoi nous n'ajoutons pas
ici d'orthomidalware Maintenant, tout d'abord, nous recevons un e-mail utilisateur à partir du corps de
la demande. Le deuxième objet est égal
au corps du point de demande. Et ici, nous recevons l'e-mail. Maintenant, en utilisant cet e-mail, vérifions d'abord si l'utilisateur
est disponible ou non. Donc const user est égal à
await user point Fine one. Et ici, nous passons
un objet de comparaison avec un e-mail à un autre. Ensuite, nous passons la condition. Si l'utilisateur n'est pas disponible, nous renvoyons une réponse
dont le code d'état 404 points Json Object tombe
avec succès
et le message 2, cet e-mail n'est pas enregistré, ou nous pouvons également transmettre
l'utilisateur introuvable. Cela dépend entièrement de vous. Maintenant, si l'utilisateur est
disponible, que ferons-nous ? Bien, nous allons générer un jeton. Le coût et le jeton de réinitialisation sont donc
égaux au point sinus JWT. Tout d'abord, nous transmettons nos
données, donc object, underscore ID à user
point underscore Et au deuxième paramètre, nous passons la touche JWT, donc process point Env point
JWT Et également au troisième argument, nous passons l'objet avec des
expirations dans la propriété à 1 heure parce que nous voulons
ici ajouter ces
expirations dans la propriété, et c'est pourquoi nous n'utilisons pas
here generate pour Nous avons réinitialisé le jeton.
Maintenant, nous voulons simplement l'envoyer à l'adresse e-mail de notre utilisateur. L'envoi d'
un e-mail étant une logique distincte, nous
ne l'implémentons pas actuellement. Tout d'abord, nous créons
nos deux API de réinitialisation afin de ne pas vous embrouiller. Nous écrivons donc ici
un commentaire pour l'envoi d' un e-mail, puis
renvoyons simplement la réponse Json. Ici, nous passons l'objet
avec la propriété du message, réinitialisation du
mot de passe,
le lien, l'envoi par e-mail. Et après cela, nous passons également un jeton de
réinitialisation à un autre. Envoi de ce jeton de réinitialisation en réponse car nous
n'envoyons pas encore d'e-mail. C'est juste pour tester. Après avoir envoyé un e-mail,
nous n'avons pas besoin de transmettre le jeton de réinitialisation
dans la réponse. Définissons maintenant notre
deuxième API dans laquelle nous
allons vérifier ce jeton de réinitialisation
et enregistrer le nouveau mot de passe. Donc, le routeur point et point
pour réinitialiser le mot de passe. Et ici, nous ajoutons une fonction de rappel ASN avec
demande et réponse Tout d'abord, nous obtenons des informations à
partir du corps de la demande. L'objet Const est donc égal
au corps du point de requête, et ici nous déstructurons le jeton de
réinitialisation et nous obtenons également le nouveau mot de passe que l'
utilisateur souhaite mettre à jour Ici, nous devons
effectuer deux étapes. Étape 1, vérifier le jeton, et étape 2, si le
jeton est vérifié, mettre à
jour le mot de passe.
C'est aussi simple que ça. Donc, pour vérifier le jeton, nous pouvons utiliser JWT point Verify Dans un premier temps, nous passons
notre jeton de réinitialisation. Le deuxième argument,
nous devons ajouter notre clé JWT process point ENV
point JWT Maintenant, cette expression nous
donnera aux utilisateurs les données que nous transmettons
lorsque nous générons ce jeton. Voir ici en haut,
nous passons l' identifiant du soulignement à l'identifiant du point de soulignement de
l'utilisateur Nous stockons cela dans une variable
appelée utilisateur décodé. Nous trouvons maintenant l'utilisateur utilisant cet identifiant de
soulignement, puis nous
mettons à jour le mot de passe Let user est égal à wait
user point find by ID. Et ici, nous passons un identifiant de soulignement par point
utilisateur décodé. Maintenant, après cela, nous
passons la condition. Si l'utilisateur n'est pas disponible, nous
renvoyons la réponse avec code d'
état de 400 points
Json Object avec succès à false et le message
à un jeton non valide ou expiré. Maintenant, si nous obtenons l'utilisateur, nous
mettrons simplement
à jour le mot de passe. Ici, pour le mot de passe, nous devons
d'abord avoir ce mot de passe. Nous ne pouvons pas le stocker tel quel. Attendez, crypt point
a ici, d'abord, nous passons un nouveau mot de passe, et au deuxième argument, nous passons le Salt, qui est dix Cela générera un mot de passe, afin
que nous puissions le stocker directement dans le mot de passe utilisateur point, et en dessous, nous
attendons simplement le CV de l'utilisateur point point. Enfin, nous renvoyons simplement objet Json à point de
réponse
avec la propriété du message, mot de passe est réinitialisé avec succès,
et c'est tout. Dans la première API, nous générons le jeton de réinitialisation et l'
envoyons par e-mail, et dans la seconde API, l'utilisateur nous
renverra ce jeton de réinitialisation et nous le
vérifierons. S'il est vérifié, qu'alors que nous
mettrons à jour ce mot de passe. En ce qui concerne la vérification des jetons, nous avons peu de problèmes de sécurité. Ici, nous ne faisons que vérifier
le jeton à l'aide de JWTKey, mais ce n'est pas très sécurisé Laissez-moi vous expliquer à l'
aide d'un exemple simple. Supposons que les utilisateurs envoient des
demandes de réinitialisation du mot de passe. Dans le back-end, nous générons un jeton de réinitialisation et l'
envoyons à l'utilisateur. Cela peut maintenant arriver, l'utilisateur peut à nouveau envoyer la
demande de réinitialisation du mot de passe, et nous lui envoyons à nouveau le nouveau jeton de
réinitialisation. Maintenant, ce sont deux
jetons qui sont validés pour réinitialiser
le mot de passe Supposons que l'utilisateur passe
le deuxième jeton et change le mot de passe. Maintenant, que se passerait-il si les pirates informatiques
obtenaient ce premier
ancien jeton et changeaient le mot de passe à l'aide de
cet ancien jeton de réinitialisation ? Cette mise en œuvre
est peu risquée. Maintenant, quelle est la solution ici ? C'est vraiment simple. Lorsque nous générons
un jeton de réinitialisation dans notre première API
avant d'envoyer l'e-mail, nous le stockons
dans la collection de nos utilisateurs. Nous stockons également les dates d'
expiration et l'heure des jetons. Maintenant, lorsque nous vérifierons le jeton, nous comparerons le jeton de réinitialisation stocké avec le
jeton de réinitialisation de l'utilisateur. Si les deux correspondent et que le
jeton n'a pas expiré, nous mettrons à jour
le mot de passe. Selon cette approche uniquement, le dernier jeton de réinitialisation est valide et uniquement pour
les expirations et l'heure. Cette approche est
plus sûre que la précédente. Mettons donc cela en œuvre. Ici, avant d'envoyer un e-mail, nous écrivons que le jeton de réinitialisation par point
est égal au jeton de réinitialisation, et que le jeton de réinitialisation par point de l'utilisateur expire est égal
au point de date maintenant, en
plus, nous voulons
ajouter une heure d'expiration. Donc, 60 minutes et 60
secondes pour 1 000. Conversion des secondes
en millisecondes. Ensuite, nous pouvons attendre
l'utilisateur point c. Toujours en haut, nous convertissons cet
utilisateur const en at user Nous devons également ajouter ces deux remplissages dans le modèle de
notre utilisateur. Ainsi, lorsque vous utilisez Schema, ici, à la fin, nous ajoutons un jeton de réinitialisation à
un objet, un type à une chaîne ,
puis le jeton de réinitialisation
expire en objet
et en type à ce jour, enregistrons les modifications et
revenons à notre API de réinitialisation. la partie vérification, nous ajoutons condition si l'utilisateur n'
est pas disponible, ou si le jeton de réinitialisation des points de l'utilisateur
est égal au
jeton de réinitialisation ou si le jeton de
réinitialisation de l'utilisateur expire est inférieur ou égal
à date point now. Si l'une de ces
conditions est vraie, nous
retournerons le
jeton expiré et le jeton n'est pas vérifié. De plus, après avoir mis à jour
le mot de passe, nous devons rendre ces
deux remplissages nuls. Avant le point c de l'utilisateur, nous définissons la réinitialisation par point de l'utilisateur, jeton est égal à nul et le jeton de réinitialisation par l'utilisateur
expire est égal à zéro. C'est plus sûr. Si l'utilisateur réussit à réinitialiser le mot de passe, aucun jeton n'est
valide pour réinitialiser le mot de passe. Nous allons maintenant tester cette
implémentation. Dans le Postman, nous créons
une nouvelle demande appelée
request , reset password, method, to post point to SDDP,
Column double forward
slash local host, Column 3,000,
slash API, slash user,
slash request, user,
slash request Et dans le corps, passez à raw et nous passons
ici
un objet JN avec un e-mail. Assurez-vous que vous transmettez un e-mail
valide et que cet e-mail doit
également
figurer dans votre e-mail d'utilisateur. Sinon, l'
utilisateur sera introuvable. Si vous ne transmettez pas d'
e-mail valide dans les données de l'utilisateur, vous pouvez modifier cela à partir du mot de
passe Mongo Di Maintenant, envoyez la demande ici, je trouve Ken introuvable. Laissez-moi vérifier le point final. Oh, voilà la demande, il
y a le mot de passe, réinitialisons-le. Et dans mon terminal,
j'écris request,
let's reset, du mot de passe. Je change donc ce point de terminaison
et j'envoie cette demande. voyez, ici, nous obtenons un
jeton de réinitialisation, nous copions ce jeton, et nous devons créer
une nouvelle demande appelée méthode de
réinitialisation du mot de passe pour
publier un point de terminaison sur le SDDP, colonne double
barre oblique hôte local,
colonne 3 000, utilisateur de l'API slash, De plus, ici, nous devons passer le corps, l'objet
brut avec le jeton de réinitialisation, et coller ce jeton. Ensuite, nous passons
le nouveau mot de passe. 123-45-6789. Maintenant, envoyez la demande. Vous voyez, le mot de passe a été
réinitialisé avec succès. Les deux API fonctionnent donc. Maintenant, la seule chose que nous voulons
faire est d'envoyer ce jeton ou ce
lien de page de réinitialisation dans le courrier électronique de l'utilisateur, et nous le verrons
dans la prochaine leçon.
164. Moyens d'envoyer des e-mails dans Node JS: Il existe désormais de nombreuses façons d'
envoyer des e-mails à partir de l'application
node. La première consiste à utiliser le protocole SMTP, qui est un simple protocole de
transfert de courrier La deuxième méthode consiste
à utiliser l'API SendGrid, et la troisième consiste à utiliser Amazon SS, qui est un simple service de messagerie Voyons maintenant les avantages et les
inconvénients de chaque méthode, ce qui nous aidera à décider quel service de messagerie nous pouvons
utiliser pour notre application. SMTP fonctionne donc mieux pour les petites applications car
il est simple à configurer, nous ne devons transmettre que l'e-mail
et le mot de passe de notre compte, puis le SMTP enverra cet
e-mail depuis notre Mais le SMTP est un peu lent par rapport aux
autres services de messagerie De plus, avec le SMTP, nous ne
pouvons envoyer qu'un
nombre limité d'e-mails Par exemple, si nous utilisons Gmail, nous ne pouvons envoyer que
500 e-mails par jour. Si nous utilisons Yahoo, nous ne pouvons envoyer que
100 e-mails par jour. Le protocole SMTP n'est pas évolutif
pour les grandes entreprises. C'est bon pour les
petites applications. Passons maintenant à SNGrid. Dans SendGrid, nous
n'avons pas besoin de transmettre l' e-mail et le mot
de passe de notre compte Au lieu de cela, nous
devons générer APIKey et nous enverrons un e-mail à
l'aide de l'API SendGrids C'est donc rapide et fiable. Il est également facile à configurer. De nombreuses entreprises utilisent SendGrid pour envoyer
des e-mails en masse comme Uber, AirBnB, app, etc. Mais pour envoyer
un nombre illimité d'e-mails, nous devons acheter
son forfait payant. Passons maintenant à Amazon SES. Il s'agit du service de courrier électronique le plus fiable et le plus
sécurisé utilisé par les grandes entreprises comme
Netflix, LinkedIn, etc. Il est également très rapide. Nous pouvons envoyer des millions
de courriels par jour, et leur forfait payant est
moins cher que les plans Sandgrad, mais le seul inconvénient est qu'il
est un peu difficile à configurer Nous pouvons y arriver. Ici, nous pouvons clairement voir
que si nous avons besoin de rapidité, de sécurité et de faible coût
, nous pouvons utiliser Amazon SES. Dans la leçon suivante, nous allons donc implémenter Amazon SES
dans notre application.
165. Configurer Amazon SES pour l'envoi d'e-mails: Implémentons l'enquête par e-mail Amazon
Simple dans notre application de nœud. C'est vraiment simple. Je le
décompose en trois étapes. Première étape, configurez le SS
dans l'application du nœud. Deuxième étape, création
d'un compte Amazon SS et vérification de l'adresse e-mail pour les tests. Troisième étape, nous enverrons un e-mail de
test depuis notre API. Ici, je tiens à clarifier une chose pour configurer le compte
Amazon SS, nous avons besoin des détails de la carte de paiement
et des informations d'identité. Nous n'avons rien à payer, nous avons besoin des informations de carte. Ici, nous utiliserons une
version préliminaire d'Amazon SES. Donc, si vous n'
avez pas ces informations, vous pouvez sauter cette
leçon et vous pouvez appliquer gratuité de l'expéditeur de courrier électronique en utilisant le
protocole SMTP dans la leçon suivante Pour implémenter Amazon SES, nous devons installer le package AWS. Donc, installez NPM sur dit AWS SDK client Ss au taux de 3,738
0,0 Bien. Minimisez le terminal. Maintenant, dans notre projet, nous créons un nouveau dossier appelé Config
et dans ce dossier, nous créons un nouveau fichier
appelé Amazons point js Tout d'abord, nous devons
configurer le client SS
et pour cela, nous avons besoin de la méthode client SS. Donc, les crochets Const CL. Ici, nous obtenons que le client SS
est égal à requérir au taux que le client AWS SDK Ss. Après cela, const,
car client est égal à new as client et à l'intérieur de celui-ci, nous devons transmettre l'objet d'
initialisation Maintenant, la première propriété
de l'objet est la région. Ici, nous devons
passer par notre région. Nous allons stocker la
région dans le fichier ENV, nous ajoutons
donc ici le
point de processus ENV Aws Score Après cela, nous devons
transmettre la propriété des informations d'identification. Maintenant, c'est vraiment important. Sans cela, nous ne
pouvons pas envoyer d'e-mail. Ici, nous transmettons un objet
avec un identifiant de clé excédentaire, et nous devons également
transmettre une clé d'excédent secrète. Nous
obtiendrons ces deux propriétés lorsque nous créerons un compte sur Amazon
AWS. Ne t'inquiète pas. Nous avons d'abord configuré tout cela
dans notre application de nœud, puis nous allons créer un
nouveau compte sur Amazon Aws. Ici, nous passons également le point de
processus An point Aws, soulignement Xs, la touche de soulignement Pour le secret, nous passons
le processus point n point Aws, le trait de
soulignement, la clé de
soulignement secrète, et Il ne nous reste plus qu'à créer la fonction
Envoyer un e-mail et à
ajouter des remplissages d'e-mails. Const send email est donc
égal à la fonction flèche. Ici, avant d'oublier d'ajouter d'essai et un
bloc de cache, nous les ajoutons, et dans le cache,
nous avons simplement consigné les
points log de la console , Amazon, erreur SCS. Nous ajoutons ici cette erreur. Maintenant, écrivons notre
code dans le blog try. En cas de problème, notre bloc de cache
corrigera cette erreur. Maintenant, pour envoyer le courrier électronique, nous devons fournir certaines
informations provenant du courrier électronique, nous voulons envoyer un e-mail à
quel e-mail nous voulons envoyer, quel est le sujet, quel
est le corps, etc. Les paramètres de coût sont donc
égaux à l'objet. Ici, nous sommes d'abord une source, ici, nous devons transmettre notre adresse e-mail
vérifiée, que nous vérifierons sur
le site Web Amazon SS. Ne t'inquiète pas, n'écris
rien pour le moment. Laisse-le planifier. Assurez-vous d'écrire le nom de cette
propriété en majuscule, comme je l'ai écrit. Sinon, vous obtiendrez une erreur. Maintenant, après la source,
nous ajoutons la destination, ajoutons un objet avec une
propriété à l'adresse, et ici nous devons
transmettre un tableau d' e-mails à qui nous
voulons envoyer des e-mails Nous pouvons également envoyer des e-mails
à plusieurs utilisateurs. Maintenant, comment pouvons-nous obtenir cette
adresse e-mail dans cette fonction ? C'est vrai, d'après les paramètres. Nous en ajoutons donc deux
, à savoir l'adresse e-mail. Nous avons également besoin de
l'objet de l'e-mail et
du texte de l'e-mail. Maintenant, dans les deux adresses, nous ajoutons deux paramètres. Ici, si nous en avons plusieurs, nous pouvons également ajouter ces
identifiants de messagerie avec une virgule Maintenant, après la destination, nous ajoutons la
propriété du message à l'objet. Tout d'abord, nous ajoutons ici le sujet à l'objet
avec la propriété data, nous devons transmettre le sujet obtenu à partir du paramètre. Maintenant, après le sujet, nous
ajoutons le corps à l'objet, le texte à l'objet, et
à l'intérieur de ces données au texte, que nous obtenons à nouveau
à partir du paramètre. Je sais que c'est une syntaxe un
peu étrange, mais c'est ce que c'est. Nous devons suivre cela. Maintenant,
nos permanentes sont prêtes Nous pouvons maintenant créer une commande
pour ces perams. Const, command est égal à
New send email, command. Donc, la saisie automatique fonctionne, et ici nous passons simplement des paramètres Nous devons maintenant envoyer cette
commande pour envoyer l'e-mail. Donc, Ss client point SN, et ici nous passons la commande. Maintenant, comme nous le savons, l'envoi de l'
e-mail prendra un certain temps, ce sera
donc une tâche
asynchrone. Et pour cela, nous y adhérons et attendons. Et à cause de await, nous devons rendre cette
fonction asynchrone Faisons maintenant la réponse
dans la variable de réponse,
et à la fin, nous
ajoutons simplement le journal à points de la console, colonne d'identifiant du
message envoyé avec succès, et nous renvoyons ici l'identifiant du message point de
réponse. À la fin de ce fichier, nous modulons simplement point exports
is equal to send email. Assurez-vous de ne pas appeler
cette fonction ici. Il suffit de
transmettre la référence. De plus, ici, dans les sources, nous transmettons le point en
point Aws underscore, email, qui sera notre e-mail à partir duquel
nous voulons envoyer un e-mail Voilà, notre première
étape est terminée. Il suffit d'ajouter
ces trois variables dans le fichier ENV et de transmettre
également cet e-mail source Accédez au navigateur et
rendez-vous sur aws.amazon.com. Et ici, nous devons
créer un nouveau compte AWS. Ici, nous écrivons notre adresse
e-mail, et ici nous devons transmettre le nom de
notre compte AWS. Pour l'instant, passez n'importe quoi, nous pourrons le modifier ultérieurement
depuis les paramètres. Cliquez sur Vérifier l'adresse e-mail. Après cela, il vous
demandera un mot de passe, vous suffira de créer un mot de passe et continuer ici, nous voyons
comme un plan personnel, et nous devons également
transmettre nos coordonnées. J'écris rapidement mes coordonnées, j'accepte
et je continue. Maintenant, nous devons
transmettre les détails de la carte. Si vous n'avez pas les détails de
la carte ou si vous ne souhaitez pas
donner vos informations, vous pouvez implémenter le protocole SMTP car la plupart des étudiants
n'ont pas de carte Vous pouvez
donc implémenter le protocole SMTP, qui n'utilise que votre Je vais vous le montrer
dans la prochaine leçon. Pour l'instant, je transmets informations de
votre carte
, puis je vérifie et je continue. Cela permettra de traiter les
petits paiements tels que 1$ ou même moins pour la vérification de
votre carte. Je saisis donc ici mon paiement OTP cours de traitement et le paiement
est terminé Nous devons maintenant fournir une identité. Sélectionnez votre utilisation personnelle. Si vous souhaitez l'utiliser à des fins professionnelles, vous pouvez également le sélectionner. Ensuite, nous sélectionnons une personne, et ici nous devons
fournir un document d'identité. Je remplis donc rapidement ce formulaire télécharge
également mon document
et je clique sur Continuer. Vous trouverez ici des
informations supplémentaires à des fins de vérification. J'écris ici mon
numéro de téléphone et j'envoie des SMS. Si vous venez d'un
autre pays,
il se peut que vous obteniez un autre remplissage. Ici, je vérifie mon numéro
auprès d'OTP, puis je continue. Maintenant, nous venons de définir
ce plan gratuit de base, et enfin de terminer l'inscription. Accédez à l'AWS
Management Console Vous voyez, nous voici à la console. Tout d'abord, nous
vérifierons l'adresse e-mail de l'expéditeur. Donc, en haut, insérez des SE et
ouvrez cette page Amazon SS. Cliquez sur ces trois
lignes et accédez à
Identités pour vérifier
votre adresse e-mail ou votre domaine. Ici, nous devons
créer des identités. Maintenant, si vous souhaitez
l'utiliser pour la production, vous
devez vérifier
votre domaine ici. Mais maintenant, pour les tests, nous pouvons utiliser votre e-mail. Ici, nous écrivons l'
adresse e-mail à partir de laquelle nous voulons envoyer un e-mail aux utilisateurs et
cliquez sur Créer une identité. Vous voyez ici que la
vérification est en attente. Amazon a envoyé un e-mail à cet e-mail et nous
devons le vérifier. Alors voilà, j'ouvre cet e-mail. Cliquez sur ce lien,
vérifiez que la vérification est effectuée, et si nous actualisons cette page, nous serons également vérifiés. Nous devons donc copier
cet e-mail et dans notre application de nœud,
dans les sources, nous avons ajouté l'e-mail de soulignement AWS Ajoutons cette variable
dans le fichier ENV. e-mail de soulignement AWS est équivalent à celui où je transmets
mon e-mail vérifié Nous devons maintenant créer une clé d'accès et une clé secrète pour
notre application. Recherchez ici IAM, qui est la gestion des
identités et des accès. Ici, nous allons aux utilisateurs
et créons un nouvel utilisateur. Nous écrivons le nom d'utilisateur, disons, notre Linky Pi et cliquons sur Suivant Ici, nous devons joindre des
politiques, effectuer une recherche ici, sous forme de X complets et sélectionner la politique d'accès complet d'
Amazon SS, puis cliquer sur Suivant
et créer un utilisateur. Maintenant, pour générer
la clé d'accès, ouvrez cet utilisateur et accédez aux informations d'identification
de sécurité. Ici, nous n'avons aucune clé d'accès, nous créons
donc une clé, sélectionnons une
autre option, cliquez sur Suivant. Ici, il
demande une description, mais c'est facultatif, il suffit de créer une clé d'accès. voyez, ici nous obtenons une clé d'accès, et nous obtenons également une clé d'accès
secrète. Nous devons les ajouter
dans notre fichier ENV. Assurez-vous de télécharger
ce fichier CNV à points. Dans notre fichier ENV,
j'ajoute d'abord ici le nom de la variable,
AWS, le trait de soulignement Xs, touche de
soulignement est
égale pour copier la
touche aces depuis le navigateur et la
coller dans notre De plus, nous ajoutons une autre variable appelée AWS, underscore secret, underscore key is equal pour copier la
clé secrète depuis le navigateur et la coller ici Nous avons maintenant besoin d'une région. Dans le fichier ENV, nous ajoutons la région de soulignement
AWS. Maintenant, en oubliant la région ici sur le
côté gauche de notre profil, nous obtenons une liste des régions. Je viens d'Inde. C'est
pourquoi j'ai choisi Mumbai. Ma région sera AP South One. Ici, vous devez sélectionner le vôtre. Si vous ne vous en doutez pas, vous pouvez simplement
rechercher votre région sur Google et sélectionner
l'emplacement de
Neal J'ajoute cette
valeur de région dans le fichier NV. Maintenant, la deuxième étape est terminée. Donc, ce fichier, à moins que la fonction d'envoi de courrier électronique fonctionne ou non, ce qui
est notre troisième étape. Dans notre requête, des
resets password API, nous appellerons la fonction Send
Email
au premier argument pour
transmettre l'e-mail de l'utilisateur User point email virgule ici, nous écrivons l'objet de notre e-mail Définissons une nouvelle variable car sujet est égal
à la réinitialisation du mot de passe, demande de votre compte
Linkifi De plus, nous définissons le texte
que nous voulons envoyer dans les dernières cases,
cliquez sur ce lien. Réinitialisez votre mot de passe, SDDP Cool
et Double Forward Slash,
notre Linkify.com slash notre Linkify.com Dans le paramètre de requête, point d'
interrogation, reset tocan est égal à ici nous ajoutons des
paquets dollar curly, réinitialisons Cette URL est destinée à un
accès direct ou à une interface. Donc, Instagram est logique, non. Vous pouvez également modifier ce
texte en fonction de vos besoins, ou vous pouvez également transmettre le code STML dans le
corps de l'e-mail Juste dans les paramètres de l'e-mail
à la place de ce texte, nous devons passer le code STML Maintenant, dans la fonction Envoyer un e-mail, nous transmettons le sujet et le texte. Enregistrez les modifications, sauf si cette fonction d'
envoi
d'e-mail fonctionne ou non. Donc, un facteur, et voici une API de réinitialisation de mot de passe de
demande, qui est notre première
API de réinitialisation Maintenant, avant de l'appeler
, laissez-moi transmettre ici un e-mail
valide afin que je reçoive un
jeton de réinitialisation sur cet e-mail. Ici, je remplace mon e-mail par
l'un de mes faux e-mails, mets
à jour, et
je
transmets le même e-mail dans le corps du point de demande je
transmets le même e-mail dans le corps du Bien. Maintenant,
envoyons la demande. Vous voyez ici que nous n'avons
pas pu envoyer de demande. Désolé, j'ai oublié
de démarrer le serveur. Donc, l'index Nodemon marque Nice. Maintenant, envoyons la demande. Ici, je reçois que sendemail n'
est pas défini. J'ai oublié de le saisir. Donc, au sommet, le coût envoi d'un e-mail est égal à ce qui est requis. Ici, nous allons accéder
à un dossier, Config Amazon SCS. Sauvegardez-le et renvoyez
la demande. Encore une fois, j'ai une erreur. Ne paniquez pas. Vérifions-le. Il s'agit d'une erreur de validation. Comme nous le savons, nous venons de vérifier l'adresse e-mail de l'expéditeur sur Amazon SES, mais nous devons également vérifier l'e-mail du destinataire pour
tester la fonctionnalité d'e-mail. C'est la condition d' Amazon SES pour tester un compte
sandbox Si nous passons à la production
et au plan payant, nous enverrons un e-mail à n'importe qui sans
vérifier son adresse e-mail. Pour tester l'environnement, nous devons vérifier l'e-mail du
destinataire. Permettez-moi donc de vérifier quelle
adresse e-mail j'utilise pour compte
utilisateur dans le
Mongo DB Compass Tu vois, c'est un e-mail. Donc ici, je dois l'ajouter
dans notre identité d'utilisateur. Alors recherchez S comme ça. Accédez aux identités.
Créez une identité, sélectionnez un e-mail, et nous avons ici votre e-mail qui est
disponible dans votre base de données. Créez une identité. Ils envoient à nouveau l'
e-mail de vérification sur cet e-mail. J'ouvre donc cet e-mail
ici et j'ouvre ce lien. Tu vois, on nous
félicite. Bien. Permettez-moi de rafraîchir cette page. Tu vois, c'est vérifié. Alors mourons à nouveau. Envoyez toujours la demande,
je comprends que Sandymil n'est pas défini Laissez-moi vérifier le fichier
Amazon SS. Oh, en bas, j'ai oublié de supprimer
cette parenthèse J'ai ajouté pour vous montrer l'erreur, et j'ai oublié de le supprimer. Enregistrez ceci et
renvoyons la demande. Vous voyez, nous obtenons ici
le jeton de réinitialisation. Mais si nous vérifions
notre terminal, vous voyez
, nous avons toujours une erreur de
validation, erreur
Amazon SS, un e-mail. Vérifions SandyMLFunction. OK. Ici, dans la destination, nous devons remplacer
ces deux adresses deux adresses
au pluriel Maintenant, essayons à nouveau. Ici, nous obtenons notre jeton de réinitialisation. Examinons maintenant notre terminal. Ici, nous avons une nouvelle erreur. L'adresse e-mail n'est pas vérifiée
dans cette région. Mais pourquoi, comme nous le savons, nous avons déjà vérifié notre e-mail. Pourtant, nous
recevons cette erreur. Laisse-moi t'expliquer. Ici, j'ai vérifié nos deux e-mails
dans la mauvaise région. Permettez-moi également de vérifier
sur le site Web d'Amazon. voyez, ici, j'ai sélectionné
la région Europe, et dans ma variable NV, je passe la région de Mumbai, et c'est pourquoi je reçois cette erreur Je sélectionne ici cette région d'Umbi. Je dois maintenant vérifier à nouveau
les deux e-mails dans cette région. Accédez à Identités,
créez une identité, sélectionnez ici e-mail, rédigez l'
e-mail et créez une identité. Vérifions-le maintenant
par e-mail. Maintenant, je dois faire de
même pour un autre e-mail.
Si je mange et que j'ai fini
ici, Si je mange et que j'ai fini les deux e-mails
seront vérifiés pour ma région. Alors maintenant, testons à nouveau
notre implémentation. Envoyez le premier appel d'API. Tu vois, nous obtenons un jeton de réinitialisation. De plus, si nous
vérifions notre terminal, voyons ici que nous recevons
des e-mails envoyés avec succès et que nous obtenons également l'identifiant du message. Et si je consulte ma boîte e-mail, je reçois l'e-mail
dans le spam car ici nous sommes en mode dégustation
et nous ne vérifions pas non plus le domaine. En production, vous devez
apporter de petites modifications
au paramètre et votre e-mail ne
sera pas placé dans le dossier de courrier indésirable. C'est la puissance d'Amazon SES. Je sais que la création de ce compte SES est une partie un peu difficile
et ennuyeuse. Mais pour une
expérience aussi fluide que celle-ci, nous devons abandonner
cette jolie peinture. L'utilisateur peut maintenant ouvrir ce lien frontal
, puis le front end
appellera notre deuxième API. C'est le travail du front end. Développez également le front-end que
vous soyez un lien.
Ne t'inquiète pas pour ça. Maintenant, également, si nous devons utiliser
Amazon SES pour la production, nous devons demander l'accès
à la production. Si nous vérifions notre
statut actuel sur la page GetSet, voyons actuellement que notre statut est
sandbox, ce qui signifie tester Ici, nous pouvons lire la
mention figurant dans les cartes ci-dessous, vérifier une
adresse e-mail et un
domaine d'envoi pour demander des informations de
production, ce qui vous
permet d'envoyer des e-mails au niveau de la production et de tirer parti toutes
les capacités de SCS. Pour la production, vous devez
vérifier le domaine d'envoi à partir d'ici. Et si vous fournissez des informations
écrites et soumettez une demande, AWS l'approuve
généralement dans un délai de 24 à 48 heures. Après avoir obtenu l'approbation, nous pouvons envoyer un e-mail à l'adresse e-mail. De plus, je
donnerai plus d'informations dans l'
article situé sous cette leçon. Donc, pour la production,
vous pouvez le lire. OK ? C'est ainsi que nous
envoyons des e-mails de la manière la plus sécurisée , la plus rapide et la
moins chère d'Amazon SS.
166. Envoyer des e-mails GRATUITEMENT CH: Voyons comment envoyer des
e-mails en utilisant la méthode SMTP, qui est gratuite, mais qui
a une limite quotidienne Nous ne pouvons envoyer que 500
e-mails depuis GML SMTP, et si vous utilisez YahooSMTP, nous ne pouvons envoyer que
100 Mais pour votre candidature locale ou votre projet universitaire,
ce n'est pas grave. De plus, si vous implémentez Amazon SS et que cela
fonctionne pour vous, vous pouvez ignorer cette
leçon car nous n'
ajouterons que des
fonctionnalités d'envoi d'e-mails dans cette leçon
, comme nous l'avons fait dans
la leçon précédente. Voyons maintenant l'implémentation de
SMTB. Je divise cette implémentation
en trois étapes simples. Première étape, nous allons implémenter configuration
SMTV dans
l'application du nœud Ensuite, étape 2, nous allons générer un mot de passe pour SMTB.
Dernière étape, nous allons tester cette
implémentation Commençons par la
première étape. Pour implémenter le protocole SMTP, nous avons besoin d'un package appelé node mailer NPM installe Node mailer, au d 6.10 0.0 et Bien. Maintenant, dans notre projet, créez un nouveau dossier
appelé config, et dans ce dossier,
nous allons créer un nouveau fichier appelé SMTP point js Bien. Maintenant, pour démarrer
la configuration, nous avons besoin d'une
méthode d'envoi de nœuds contenue dans le package Sconst node mailer est équivalent
à require node Mailer. Et après cela, nous devons
créer un transport pour la configuration. Donc nodemler dot
Create Transport. Et à l'intérieur de celui-ci, nous devons transmettre l'objet de configuration. Ici, nous allons ajouter des propriétés, et la plupart de leurs valeurs
seront transmises dans le fichier ENV Donc, hôte pour traiter l'hôte SMTP Underscore
point nw point. Deuxièmement, nous avons besoin d'un port pour traiter le SMTP Underscore
point new point Après cela, assurez-vous que c'est vrai. Cette valeur n'est vraie que
pour la valeur « put 465 ». Pour les autres pots, nous devons
utiliser une valeur fausse. Après cela, nous
passons à l'objet. Et ici, nous devons passer un utilisateur à un autre pour traiter le
SMTP point nw point, souligner Et ensuite, passez à process point w point SMTP, soulignez Ne vous inquiétez pas, nous transmettrons
ces valeurs dans une minute. Maintenant, pour l'envoi de l'e-mail, nous créons une nouvelle fonction
appelée Envoyer SMTP, courrier électronique est égal à
une fonction d'erreur Maintenant, dans cette fonction, avant d'écrire le code, il est préférable d'ajouter un bloc
d'essai et de cache. Et dans le bloc de cache, nous
transmettrons le journal des points de la console. Erreur lors de l'envoi de l'e-mail
et il suffit d'ajouter un e-mail. Maintenant, dans le
blog dri, nous ajoutons des coûts. Les options de courrier sont égales à l'objet. Nous passons ici quelques options. À partir de deux processus point nvt
SMTP underscore user, nous
avons Ici, nous devons transmettre le courrier électronique
du destinataire. Mais voici une
question. Comment pouvons-nous obtenir le courrier électronique du destinataire
dans cette fonction ? Bien, nous allons l'obtenir
à partir du paramètre. Nous ajoutons donc aussi. Ici aussi, nous avons besoin d'un sujet. C'est l'objet de notre
e-mail et nous transmettons également du texte, qui est le corps de l'e-mail. Maintenant, dans les options, nous en ajoutons deux à deux, en fonction du sujet
et du texte au texte. Nous avons donc des options prêtes. Il ne nous reste plus qu'
à envoyer l'e-mail. Attendez, et ici nous avons
besoin d'un transporteur, que nous obtenons à partir de ce
nœud (méthode Miller). Nous allons donc le stocker invariablement
appelé transporteur, et dans la fonction d'envoi de courrier, nous utilisons le transporteur
point send mail, ici nous devons
ajouter des options de courrier Cette expression va
écrire la réponse, alors stockons-la dans
une variable appelée response. Enfin, nous enregistrons simplement les points de
console, e-mail a été envoyé avec succès,
nous ajoutons également l'identifiant du message, et nous adhérons à l'identifiant du message à
point de réponse. Pour envoyer l'e-mail, il suffit d'
appeler cette fonction et de transmettre ces arguments. Nous exportons cette fonction
à l'aide d'un module dont exportation équivaut à
envoyer un e-mail SMTP Enregistrez ce fichier, et maintenant,
dans notre API de réinitialisation des demandes, nous allons simplement appeler ici, envoyer la fonction d'e-mail SMTP,
voir atoiput Dans la leçon précédente, j'ai créé ces deux
variables, le sujet et le texte. Vous pouvez le copier et
simplement dans cette fonction, transmettre à l'utilisateur un e-mail à point, qui est le courrier électronique du destinataire, sujet par
une virgule et le texte Permettez-moi maintenant de commenter
cette fonction précédente pour Amazon SES. Ici, notre première étape est terminée. Passons maintenant à la deuxième étape, qui consiste à définir les variables d'
environnement. Dans les fichiers ENV de
la leçon précédente,
j'ai donc ajouté ces quatre
variables pour Amazon SES. Si vous ne l'appliquez
pas, ne vous inquiétez pas. Nous passons maintenant quatre
variables pour le protocole SMTP. Si vous ne vous souvenez pas de
leur nom, vous pouvez simplement le
copier à partir du code. Il n'y a rien de mal à cela. Donc, tout d'abord, SMTP et
ace host sont égaux Ici, j'utilise GMLHst
donc j'écris smtp.gmail.com Après cela, le
port de soulignement SMTP est égal à 465. Ici, si vous utilisez
Yahoo ou Outlook, vous pouvez utiliser les valeurs de
publication et de port. Mais Gmail est bon pour le SMTP. Nous avons maintenant besoin d'un utilisateur de
soulignement SMTP, et ici nous transmettons l'e-mail à partir duquel
nous voulons envoyer un Il s'agit de l'adresse e-mail de l'entreprise. J'ajoute donc ici mon adresse e-mail. J'utilise cet e-mail juste pour une démonstration, à l'avenir, je ne l'
utiliserai pas. Il ne nous reste plus qu'à transmettre le mot de passe
de
soulignement SMTP , comme ici, nous pouvons transmettre notre mot de passe Gmail, mais après 2024, Gmail n'
autorisera plus ce type de paramètre Ainsi, au lieu de transmettre
un vrai mot de passe, nous pouvons transmettre un mot de passe. Voyons comment
générer un mot de passe. Ouvrez donc google.com et allez sur
Gérer mon compte Google. Passons maintenant à la sécurité. Maintenant, pour générer
le mot de passe de l'application, il y a une condition. Dans notre compte Google, validation en
deux étapes ne
doit pas être possible. S'il est désactivé
pour votre compte, vous devez l'activer. Sinon, vous
obtiendrez une erreur SMTP. Maintenant, une fois que vous n'avez pas pu effectuer la
vérification en haut de la page, recherchez un mot
de passe et ouvrez-le en toute sécurité. Il vous vérifiera d'abord, bien. Maintenant c'est le nom de l'application. Ici, nous pouvons écrire node, Miller, SMTV ou n'importe quel autre nom, peu
importe La seule chose est que dans le futur, si vous souhaitez supprimer
ce mot de passe d'application, vous pourrez vous souvenir
de son nom d'application. Cliquez maintenant sur Créer. voyez, ici, nous obtenons un mot de passe à
16 chiffres, il suffit de le copier et vous pouvez
également prendre capture d'écran ou cliquer sur Photo sur votre téléphone, car
une fois que nous l'avons fermé, nous ne pouvons plus voir le mot de passe. Copiez-le et
collez-le dans notre fichier ENV. Assurez-vous de laisser
l'espace tel quel. Ne changez rien
à cela. Et c'est tout. Ici, notre deuxième étape est terminée. Passons maintenant à la
troisième étape, qui consiste à tester. Donc, avant de tester, assurez-vous saisir l'adresse e-mail valide
dans les données de votre utilisateur. Si vous ne transmettez pas votre e-mail, vous pouvez le modifier
depuis le Mongo DB Compass OK. Ouvrez maintenant Postman, et ici nous envoyons la première
demande, l'API de réinitialisation du mot de passe Vous voyez, nous allons réinitialiser le jeton, et si nous vérifions notre terminal, nous obtenons une erreur. Connexion,
icône, refus. C'est peut-être une erreur
pour un mot de passe unique. Alors laisse-moi réessayer. Je reçois quand même l'erreur. Permettez-moi donc de créer un autre mot de passe d'
application pour nodemiler,
SMTP, de le créer et de le copier et de m'assurer de cliquer Maintenant, dans notre fichier ENV, remplacez le mot de passe,
enregistrez ce fichier Maintenant, essayons à nouveau. Envoyez la première demande. Ici, nous obtenons un jeton
et dans le terminal, voyons, nous recevons un e-mail
envoyé avec succès, et nous obtenons également l'identifiant du message. Et si j'ouvre ma boîte de réception, voilà que je reçois le nouvel e-mail. C'est tellement simple d'envoyer un
e-mail depuis l'application node. En résumé, vous pouvez utiliser Amazon SES pour une application de
type entreprise, et si votre
application est petite, vous pouvez utiliser la méthode SMTP, mais elle ne nous enverra que
500 e-mails par jour, c'est à vous de décider
lequel vous choisissez
167. Logique de suivi: De nos jours, dans toute application de
réseau social, il y a un abonné et une fonctionnalité de
suivi est indispensable Implémentons donc également
cela dans notre application. Vous pourriez être un peu effrayé par cette fonctionnalité si vous implémentez pour
la première fois. Mais croyez-moi, c'
est très simple. Comprenons donc d'abord la logique du suiveur
et du suivi Voici donc quel est l'utilisateur de
connexion dans notre application. Et voici un autre utilisateur, disons Harley et son statut de
profil sont publics Maintenant, vous voulez suivre Harley, alors vous appuyez sur le bouton Suivre. Maintenant, que s'est-il passé
dans le backend ? Tout d'abord, pour chaque utilisateur, nous ajouterons trois nouveaux champs
dans le schéma de l'utilisateur, followers, qui sont le tableau des utilisateurs qui suivent cet utilisateur. Ici, nous ajoutons
des identifiants d'utilisateur comme référence. Ensuite, nous ajoutons le champ suivant, qui est le tableau des utilisateurs
suivis par cet utilisateur. Enfin, nous ajoutons une demande de suivi, qui est également un tableau, mais nous
y ajouterons tous les
identifiants des utilisateurs qui envoient des demandes
pour suivre l'utilisateur. Nous ajouterons un ID utilisateur dans cette demande suivante uniquement si le compte
utilisateur est privé. Revenons maintenant à notre exemple, supposons que vous vouliez suivre Hurley et que le
compte Hurley soit public Tout d'abord, votre nom d'utilisateur
sera ajouté à la liste des abonnés de
Hurley Ensuite, le nom d'utilisateur de Halley sera
ajouté à votre liste suivante. C'est très simple. Maintenant, le compte de
Halley est public Et si on rendait son
compte privé ? Dans ce cas, nous ne pouvons pas ajouter votre nom d'utilisateur dans la liste de suivi de
Halley Dans ce cas, nous ajouterons
votre nom d'utilisateur dans le tableau de requêtes de
suivi de Hal. Maintenant, Hali a deux options. Il peut accepter ou rejeter la
demande. Si Ali refuse,
nous retirons simplement
votre nom d'utilisateur de la demande
AlisFollow Et si Hali
acceptait la demande ? Ensuite, nous supprimons d'abord
votre nom d'utilisateur de la liste des demandes et l'
ajoutons à la liste des abonnés De plus, nous ajoutons l'
identifiant utilisateur Hale dans votre liste suivante. Voilà à quel point
cet abonné
et les fonctionnalités suivantes sont simples et les fonctionnalités suivantes Dans la leçon suivante, nous allons définir l'AEI pour ces fonctionnalités
168. Suivre l'utilisateur: Définissons maintenant l'API
pour ajouter un suiveur. Comme nous le savons, la logique
est très simple. Mettons-le donc rapidement en œuvre. Ici, en bas,
nous ajoutons le point de
terminaison du routeur à la barre oblique Ici, nous ajoutons l'ID utilisateur, donc la barre oblique de l'ID utilisateur de la colonne suit Il s'agit du nom d'utilisateur de l'
utilisateur que nous voulons suivre. De plus, nous avons besoin d'un identifiant utilisateur connecté, nous ajoutons
donc ici un
intergiciel et une fonction de course avec
demande Maintenant, dans cette fonction, nous
obtenons tout d'
abord cet identifiant utilisateur, donc l'identifiant utilisateur Const est égal à request point
Perms point user De plus, nous avons besoin de const, l'ID utilisateur
actuel est égal à request point user
point underscore Tout d'abord, nous allons
vérifier une condition. Si l'ID utilisateur est égal
à l'ID utilisateur actuel, nous
renvoyons une réponse
avec le code d'état 400 pour une mauvaise demande, point Json
Object, Message property. Tu ne peux pas te suivre toi-même. La première logique de l'
API follow est que nous
vérifierons que l'autre compte utilisateur
est privé ou public. Pour cela, nous accédons aux informations des
utilisateurs. Donc, les inconvénients que l'utilisateur doit suivre sont égaux à attendre l'utilisateur point fine buy ID. Et ici, nous passons le nom d'utilisateur. Ensuite, nous passons votre condition. Si l'utilisateur à suivre n'
est pas disponible, renvoyez la réponse
avec le code d'état 404 et le code Json à Object with message
property, User not found. Nous devons également trouver les informations
actuelles sur les utilisateurs. Donc, const current user
équivaut à wait user point Fine BD et à transmettre
ici l'ID utilisateur actuel Et passez également ici,
la même condition, donc dupliquez cette condition par Alt plus tamisage+flèche vers le
bas ou Option
plus tamisage+flèche vers le bas et déplacez cette ligne dessous de l'option de rétention
ou modifiez Et ici, nous changeons simplement
cet utilisateur en utilisateur actuel. Maintenant, après avoir obtenu les deux utilisateurs, nous pouvons passer votre condition si
l'utilisateur à suivre est privé. Si c'est vrai,
cela signifie que le compte est privé. Si le compte est privé, nous devons ajouter l'ID utilisateur
actuel dans la demande de
suivi de l'autre utilisateur. Mais pour cela, nous devons ajouter trois champs dans
notre schéma utilisateur. Donc, sur le schéma utilisateur,
nous ajoutons enfin des abonnés remplis au tableau, et à l'intérieur de celui-ci, nous ajoutons le type d'objet au schéma de points
Mongoose, les
types de points, le point, l'ID d'objet et la référence à l'utilisateur Nous avons également besoin d'une demande de suivi
et de suivi, qui a le même
type de schéma et la même référence utilisateur. Juste ici, nous modifions le suivi
et suivons la demande. Enregistrez ce fichier et
revenez à notre itinéraire. Ici, nous écrivons user to follow, point follow request, point push. Et ici, nous ajoutons l'ID utilisateur actuel, puis nous pouvons attendre que
l'utilisateur suive point save. Et ici, nous renvoyons la réponse
avec un message JSON. Pour suivre, demande envoyée. Bien. Mais voici une chose. Il est possible que l'utilisateur soit déjà disponible dans le tableau de requêtes
suivant. Avant cette méthode push, nous ajoutons la condition I user to follow point follow request
point includes here, nous transmettons l'identifiant utilisateur actuel. Si l'ID utilisateur actuel est
disponible dans le tableau, nous renvoyons le statut du point de
réponse, objet Json à
400 points avec MSATPproperty pour suivre la
demande déjà envoyée Ensuite, nous ajoutons s, et nous pouvons déplacer cette
partie dans le bloc s. Nous écrivons donc ici
la logique d'ajout d' une demande de
suivi si le
compte est privé, mais que notre autre
compte utilisateur peut être public. Après cela, si nous ajoutons Ls, si vous êtes confus, vous pouvez écrire des
commandes pour cela. J'écris un commentaire ici,
logique pour le compte public. Bien. Maintenant, que voulons-nous
faire si le compte est public ? Bien sûr, nous ajouterons directement l'ID utilisateur
actuel dans
la liste des abonnés, et dans la liste des utilisateurs
suivants, nous ajouterons l'identifiant de l'utilisateur à suivre L'utilisateur doit suivre point
followers point push. Ici, nous ajoutons l'ID utilisateur actuel, puis l'identifiant actuel, point suivi, le point push. Et ici, nous ajoutons un identifiant utilisateur. Ensuite, nous sauvegardons
ces deux documents. Attendez donc que l'utilisateur
suive la sauvegarde par points et attendez la sauvegarde par point de l'utilisateur actuel. Après cela, nous
renvoyons une réponse avec un objet
JSON avec la propriété
message, l'utilisateur a suivi avec succès. Comme nous l'avons fait précédemment, il est possible que
notre nom d'utilisateur actuel soit déjà disponible
dans la liste des abonnés Nous passons votre condition
avant cette logique. Si l'utilisateur suit un point, point inclut ici, nous
transmettons l'identifiant utilisateur actuel. S'il est disponible, nous renvoyons une réponse
avec un code d'état, 400 pour une demande de bat, et dans un objet Jason avec propriété
message, à l'utilisateur
qui suit déjà l'utilisateur. Ensuite, nous ajoutons s, et nous déplacerons ce
code dans le bloc se. C'est ça. C'est vraiment simple. Nous allons maintenant tester cette
implémentation. Donc, pour tester l'API suivante, nous avons besoin d'un autre compte utilisateur. Créons cela d'
abord, ouvrons
l'API utilisateur créée , changeons le nom d'utilisateur, disons, Hurley 001 et envoyons un e-mail à Hali sur
le gmail.com rouge De plus, je garderai le même
mot de passe. Sinon, j'oublierai le mot de passe et j'
enverrai la demande. Vous voyez, nous obtenons ici
le nouveau jeton utilisateur. Ici, nous avons besoin de cet identifiant
Hurley. Donc, selon Mongoi, nous nous
adressons aux utilisateurs et nous copions
ce nouveau nom d'utilisateur. Retournez à Postman pour suivre, nous créons une nouvelle demande Suivez l'API, méthode SDB,
pour publier, URL vers SDDP, double barre oblique, hôte
local, colonne 3 000, barre oblique, barre oblique, barre oblique, barre oblique,
barre oblique, barre oblique, barre oblique, barre oblique,
barre oblique, barre oblique, suivre barre oblique, barre oblique, barre oblique, barre oblique barre oblique, barre oblique, Nous avons besoin du jeton utilisateur actuel Nous allons
donc à l'API de connexion, changeons le mot de passe
car nous l'avons changé dans notre leçon précédente
et envoyons la demande. Copiez ce jeton, et dans notre API de
suivi, nous accédons aux en-têtes, respectons l'autorisation,
et dans le porteur de valeur, espacons le jeton Et envoyez la demande. Vous voyez, ici , l'utilisateur est suivi
avec succès. Nous avons directement suivi l'utilisateur car ce nouveau
compte utilisateur est public. Maintenant, goûtons également en
rendant ce compte privé. Nous passons donc au Mongo Di
BecompasrFresh the data. Tout d'abord, nous supprimons l'identifiant
de la liste suivante. Nous supprimons également l'identifiant de
la liste des abonnés et rendons ce nouveau compte
utilisateur
privé pour qu'il soit vrai et le mettons à jour Revenons maintenant à l'
API et à l'envoi de la demande. Vous voyez ici que nous recevons une
demande de suivi envoyée adorablement. Dans la leçon suivante,
nous allons créer une API pour accepter la demande de suivi et rejeter la demande de
suivi
169. Accepter la demande de suivi: Définissons l'API pour accepter et rejeter
la demande de suivi abord, nous allons
implémenter
le rejet de la demande car elle
sera facile à tester.
Ainsi, le routeur point
à point rejette la demande D, barre
oblique et ici nous avons besoin de l'ID utilisateur
du demandeur ID du demandeur d'appel. Après cela, nous avons également besoin de la vaisselle
orthomédale. Nous ajoutons une fonction singcalve
avec demande et réponse. Maintenant, tout d'abord,
dans cette fonction, nous allons obtenir Cost, ID du
demandeur est égal à request point Perms
point Requester Nous avons également besoin de const, l'ID utilisateur
actuel est égal à request point user
point underscore ID, nous obtiendrons
grâce
à cet Tout d'abord, nous allons vérifier si les deux utilisateurs sont disponibles
dans notre collection ou non. N'oubliez pas que nous avons fait de même
dans l'API précédente. Voilà, recopiez ce code. Copiez également cette première
condition pour le même identifiant
et, en bas,
collez-la dans notre API de rejet. Ici, nous devons apporter de
petits changements. Donc, à la place de l'ID utilisateur, nous devons ajouter l'ID du demandeur, et ici aussi l'ID du demandeur. De plus, nous devons changer le nom de
cette variable.
Sélectionnez l'utilisateur à suivre, appuyez sur F deux et
remplacez-le par utilisateur demandeur Cela nous donnera plus de clarté. Maintenant, pour rejeter la demande, il suffit de
supprimer l'ID
du demandeur du tableau de demandes suivant Mais avant cela, nous pouvons
vérifier si nous avons demandé l'ID dans le tableau de
requêtes suivant ou non. Donc, si le point point
follow request point de l'utilisateur actuel inclut l'ID du demandeur, si cette condition n'est pas vraie, nous passons ici un point d'exclamation, puis nous renvoyons une
réponse avec le code d'état 400 et un objet JSON point
avec la propriété de message 2, aucune demande de suivi trouvée Et je suis que la demande est trouvée, alors ici nous pouvons utiliser méthode de
filtrage pour supprimer l'ID du
demandeur du tableau Const, la
demande mise à jour est donc égale au filtre point point point point de
l'utilisateur actuel Ici, nous ajoutons l'ID, qui est l'élément individuel de cette fonction de flèche matricielle, et nous renvoyons ici la condition dt deux chaînes différentes de
l'ID du demandeur Cela supprimera
l'ID du demandeur du tableau de demandes suivant Nous pouvons simplement définir demande de suivi par points de l'utilisateur
actuelle est égale à la demande mise à jour. Ensuite, nous attendons le point c de
l'utilisateur actuel. Et enfin,
nous renvoyons simplement une réponse avec objet
JSON avec la
propriété du message à suivre, demander, à rejeter,
et c'est tout. Nous allons maintenant tester cette API. Ouvrez donc Postman, et nous ajoutons ici une nouvelle demande appelée rejet de
la demande de suivi Maintenant, nous définissons la méthode d'API
pour publier et pointer sur SDDP,
colonne double pour barre oblique, hôte local, colonne 3 000,
barre oblique, utilisateur de l'API, barre oblique rejet de demande. Ici nous devons transmettre
l'ID du demandeur,
qui est l'ID de l'utilisateur qui a envoyé la Ici, nous ouvrons Mongo Db Compass, et pouvez-vous me dire quel
utilisateur envoie une demande ? vrai, c'est notre premier utilisateur, dont l'identifiant est ajouté dans le
tableau de requêtes de suivi d'un autre utilisateur. Copiez donc cet identifiant et
collez-le dans l'URL, et nous envoyons la demande. Oh, nous devons transmettre le jeton JWT. Maintenant, nous avons besoin
du jeton de l'utilisateur qui
reçoit la demande, qui est notre nouvel utilisateur. Ainsi, dans l'API de connexion,
je change le nom d'utilisateur en je change le nom d'utilisateur Hurley 001, je
change également le mot de passe
et j'envoie la demande Copiez ce jeton. Et
dans l'API de rejet, nous passons aux en-têtes, nous
respectons l'autorisation, respectons l'autorisation, et la valeur à
l'espace porteur, nous rythmons le jeton Maintenant, nous envoyons la demande. Vous voyez, ici, nous recevons une
demande de suivi rejetée. Comme si nous vérifiions notre base de données,
actualisez la collection. voyez, pour le deuxième utilisateur, nous n'obtenons aucun identifiant dans
la demande suivante. Ici, notre
API rejetée fonctionne bien. Nous pouvons maintenant définir l'API pour
accepter la demande de l'utilisateur. Cette API est très similaire à
l'API des demandes rejetées Nous copions
donc l'intégralité de l'API
et la collons ci-dessous. Bien. Maintenant, nous changeons d'abord le point de terminaison pour qu'il accepte en tant que
demande l'ID du demandeur Ensuite, si nous
acceptons la demande, nous devons également supprimer l' ID du
demandeur du tableau de demandes
suivant Nous conservons donc notre code tel quel. Mais après avoir supprimé
l'identifiant du demandeur, nous devons l'ajouter à la
liste des abonnés Cela signifie que nous acceptons
la demande suivante. Donc, avant la méthode de sauvegarde, ajoutez le point
followers point push de l'utilisateur actuel. Ici, nous envoyons l'ID du demandeur, et nous devons également ajouter l'ID utilisateur actuel dans
la liste suivante des utilisateurs du demandeur Donc, utilisateur demandeur, point
après point push. Ici, nous indiquons l'identifiant utilisateur actuel. Maintenant, attendons également la sauvegarde par point de l'utilisateur
demandeur. Enfin, nous changeons le
message pour suivre la demande, acceptée, et c'est tout. Maintenant, goûtons également à cette API. Revenons donc à Postman et nous avons besoin de la même
demande, comme le rejet Nous pouvons donc dupliquer l'API
taste à partir d'ici, changer le nom pour accepter
la demande de suivi. Également point de terminaison à accepter
comme ID du demandeur de demande. Et si nous vérifions
les en-têtes, vous voyez, ici nous obtenons également ce jeton, et c'est pourquoi nous
dupliquons ce test Maintenant, envoyons
cette demande d'API. voyez, ici,
aucune demande de suivi n' a été trouvée parce que nous venons de
rejeter la demande de suivi. Ici, nous devons envoyer à nouveau
la demande suivante. Pour cela, nous allons suivre l' API et envoyons la demande de suivi. Demande envoyée, en bon état. Revenons maintenant à l'
API d'acceptation de la demande et à l'envoi de la demande. Vous voyez, la
demande de suivi est acceptée, et si nous vérifions notre base de données,
actualisons la collection. voyez, ici, nous obtenons également l'identifiant utilisateur dans la liste des abonnés et demandons notre identifiant soit retiré de
la demande de suivi Et ici, nous obtenons l'identifiant
dans la liste suivante.
170. Exercice - Obtenir la liste des followers et suivre: Il est maintenant temps de faire un
peu d'exercice. Dans cet exercice, je souhaite que
vous créiez deux API. Une API pour obtenir la liste
d'un autre utilisateur et une deuxième API pour obtenir la liste suivante
d'un autre utilisateur. Si vous êtes l'utilisateur 1, vous pouvez envoyer une demande
pour obtenir la liste des utilisateurs 2, abonnés
et suivants. Ici, notre API ressemble à ceci. ID utilisateur de l'API Slash,
slash followers. Slash suivant
pour l'API suivante. Pensez d'abord à la logique,
puis mettez-la en œuvre. C'est vraiment simple. Je sais que tu peux terminer cet exercice. Essayez de résoudre ce problème et
ensuite quelle est la solution. J'espère que vous aurez terminé cet exercice ou que vous
essayerez de le résoudre. Appréciez-vous pour cela. Voyons maintenant la solution. Nous ajoutons donc ici le point de
routeur Get et pointons pour slash Colin User
ID, slash followers Il s'agit de l'identifiant de l'utilisateur
dont l'utilisateur de
connexion à la liste d'abonnés souhaite voir. Nous avons donc besoin d'un middleware, puis une fonction de rappel demandant et
réponse Maintenant, dans cette fonction,
nous obtenons d'abord que l'ID utilisateur cost est égal à request point
Perms point User ID De plus, nous avons besoin d'un coût, l'utilisateur
actuel, est égal à l'identifiant de soulignement point point
utilisateur point point Voyons maintenant
la logique de cette API. Devons-nous afficher la
liste des abonnés de n'importe quel numéro d'utilisateur. Vous ne pouvez voir que la liste des abonnés des
utilisateurs, que vous suivez ou dont le
compte est public. Ici, nous avons besoin de la liste des abonnés actuels
et un autre
utilisateur est une propriété
privée Encore une fois, nous copions le code des deux
utilisateurs de l'API précédente et le
collons dans cette API. Maintenant, nous changeons
le nom de la variable en utilisateur et changeons cet ID de
demandeur en ID utilisateur Bien. Maintenant, après cela, nous pouvons passer la condition si l'utilisateur
point followers point inclut, ici nous passons l'identifiant utilisateur actuel. Ou le point d'utilisateur privé est faux, ce qui signifie que le
compte utilisateur est public. Si l'une de ces
conditions est vraie, nous montrerons la liste des abonnés des
utilisateurs. Renvoie le point de réponse Json, et ici nous passons à
l'utilisateur point followers. Nous ajoutons, et
nous y retournerons point de
réponse Status 400 point Jon,
transmettrons votre objet avec la propriété du
message, Gant, Get followers list, le
compte est privé. Faisons maintenant cette
implémentation, enregistrons les modifications
et ouvrons postman Ici, nous créons une nouvelle demande intitulée Getting Users
followers list. Ici, nous ajoutons l'URL, le SDP, la colonne double quatre barres obliques, hôte
local, la colonne 3 000, API
slash, l'ID utilisateur slash,
et enfin, nous Revenez maintenant à la base de données Mongo DB, copiez ce deuxième ID utilisateur, qui a un suiveur et
collez cet ID dans l'URL Maintenant, dans cette API, nous devons transmettre un jeton.
Passez donc aux en-têtes. Ajoutez ici de l'autorisation et de
la valeur à l'espace réservé aux porteurs. Et ici, nous devons
transmettre un autre
jeton utilisateur qui suit
cet identifiant utilisateur. Revenons donc à l'API de connexion, et ici nous nous connectons simplement
avec l'ancien compte, changeons le mot de passe
et envoyons cette demande. voyez, ici, nous obtenons un jeton, copiez-le et
collez-le dans notre en-tête d'API. Bien. Maintenant, envoyez la demande. Vous voyez, ici, nous obtenons le tableau
avec l'identifiant du suiveur. Mais comme nous le savons, dans
le monde réel, nous devons afficher le nom d'utilisateur, nous devons
donc le renseigner. Pour cela, dans notre requête fine, nous avions d'abord utilisé la
méthode populatet, nous transmettons le nom de remplissage que
nous voulons renseigner,
qui est followers, puis nous passons le nom de remplissage, que nous voulons obtenir à
partir de la référence, à savoir l' ID de soulignement Maintenant, voici une chose. Ici, nous remplissons la liste des abonnés Alors maintenant, ce n'est plus la même chose qu'avant. Il s'agira d'un tableau d'objets avec champs d'identifiant de
soulignement et de nom d'utilisateur dans chaque objet Nous ne pouvons donc pas passer ici,
cela inclut la méthode. Nous pouvons utiliser la méthode d'indexation fine que nous avons utilisée dans les projets
précédents, et également écrire ici une
condition différente, un utilisateur actuel, point après un point inclus, et ici nous passons l'ID utilisateur. Donc, si l'utilisateur actuel
suit l'autre utilisateur, nous pouvons également obtenir la liste de
ces abonnés. Enregistrez les modifications
et jetez-y un œil. Envoyez la demande. nous obtenons la liste suivante
avec l'ID et le nom d'utilisateur. Maintenant, créons une autre API et vous l'avez bien deviné, nous allons dupliquer cette
API et en bas,
nous l' ajouterons ici Maintenant, il ne nous reste plus qu'à
changer de petites choses. Donc, tout d'abord, nous
changeons le point de terminaison pour supprimer l'ID utilisateur, puis le
suivant. Ensuite, dans la requête de l'utilisateur, nous devons remplir le champ
suivant, puis cette condition sera la même et nous changeons le
message en liste suivante, compte est privé
et c'est fait Dans la leçon suivante, nous allons définir l'API pour
ne plus suivre l'utilisateur
171. Exercice - Ne plus suivre l'utilisateur: Permettez-moi de vous faire
un autre exercice. Dans cet exercice,
vous devez créer une API pour ne plus suivre l'utilisateur Notre point de terminaison d'API
ressemblera donc à ceci. Utilisateur de l'API Slash, Slash ID
utilisateur, Slash Unfollow. C'est très simple, prenez le temps de
résoudre cet exercice. Et après cela,
revenez voir la solution. Voyons maintenant rapidement
la solution. Nous écrivons donc ici le point du routeur
Post et la colonne oblique de 0,2,
l'ID utilisateur, le slash unfollow En outre, nous avons besoin de la fonction de rappel Omidleware
ACN avec Maintenant, nous devons
trouver les deux utilisateurs. Copiez donc ce code de départ avec ces
deux conditions et transmettez-le
dans notre API. Maintenant, nous n'avons pas besoin cette méthode de remplissage,
nous la supprimons, et nous changeons également ce
nom d'utilisateur en user to unfollow Bien. Maintenant, après avoir
obtenu les deux utilisateurs, nous passons votre condition I user
pour ne plus suivre les abonnés point, point inclut l'
identifiant utilisateur actuel si ce n'est pas vrai, et ici nous ajoutons des points d'exclamation, puis ici nous renvoyons la
réponse avec le code de statut, 400 et dans Jason, nous transmettons le message d'objet à l'utilisateur n'est pas disponible
dans les Ensuite, nous pouvons supprimer l'ID utilisateur
actuel de la liste des
abonnés pour ne plus suivre Ainsi, l'utilisateur qui ne suit plus les
abonnés Dart équivaut à abonnés Dart à
l'utilisateur qui ne suit pas Ici, nous obtenons chaque ID, et ici nous renvoyons l'ID de condition, chaîne du
point deux n'est pas
égale à l'ID utilisateur actuel. De plus, utilisateur actuel, point suivant est égal
à utilisateur actuel, point suivant, filtre à points. Ici, nous obtenons la fonction de flèche ID, et la chaîne ID deux
n'est pas égale à l'ID utilisateur. Nous pouvons maintenant enregistrer les deux documents, attendre que l'utilisateur ne suive point c et attendre l'utilisateur
actuel point C. Et ici, nous renvoyons objet Json avec le point de
réponse avec propriété
message, l'utilisateur
n'étant pas suivi Et c'est fait. Nous pouvons maintenant goûter à
cette implémentation. Donc, un postier et ici nous
dupliquons cette API suivante. Modifiez le nom pour ne plus suivre l'API. Maintenant, changeons le
point de terminaison pour slash user, slash ID, slash unfollow
et envoyer la demande et voyez, ici, nous obtenons un message de
réussite de l'utilisateur, désabonné avec succès C'est ainsi que nous avons
implémenté les abonnés, suivant l'API de demande
et de rejet. Vous pouvez voir que c'est très simple. Nous devons comprendre la logique avant
d'implémenter de nouvelles fonctionnalités.
172. Section 14 - Introduction: Bienvenue dans la 14e section
du cours ultime sans JS. Dans cette section,
nous mettrons en œuvre fonctionnalités liées à la
publication, telles que la
publication d'une nouvelle image ou d'une nouvelle vidéo, affichage de la publication,
la suppression de l'intégralité de la publication. De plus, nous ajouterons une
fonctionnalité «
j'aime » et « contrairement » à la rédaction d'un
nouveau commentaire sur la publication, la
réponse aux commentaires,
et bien d'autres choses encore Il s'agit d'une section importante, alors commençons cette section.
173. Créer un modèle de publication: Créons d'abord un schéma de publication avant de créer des API pour la publication. Dans le dossier des modèles, nous créons un nouveau fichier
appelé post point js. Accédez maintenant au fichier Module de l'
utilisateur, copiez tout le code à partir d' ici et collez-le dans
le fichier du modèle de publication. Maintenant, tout d'abord,
supprimons cet
objet de schéma et nous devons
changer un nom ici. Nous aimons ce schéma utilisateur
et le renommons par F pour publier le schéma et appuyer sur Entrée Sélectionnez maintenant l'utilisateur, et pour
sélectionner plusieurs fois, appuyez sur Ctrl plus D ou
Commande+D et remplacez-le par publier. Il ne nous reste plus qu'à
ajouter un objet Schema. Dans le document postal, nous avons
besoin de deux choses. Tout d'abord, nous avons besoin de l'utilisateur, qui est le nom d'utilisateur qui
a publié l'image ou la vidéo. Tapez donc dans le schéma de points de Mongos Type de
point point ID d'objet, référence à l'utilisateur et
obligatoire sur vrai Ensuite, nous avons besoin des médias. Cela peut être une image ou
une vidéo. En outre, il peut en être un
ou plusieurs. Nous ajoutons donc ici un tableau, et dans celui-ci, nous ajoutons un objet, nom de la
première propriété à l'objet, type à la chaîne, et nous avons
exigé que vous soyez vrai. Et une autre propriété, média, type vers objet, type vers chaîne. Num au tableau, ici nous ajoutons une image, ou cela peut être une vidéo. Comme nous le faisons, il est nécessaire de dessiner. Ce schéma nous permet de bien
comprendre les médias. Ensuite, les utilisateurs peuvent ajouter une
légende à la publication, taper sur une chaîne et rêver à vrai pour
supprimer les espaces blancs, ou nous pouvons également supprimer
cette propriété de flux. Les utilisateurs peuvent ajouter n'importe quel
type de légende. De plus, nous ne le
rendons pas obligatoire car l'utilisateur pourrait ne pas
aimer ajouter de légende. Ensuite, nous ajoutons s, qui est un tableau, et nous avons
également trouvé ici la
référence de l'utilisateur. Nous copions donc cette propriété de type
et de référence depuis le champ utilisateur
et les collons ici. Bien. Ajoutons maintenant des champs
supplémentaires comme les textes, qui sont également des tableaux, du
type à la chaîne. Ensuite, nous ajoutons également l'emplacement, type à la chaîne, et c'est tout. Actuellement, nous avons besoin de ces remplissages. Si à l'avenir, nous avons
besoin d'autres remplissages, nous les ajouterons dans
les prochaines leçons. Nous ajouterons également des commentaires
plus loin dans cette section. Ne vous inquiétez donc pas pour ça. Permettez-moi maintenant de vous montrer une
chose dans l'objet du schéma. Précédemment, souvenez-vous que nous avions créé et rempli notre projet. Mais dans le schéma Mongo, nous pouvons l'ajouter automatiquement Juste après cet objet de schéma, nous avons eu un deuxième argument dans la méthode de
schéma, objet, et ici nous ajoutons la
propriété timestamp et nous l'avons définie sur draw Par cette propriété, nous
obtiendrons deux propriétés liées au temps, créées et mises à jour. Il s'agit l'heure actuelle à
laquelle le document a été créé et dans l'édition mise à jour, nous obtiendrons la date et l'
heure de la dernière mise à jour. Ne vous inquiétez pas, nous
verrons cela lorsque nous créerons un nouveau message et nous le ferons
dans la prochaine leçon.
174. Créer un nouveau message: Créons une API
pour créer un nouvel article. Dans le dossier routes, nous créons un nouveau fichier appelé post point js. Ici, nous avons besoin d'un routeur, Cost Express équivaut
à require Express. Et après cela, cost Router est égal à express point Router. À la fin, nous modulons simplement que point exports est égal à Router. Configurons maintenant ce
routeur dans notre fichier principal. Ainsi, dans le fichier index point js, nous ajoutons le coût après que la route
est égal à require. Ici, nous allons dans le dossier routes, et dans ce post. Maintenant, en bas, app point g, préfixe pour slash API slash post,
et au deuxième
argument, ajoutez des routes Enregistrez ce fichier, et
nous pouvons maintenant ajouter des itinéraires de publication. Donc, dans le fichier post,
nous ajoutons Router, méthode
que nous utiliserons, n'est-ce pas ? Nous utiliserons le routeur point post. Ici, nous ajoutons moins
pour la création d'un nouveau message. De plus, ici, nous avons besoin d'un logiciel
orthomidal car nous voulons que seuls les utilisateurs connectés puissent
créer un nouveau message Et après cela, nous ajoutons une fonction de rappel
AC avec
demande et réponse Maintenant, ce que nous voulons faire dans cette API, c'est simplement
créer un nouveau document de publication et stocker ces images et
vidéos sur notre serveur local. Pour cela, nous devons configurer Multer comme nous l'avons
fait précédemment Ouvrez donc le terminal,
écrivez et installez
Multer sur le LTSO rouge
1,4 0,5 tiret. Huit, entrez. Bien, minimisez ce terminal et
implémentons Multer. Dans le projet précédent,
nous avons donc ajouté la configuration Multer
dans le même fichier de route, mais cela ne semble
pas professionnel Dans ce projet, nous
pouvons donc configurer Multer à un endroit
différent, puis
l'importer dans ce fichier D'accord ? Ainsi, dans le dossier de configuration, nous créons un nouveau fichier
appelé multerULoad point js Nous savons que la mise en œuvre de
Multer est très simple. Il suffit de définir le nom du
fichier et nous pouvons définir le filtre de fichier pour empêcher le téléchargement
inutile de fichiers. Le coût après le téléchargement est égal
à Multer et à l'intérieur de celui-ci, nous devons transmettre l'objet
de configuration Tout d'abord, nous transférons le stockage, qui prendra en charge le
chemin et le nom du fichier. Donc, en haut, nous créons une variable
distincte, le stockage const
est égal au stockage sur disque Mltert. Et dans ce cas, nous transmettons également
un objet avec des propriétés. Nous devons également saisir
Multer en haut. Const Multer est donc égal
à require from Multer. Bien. Maintenant, dans cet objet, nous ajoutons la première propriété, la
destination. Et ici, nous obtenons une demande, un fichier, et le CB a des paramètres, une fonction d'erreur, et à l'intérieur de cela, nous appelons simplement la fonction CB. Et à la première position, nous devons transmettre
l'erreur, qui est nulle. Et au deuxième argument, nous passons le chemin, la destination
de nos fichiers post. Disons que les téléchargements publient. Ensuite, nous avons le nom du fichier, encore une fois, la fonction flèche
avec requête, fichier et CB et à l'intérieur de celui-ci, nous définirons un nom de fichier spécifique
et unique, comme nous le faisions précédemment. Vous pouvez également voir le code
de ce projet. C'est tout à fait bon.
Le timestamp de Const est donc désormais égal au point de date C'est ainsi que nous obtenons l'heure actuelle. Ensuite, nous allons supprimer certains caractères et espaces
du nom du fichier. Le nom d'origine du coût est donc égal
au nom original du point du fichier. Nous obtiendrons ainsi le nom original
du fichier téléchargé. Maintenant, dans le nom du fichier,
il peut y avoir de l'espace, il est
donc préférable de remplacer
cet espace par le tiret. Cela rendra le
nom de fichier convivial pour l'URL. Nous ajoutons la méthode de remplacement des points. Ici, nous ajoutons d'abord expression
régulière qui est une
syntaxe d'expression régulière, qui est une double
barre oblique entre les deux, nous écrivons une barre oblique arrière a pour un espace et plus pour un
ou plusieurs espaces blancs À la fin de l'expression
régulière, un G pour indicateur global, qui garantit que toutes les correspondances la chaîne sont remplacées, et
pas seulement la première. Maintenant, ici, nous transmettons
Dash en codes uniques. Cela signifie que tout l'espace
sera remplacé par un tiret. Et si, dans le nom du fichier, nous obtenions également les caractères
spéciaux ? Nous devons également les supprimer. Nous ajoutons une autre méthode de remplacement. Tout d'abord, qu'allons-nous adopter ? Écrivez une expression régulière par double pour notre barre oblique
entre celles-ci, nous écrivons une expression régulière pour obtenir les caractères
spatiaux. Ici, nous ajoutons A à Z. De plus, de A à Z, de zéro à neuf tirets Nous voulons maintenant obtenir
d'autres personnages qui ne font pas partie
de ces personnages. Ce seront nos personnages
spéciaux. Donc, pour inverser cela, nous l'
avons placé entre crochets, et après le premier
crochet, nous ajouterons Garret pour l'inverse, et à la fin, nous
ajouterons également G pour le drapeau global Nous voulons maintenant remplacer ces
caractères spéciaux par rien. Nous voulons simplement les supprimer. Nous ne respectons donc que des codes
sans rien. À la fin, nous allons mélanger cet horodatage et le nom du fichier
d'origine. CB d'abord, nous passons
null pour erreur, et deuxièmement, nous écrivons les taxes. Ici, nous ajoutons des crochets Cali, horodatage, des crochets
Cali en dollars, nom
original et Nous définissons la destination
et le nom de fichier pour
notre fichier téléchargé. Maintenant, nous pouvons simplement transmettre cette variable de stockage ici
dans la multifonction. Maintenant, après le stockage,
nous passons un filtre de fichiers dans lequel nous filtrerons
les fichiers en fonction de leurs extensions. filtre du fichier de coûts est donc égal à la fonction d'erreur
avec trois paramètres, requête, fichier et CB. Ici, nous vérifierons
si c'est valide ou non. types autorisés par Const sont
donc égaux à des tableaux, et nous ajoutons ici des types de fichiers Maintenant, dans notre application de
médias sociaux, l'utilisateur peut également télécharger des images
et des vidéos. Nous ajoutons ici l'image slash
JPEG, une autre image, le PNG. Ensuite, l'image GIF et pour la vidéo, nous ajoutons des vidéos MP quatre. Et aussi vidéo slash MOV. Vous pouvez également ajouter d'autres
types si vous le souhaitez. Maintenant, nous pouvons simplement
mettre ici la condition I Le fichier Mme type
provient de ces types, ce
n'est qu'alors que nous l'autoriserons, sinon nous le rejetterons. Si les types autorisés point
incluent le point de fichier Mme type, c'est vrai, alors nous appelons
cette fonction CB et d'abord, nous passons null pour erreur, puis nous passons à
accepter le fichier. Maintenant, si le type MM est autre
chose, alors ces types, alors nous respectons condition et appelons
ici la fonction CB. À l'erreur, nous passons une nouvelle erreur, et ici nous passons le
message d'erreur, le type de fichier n'est pas valide, seuls les fichiers JPEG, PNG, GIF ,
MP 4 et MOV sont autorisés à rejeter ce
fichier, nous appliquons la pause. Maintenant, nous pouvons simplement passer ce filtre de fichier dans l'objet
Multi config. De plus, dans le multer, nous pouvons spécifier la
taille du fichier en utilisant la propriété Limits Pour les réseaux sociaux, nous
pouvons fixer une limite à 15 Mo. Si un utilisateur souhaite
télécharger des vidéos, il peut également le faire. Taille du fichier objet comprise
entre 15 et 1024 et 1024. Nous obtenons ainsi la valeur des octets. Il s'agit de la limite pour chaque fichier. Si nous l'utilisons pour
télécharger plusieurs publications, chaque fichier a
une limite maximale de 15 Mo, non une
limite combinée, et c'est fait Ici, notre
méthode de post-upload est prête, nous pouvons
donc l'exporter à partir d'ici. Le module point exports est
égal au post upload. Enregistrez ce fichier, et
dans notre fichier de routes, après ce
middleware, nous ajoutons post,
upload, see auto input works
point parce que nous
voulons télécharger plusieurs
images dans le upload, see auto input works point parce que nous
voulons télécharger plusieurs
images dans Maintenant, avec la première position, nous écrivons le nom de remplissage d'entrée. Passons ici aux médias. Depuis le front-end,
nous devons prendre le fichier en entrée avec un
nom de remplissage multimédia comme celui-ci. Après cela, nous passerons le nombre
maximum de fichiers, disons dix, et c'est tout. Nous pouvons maintenant écrire la logique de l'API. Tout d'abord, nous vérifions ici le fichier téléchargé par
l'utilisateur ou non,
car s'il n'y a pas de média, nous ne voulons pas enregistrer
le message dans notre base de données. Je demande ou les fichiers ne
sont pas disponibles, ou la
longueur des points des fichiers de demande est égale à zéro. Si l'une de ces
conditions est vraie, nous
renvoyons une erreur, une réponse, point, 400 pour
une meilleure demande. Et dans le JSON, nous ajoutons
un objet avec une propriété désordonnée. Au moins un
fichier multimédia est requis. Maintenant, si un média est disponible, nous stockons ce message
dans notre collection de publications. Donc, coût, un nouveau message est égal à nouveau message. Excellente saisie automatique fonctionne, et ici nous devons passer les remplissages. La première consiste à demander à l'utilisateur
point user point underscore ID. Ensuite, nous avons la légende, que nous obtiendrons
dans le corps de la demande. Au-dessus, nous
reconstruisons le corps de la requête, et ici nous obtenons une légende En outre, l'utilisateur peut ajouter
du texte et un emplacement. Maintenant, dans notre article, nous
ajoutons une légende à une autre, ou nous pouvons également supprimer ce texte au texte et de l'
emplacement à l'emplacement. Nous n'avons besoin que d'un
champ multimédia,
qui est un tableau d'objets, et cet objet possède
deux propriétés, le nom, qui est le nom du
fichier, et le type de média, qui est image ou vidéo. Ainsi, lorsque nous affichons
ce média sur le front-end, nous pouvons facilement décider
quelle balise utiliser. Ici, nous devons créer
ce tableau d'objets. C'est vraiment simple :
Cast Media
équivaut à demander une
carte à points de fichiers. Ici, nous obtenons le
fichier unique dans le paramètre, fonction
d'erreur, et ici nous voulons simplement conserver un objet Ici, entre crochets Gully, nous écrivons l'objet, nom du fichier, le nom du fichier point, et pour le type de support, nous devons passer la condition Type MIME du fichier point, point commençant par un
double code, image Si c'est vrai,
nous définissons le type sur image, colonne, sinon sur vidéo. Cette méthode, nous
obtiendrons un tableau multimédia d' objets ici dans notre nouvel article, nous définirons un média sur un média. Ensuite, nous pouvons simplement
attendre le nouveau point de publication C. Ensuite, nous renvoyons le statut du point de
réponse à 01 pour créer de nouvelles données. Objet Dot Json avec propriété
message, publication
téléchargée avec succès. Lorsque nous renvoyons une publication à une
nouvelle publication, et c'est tout. Nous allons tester cette implémentation. Enregistrez ce fichier et ouvrez Postman. Ici, nous créons un nouveau dossier appelé post, dans lequel
nous ajoutons une nouvelle demande, nous
téléchargeons un nouveau message, changeons la méthode
SDDP en publication et l'URL Double colonne pour
slash Local host, colonne 3 000 slash API slash Slash
Post et envoi voyez, ici, nous obtenons le jeton requis, accédez à l'API de connexion et
générez simplement un nouveau jeton. Copiez ceci dans notre nouvelle API, nous allons dans l'en-tête et
ajoutons ici un nouvel en-tête, l'autorisation d'accéder à l'espace bière, et ici nous collons notre jeton. Maintenant, envoyez la demande. Vous voyez, ici, nous obtenons qu'au moins un fichier
multimédia est requis. Maintenant, ajoutons également un
fichier multimédia avec cette demande. Rappelez-vous à partir de quelle
section nous pouvons envoyer un fichier, nous pouvons envoyer un fichier à partir
du corps et des données du formulaire. Ici, dans la clé, nous transmettons les médias
car dans notre API, nous définissons les médias ici
dans la méthode multer Maintenant, nous sélectionnons le fichier. Ajoutez un nouveau fichier à partir de
la machine locale. Envoyons deux
ou trois images d'ici et envoyons la demande. voyez, ici nous obtenons une erreur, aucun fichier ou
répertoire de ce type AppLoadsPost. En gros, ils
nous disent que nous devons
créer un chemin de dossier. Sur notre serveur, nous créons un
nouveau dossier appelé uploads. Veillez à
n'utiliser que des minuscules,
car elles distinguent les majuscules et minuscules. Maintenant, dans ce dossier de téléchargements, nous créons un autre
dossier appelé Post Bien. Maintenant, envoyez la demande. C, le message a été téléchargé avec succès. Ici, nous obtenons un nouvel
objet de publication avec un utilisateur, les médias ont également une belle apparence
avec le nom et le type de média, likes et les tags dans un tableau
vide et nous obtenons
également des horodatages créés
et téléchargés sur Nous obtenons ces deux valeurs
parce que dans notre schéma, nous ajoutons des horodatages C'est ainsi que nous créons un nouveau post. Dans la leçon suivante, nous allons récupérer les messages de la collection de
publications.
175. Obtenir des publications des utilisateurs actuels: Il est maintenant temps de faire un
peu d'exercice. Ici, vous devez
créer une nouvelle API pour obtenir tous les messages de l'utilisateur
actuellement connecté. De plus, vous devez
implémenter une fonctionnalité de pagination, comme nous
l'avons fait dans le
projet précédent, l'API des produits Assurez-vous
d'afficher les lettres
postées en premier, puis les plus anciennes. Je sais que vous pouvez le faire, essayer et ensuite,
quelle est la solution. Voyons maintenant rapidement
la solution. Donc, ici, dans notre itinéraire de publication, nous ajoutons un autre
point de routeur GDNDPoEndpoint, disons, slash Ici, nous ajoutons également Osmidalware et une fonction
de
rappel ASN Osmidalware et une fonction
de
rappel ASN avec demande et réponse. Ici, nous devons obtenir
des paramètres carrés, qui nous donneront une
page et une limite Le deuxième objet est égal
à la requête par points. Et ici, nous obtenons la page et la limite. Nous pouvons également définir la valeur par défaut de
cette page et sa limite. Donc, passez à une page et
limitez-vous à dix. Si dans le paramètre de requête, nous passons autre chose, cela remplacera
ces valeurs. De plus, comme nous le savons, lorsque nous obtenons des valeurs à partir du paramètre de
requête, ces valeurs sont des chaînes, nous devons
donc
les convertir en entiers. Donc, ici, au lieu du coût, nous écrivons let, et après cela, page est égale à parse integer, page, et après cela, limit est égale à
parse integer, Nous pouvons maintenant ajouter une requête pour le post. Donc const, post est égal
à wait, post point find. Ici, nous passons à Object user pour
requêter l'identifiant
point user point underscore Et ici nous ajoutons la méthode Skip. Cette page moins une dans la limite, et nous sommes aussi une méthode de limite, et nous passons ici cette limite, et nous allons également tracer cette ligne. Et puis à la fin, nous renvoyons simplement le point de
réponse Json et passons ici ce post. Essayons maintenant cette
implémentation. Enregistrez ce fichier et ouvrez Postman. Ici, nous dupliquons cette demande, changeons son nom en message d'utilisateur
connecté. Modifiez également la méthode
pour obtenir une URL vers l' API post slash MI Post
et envoyez la demande Tu vois, nous avons reçu le message. Actuellement, nous
n'avons qu'un seul article, et c'est pourquoi nous n'en avons qu'
un seul, donc cela fonctionne. De plus, pour améliorer cette
requête, nous pouvons faire une chose. Passez la variable, qui indique notre interface que la prochaine
page est disponible ou non. C'est vraiment simple. Donc, fois que nous avons reçu notre message, nous créons une nouvelle variable appelée une page suivante égale à here we pass condition si la longueur de
ce point de publication est égale à la limite actuelle, alors il est possible qu'il y ait une page suivante pour le post, donc nous passons ici true si la taille du message actuel
est inférieure à la limite, alors dans le cas contraire, nous passons false. C'est une logique vraiment simple. Maintenant, dans la réponse Json, nous devons passer
un objet, un post à un autre. Page par page, limite, limite, et comme
page suivante pour passer à la page suivante Enregistrez les modifications
et jetez-y un œil. Envoyez à nouveau la demande. voyez, ici, nous recevons un message, et si nous faisons défiler la page vers le bas, nous arrivons à une page suivante qui tombe parce que
la limite de pages actuelle n'est pas complète. Dans la leçon suivante,
nous verrons comment obtenir des publications pour notre page d'accueil
sur les réseaux sociaux.
176. Comment entrer en ligne de mise: Créons une API
pour obtenir le message, que nous pouvons afficher sur l'écran d'
accueil lorsque l'utilisateur
ouvre notre application. Ici, nous ajoutons un autre point de
routeur GAD et pointons vers une barre oblique,
car sur la page d'accueil, l'utilisateur verra le message qui l'a
suivi Ici, nous avons également besoin d' Osmidleware car nous avons besoin des utilisateurs
actuels qui suivent liste et d'une fonction de
rappel fonction de
rappel Tout d'abord, dans cette API, nous devons trouver la
liste suivante des utilisateurs actuels. Seconds user
équivaut à wait user, point fin par identifiant, et ici nous passons l'identifiant request
point user point underscore ID Ici, nous voulons uniquement
suivre le remplissage, donc sélectionnez un point, et nous passons
ici les codes suivants. Ici, nous obtenons trois lignes, ce qui signifie que la
saisie automatique ne fonctionnait pas. Permettez-moi de saisir ce
modèle d'utilisateur en haut. Le coût par utilisateur est égal à celui requis. Ici, nous allons dans un dossier par
modèles et passons aux utilisateurs. Bien. Maintenant, pour la requête de publication, nous pouvons définir une variable séparée. Let query est égal à object. À l'intérieur de celui-ci, nous passons l'utilisateur, et nous
ajoutons à nouveau des crochets Nous pouvons maintenant utiliser l'
opérateur Mongo Deb appelé $1 in, qui est utilisé pour vérifier la valeur de
l'élément dans le tableau Ici, nous passons le point
suivant à l'utilisateur, qui est un tableau. En gros, cela signifie
que les
utilisateurs disponibles sont publiés dans le tableau
utilisateur point suivant. Maintenant, à partir de là, nous pouvons
simplement obtenir post, donc Const, post est égal à await, post, point find, et
ici nous ajoutons notre requête De plus, avec cela, nous devons renseigner l'utilisateur qui a
téléchargé ces publications Donc, remplissez les points et ici nous passons le champ renseigné par
l'utilisateur au deuxième paramètre, nous passons les champs que nous voulons Donc, l'identifiant du score, le nom d'utilisateur
et le nom du profil. Si nous avons une photo de profil, nous pouvons également
la renseigner ici Ensuite, nous allons ajouter un court. Ici, nous passons les objets avec la propriété
created at, et nous les photographions par ordre
décroissant, donc passons moins un Grâce à ceux-ci, nous recevons d'abord un nouveau message. Actuellement, nous n'avons pas implémenté fonctionnalité de
pagination dans cette
requête, mais dans le monde réel, nous avons besoin d'une fonctionnalité de pagination
car dans le monde réel, il peut y avoir des centaines
ou des milliers de publications Pour le moment, nous ne pouvons pas envoyer
tous les messages en une seule demande. Cela ralentira notre serveur. Ici, nous avons besoin d'une fonction de
requête infinie en haut, add let object est égal
à request point query, et ici nous déstructurons
la page égale à un, et la limite est égale à dix Il s'agit des valeurs par défaut. Nous devons également
les convertir en nombre entier. La page est égale à l'
analyse d'un entier à la page et la limite est égale
à l'analyse d'un entier, d' Maintenant, dans notre requête, nous ajoutons la méthode
Skip et passons ici la page moins l'os dans la limite. Et nous ajoutons également la méthode limit, et nous passons ici la limite, et aussi à la fin, nous ajoutons la méthode len. Maintenant, tout va bien, mais il y a un petit
problème dans cette API. Permettez-moi de vous expliquer
cela à l'aide de l'exemple. Supposons ici que nous ayons 20 publications et notre utilisateur envoie
une demande d'API pour la publication. Notre API envoie ces dix
premiers messages. Maintenant, lorsque l'utilisateur
regarde ce message,
il est possible que
tout utilisateur suivant puisse ajouter un nouveau message
dans la base de données. Supposons que les cinq
utilisateurs suivants téléchargent cinq nouveaux messages. Maintenant, lorsque
l'utilisateur actuel souhaite voir plus de demande de publication avec le paramètre de requête de
page deux. À ce moment-là, notre requête
ignorera les dix premières données de la base de données, car la page
deux affichera cet article. Ici, nous pouvons voir une duplication du message car ces cinq
articles ont été ajoutés récemment, et c'est le problème. Maintenant, quelle est la solution ici ? Nous pouvons utiliser ici la pagination
basée sur le curseur. Laissez-moi vous expliquer
en termes simples. La pagination basée sur le curseur signifie que nous allons récupérer le message
en fonction de l'heure Par exemple, voici
l'utilisateur h il est sur la page d'accueil et envoie des
demandes pour les dix premiers messages. Maintenant, depuis le backend,
nous enverrons dix messages et nous enverrons également le dernier
message créé à ce moment-là. Maintenant, lorsque Harley veut dix
autres messages, il enverra le
dernier message créé à
ce moment-là, que nous avons appelé curseur Vous pouvez maintenant vous demander pourquoi
nous avons besoin de ce curseur. Nous allons utiliser ce
curseur dans notre requête. Trouvez dix autres publications dont le temps de création est
inférieur à ce temps de curseur. De cette façon, nous n'
obtenons pas de double publication et notre pagination
fonctionnera parfaitement. Cette technique est appelée pagination basée sur
le curseur. Cette technique est
très souvent utilisée lorsque les données que
nous voulons s'ajoutent très
rapidement, comme sur les réseaux sociaux. Implémentons maintenant
cela dans notre requête. Tout d'abord, nous allons
renvoyer le curseur dans la réponse afin que vous puissiez bien la
comprendre. Ici, après notre requête, nous ajoutons que le coût
du curseur suivant est égal à. Ici, nous passons à la condition longueur du point du
message soit
supérieure à zéro. Si c'est vrai, alors nous retournons le
dernier message créé à la Tate. Donc, le poteau, le crochet, longueur du point du
poteau moins un. Ainsi, nous obtenons le dernier message, point créé à, nous renvoyons null. Maintenant, à la fin, nous ajoutons point de
réponse Json,
ici nous ajoutons un objet,
un article par un article et
le curseur suivant au curseur suivant. Bien. Maintenant,
ajoutons ce curseur dans notre requête, car c'est la raison pour laquelle nous
envoyons ce curseur. Ainsi, lorsque nous envoyons ce
curseur suivant au front-end, notre front end
enverra ce curseur suivant dans la prochaine demande de publication. Ainsi, dans le corps ou le paramètre de
requête, nous obtenons le curseur
qui envoie le front end. Maintenant, il suffit d'ajouter
ce curseur dans notre requête. Ici, la requête créée à est
égale aux crochets Coli. Ici, nous passons l'opérateur dollar LT, qui est inférieur à,
et nous passons ici une nouvelle date. Et ici, nous passons le curseur. Maintenant, nous devons
gérer la situation de brûlure. Première demande de publication,
il n'y aura pas de curseur. Nous passons donc ici la condition
si le curseur est
disponible, puis nous ajoutons ce qui
a été créé dans la requête. Donc, sans curseur, notre
requête ressemblera à ceci. Et avec le curseur, notre requête ressemblera à ceci, aussi
simple que cela. Nous pouvons également passer ici
à la propriété de la page suivante. Copiez donc cette ligne de l'API précédente et
collez-la dans notre API. Et à la fin de l'objet de
réponse, nous ajoutons la page hasNext
à la page suivante hass Passons maintenant à cette
implémentation. Ouvrez Postman, dupliquez
cette dernière requête. Changez son nom en
getting following, post. De plus, nous changeons l'URL en API après la barre oblique
et envoyons la demande voyez, ici, nous ne recevons pas de message parce que notre utilisateur actuel l'
a téléchargé, pas aucun de ses abonnés. Ici, nous devons ajouter
un autre jeton d'utilisateur. Accédez à l'API de connexion, connectez-vous avec un autre compte
utilisateur. Quels sont le nom d'utilisateur et le
mot de passe d'un autre utilisateur ? Je dois me rappeler que oui, c'est h001 et le mot de passe
est défini sur 128 Oui, récupérez ce jeton, copiez-le, et dans notre
API actuelle dans l'en-tête, nous remplaçons ce jeton
et envoyons la demande. Pourtant, nous ne recevons pas de courrier. Laissez-moi vérifier qui suit qui. Oh, ici, personne ne suit personne. Donc, pour créer ce fichier, je copie cet identifiant utilisateur actuel, auquel nous nous sommes connectés, et je le modifie dans les abonnés
de l'utilisateur précédent. Copiez également cet ID utilisateur,
ajoutez-le à la liste actuelle des utilisateurs
suivants et mettez-le à jour. Maintenant, envoyons à nouveau
cette demande. Ici, nous recevons le message, et nous obtenons également le curseur suivant, qui est le curseur créé à
la date du dernier message et dont la page
suivante tombe, cela signifie qu'il
fonctionne correctement.
177. Suppression de la publication: Créons une API
pour supprimer la publication,
donc Router, point delete, et nous ajoutons ici une barre oblique, une
colonne, un identifiant de publication, qui
est le paramètre de requête Nous avons également besoin d'un intergiciel car seuls
les utilisateurs autorisés peuvent supprimer leur publication Enfin, nous ajoutons une fonction de rappel
ASN avec
demande et réponse Bien. Maintenant,
tout d'abord, dans cette fonction, nous obtenons que const post ID est égal
à request point
PRMs, point post De plus, nous obtenons que cost
userid est égal à request point user
point underscore Maintenant, dans cette API supprimée, nous avons averti que seul l'utilisateur qui a créé le
message peut supprimer le message. Pour cela, nous devons
trouver l'utilisateur de ce post. Le coût du post est égal à
wait post point Fine By ID. Et ici, nous transmettons l'identifiant postal. Nous passons la condition I
post is not available, puis nous renvoyons la réponse
avec le code d'état 404, et dans Jason, Object, propriété du
message
2, message introuvable. Et si nous trouvions du courrier ? Ensuite, nous devons vérifier que l'utilisateur
actuel est l'auteur de
ce message ou non ? Donc, si post point user, qui est l'ID de l'objet à sring, n'
est pas égal à l'ID utilisateur, nous renvoyons à nouveau une
réponse avec code d'
état 403 en cas
d'erreur non autorisée dans le Jason, nous ajoutons un objet avec propriété de
message non autorisé
à supprimer ce message Et si l'utilisateur et l'
auteur étaient également les mêmes ? Dans ce cas, nous devons d'
abord supprimer
les images ou les vidéos
de cette publication, puis nous pouvons supprimer
le document de publication, n'est-ce pas ? Ici, nous devons exécuter pour chaque boucle car
notre support est un tableau, supposé point média point pour chacune. Ici, nous obtenons un objet à fichier unique, une fonction
flèche, et ici nous
exécutons notre logique pour chaque fichier. Tout d'abord, nous avons besoin
du chemin de fichier de l'image ou de la vidéo
car ce n'est que par ce que
nous pouvons supprimer ce fichier.
C'est vraiment simple. Pour le chemin, nous avons besoin du module path. Le chemin Const est donc égal
à require path, qui est le
module intégré du nœud Maintenant, en bas, le
chemin du fichier de coûts est égal à path dot join. Tout d'abord, nous ajoutons un trait de
soulignement Dname et une virgule nous
ajoutons le nom du point du fichier, qui est une propriété du nom Je ne suis pas sûr de cette voie. Nous allons donc consulter le
journal à points de ce chemin de fichier. Et en bas, nous renvoyons simplement
le point de réponse json, Object with measured
property, post, supprimé avec succès juste
pour avoir vérifié ce chemin. Enregistrez ce fichier et ouvrez Postman. Ici, nous
dupliquons cette publication d'
utilisateurs connectés , car dans cette API, nous avons un jeton de l'utilisateur
qui a créé cette publication. Ici, nous changeons le nom de l'
API pour supprimer, publier, modifier
la méthode,
pour supprimer, et dans le point de terminaison de l'API, nous le changeons en ID de publication de
l'API. Copions également l'ID de publication de
l'API précédente,
envoyons la demande, et ici en
bas, nous obtenons l'identifiant, copions et le collons
dans notre point de terminaison d'API. Et envoyez la demande. Vous voyez, ici, le message est
supprimé avec succès. Et si nous vérifions notre terminal, voyez, nous obtenons ici le chemin du fichier. Ignorez le premier chemin car c'est un
soulignement, Juste pour voir ici, nous obtenons
slash routes slash filename, qui est
le chemin de notre dossier actuel, mais nous ne voulons pas ajouter de Ici, entre le
nom de la date et le nom du fichier, nous ajoutons des codes doubles
, point, point. Enregistrez ce fichier et
envoyons la demande. Dans le terminal de code VS, C, la route est supprimée. Il ne nous reste plus qu'à ajouter une barre oblique à la publication, car il
s'agit du chemin de notre Avant ce nom de fichier, nous ajoutons des barres obliques pour les téléchargements,
enregistrons les modifications et
renvoyons la demande Si nous vérifions notre terminal, nous obtenons ici le chemin de notre fichier. Voici donc comment vous pouvez goûter
le code à l'aide de la console. Je le fais toujours
quand je suis confuse. Je commente simplement la logique
de la base de données ,
puis je goûte à l'API. Ainsi, nous n'avons pas besoin de
créer et de supprimer des données
de la base de données. Nous obtenons donc ici le chemin du fichier. Il ne nous reste plus qu'à supprimer
ce fichier à l'aide du module de fichiers. Nous l'avions déjà fait dans
notre projet précédent. Alors voilà, supprimez la
console et ajoutez-la ici, essayez de bloguer. Et dans le cache, nous ajoutons une erreur de point de
console dans Batis, nous transmettons une erreur lors
de la suppression du fichier, crochets
dollar Coli, du chemin du fichier, et nous enregistrons également cet objet d'erreur Maintenant, dans le drilog,
nous attendons simplement fs point unlink et
nous passons ici Pour utiliser await, nous devons
rendre cette
fonction de rappel asynchrone, et nous devons également importer
Fs depuis le module intégré Const Fs équivaut donc aux promesses require Fs car
la suppression du fichier est une opération asynchrone Et après avoir retiré le
fichier du serveur, nous pouvons supprimer le document postal. Alors attendez le point de publication,
supprimez-en un car nous récupérons déjà le
message en haut. Et c'est fait. Enregistrez les gènes et renvoyez
la demande de suppression. Voyez ici, nous pouvons le publier,
le supprimer avec succès. Et si nous vérifions nos
fichiers Bend dans le dossier de publication, les
images sont également supprimées.
178. L'article aimer et ne pas l'être: Créons une API pour
et contrairement à la publication. C'est vraiment simple. Si dans le tableau, l'ID utilisateur n'est pas disponible, alors nous ajoutons l'ID utilisateur,
ce qui signifie que nous aimons la publication, et si l'ID utilisateur est
déjà dans le tableau L,
alors, contrairement à la publication, nous devons simplement supprimer
l'ID utilisateur de ce tableau. Ajoutons une page à points au routeur. Ici, nous ajoutons un point de terminaison
à la colonne oblique, ID de
publication, à la barre oblique L. Il s'agit la même API que nous utiliserons
pour la publication et à la différence Virgule ORT est une fonction de rappel
avec demande et réponse. Maintenant, d'abord, nous obtenons que l'ID de
publication est égal aux
PRM à points de demande, à l'ID de publication à points,
et nous obtenons également que l'ID d'utilisateur de coût est égal
à
l'ID de soulignement point de l'utilisateur à points de soulignement de
point de la demande Maintenant, d'abord, nous trouvons
le message, donc Const, post est égal à wait
post point Fine By ID, et pass post ID Après cela, nous vérifions l'état. Si la publication n'est pas disponible, nous renvoyons une réponse
avec le code d'état 404, et dans le Jason, nous passons l'objet avec la propriété message
à la publication introuvable. Maintenant, si le message est disponible, nous
vérifions que l'utilisateur
aime déjà le message ou non. Donc, Const déjà aimé
équivaut à publier des points likes, points inclus, et nous passons
ici un identifiant utilisateur Maintenant, sur cette base, nous pouvons passer la
condition, le coût, la mise à jour, la
publication est égale à huit, la
publication par identifiant et la mise à jour. Tout d'abord, nous transmettons l'identifiant du message, et pouvez-vous me dire ce que nous allons transmettre dans le
deuxième argument ? Bien, nous transmettons les mises à jour. Nous passons donc ici à la condition. J'ai déjà aimé, c'est vrai, alors il faut supprimer le j'aime. Pour cela, dans object, nous utilisons l'opérateur Mongo Di Be, qui est l'attraction du dollar vers l'objet Et ici, nous ajoutons des
likes à l'identifiant utilisateur. Et si déjà liké est faux, on passe ici a et
ici dans l'objet, on ajoute une autre méthode Mongoib, dollar at to set to object, is to user ID La raison pour laquelle nous ajoutons here at to set il n'ajoutera un
identifiant utilisateur que s'il n'est pas disponible, cela ne dupliquera pas
l'identifiant utilisateur en s. Maintenant, au troisième argument, nous passons l'objet avec new à true. Cela nous donnera des données mises à jour. À la fin, nous renvoyons simplement point de
réponse Json Object
avec la propriété du message. Ici, nous vérifions l'état. J'ai déjà aimé, c'est vrai,
puis nous passons ici, publions contrairement à d'autres, nous
transmettons des messages comme et nous pouvons
aussi renvoyer des likes à la
mise à jour des points
likes point likes point Length. Vous pouvez renvoyer la valeur que vous souhaitez renvoyer depuis l'API. Passons maintenant à cette API chaque semaine. Un facteur, nous devons d'abord
créer un nouveau message car
dans la leçon précédente, nous avons supprimé notre seul
et unique message Accédez à l'API de création de publication et
envoyez la demande. Ici, nous obtenons une erreur de publication, nous devons
donc sélectionner à nouveau
les images. Et envoyez la demande. Vous voyez,
ici nous recevons un nouveau message, copiez son identifiant. C'est ce dont nous avons besoin. Maintenant, dans notre dossier de publication, nous créons une nouvelle requête
appelée L et différente de la publication. Changez la méthode en page, et le point de terminaison en SDDP, double
colonne pour notre hôte local
slash, colonne 3 000 slash
API slash post, et ici nous Dans l'en-tête, ajoutez également
une clé d'autorisation et une valeur à l'espace
porteur, copiez
le jeton depuis l'API de connexion,
collez-le simplement dans notre API
et envoyez la demande Vous voyez, nous recevons des likes
et les likes comptent pour un. Maintenant, envoyez à nouveau la demande. Vous voyez, nous obtenons le nombre de likes et les likes comptés jusqu'à zéro, donc ça marche.
179. Implémenter la fonctionnalité des commentaires: De nos jours, dans presque
toutes les applications de réseaux sociaux, il existe des fonctionnalités permettant
d'ajouter des commentaires sur la publication. C'est le moyen d'engager
les gens pour cette publication. Implémentons également des
fonctionnalités de commande pour notre article. Tout d'abord, la question est où nous sommes au commandement ? Nous devons ajouter une commande
dans le schéma. Donc, sur le fichier modèle de publication, et ici en bas, ajoutez des commandes, qui sont
le tableau d'objets. Maintenant, au lieu d'écrire le schéma
complet ici, nous pouvons créer un
schéma séparé pour les commandes, puis ici nous ajoutons une référence. Cela ne nous embrouille pas. Donc, avant ce schéma, nous ajoutons un schéma de commentaire constant égal au nouveau schéma de points
Mongoose, et ici dans l'objet, nous passons le schéma de
commentaire unique Tout d'abord, nous avons besoin
ici d'utilisateur à objet, taper dans le schéma de points de Mongo, de type
point point d'ID d'objet, faire référence à l'utilisateur
et également de faire référence à True Ensuite, nous avons besoin du texte pour l'objet, type pour la chaîne, et nous
rendons également obligatoire True. Ensuite, nous devons être créés à, qui est le moment où cette
commande particulière a été créée. Tapez donc à date et
par défaut à point de date maintenant. Maintenant, comme nous le savons, dans les médias sociaux, l'utilisateur peut répondre à la commande d'un
autre utilisateur. Devons-nous ajouter ces
fonctionnalités de réponse dans notre Linky fi ou non ? Faisons-le également. Pour les réponses, nous ajoutons une autre réponse remplie, qui est un tableau, et
dans ce tableau, nous devons définir un
schéma pour chaque réponse. Ne vous inquiétez pas, c'est la
même chose que cette commande. Copiez simplement ces trois
propriétés et, dans ce tableau, ajoutez un objet et collez-le ici. Assurez-vous de l'ajouter
dans l'objet, sinon cela nous
donnera une erreur. Nous avons maintenant le schéma de commande. Nous pouvons simplement l'ajouter en
bas du schéma, maintenant nous pouvons facilement
voir le schéma de publication sans nous tromper. Créons maintenant une API pour ajouter la nouvelle
commande à la publication. C'est vraiment simple. Nous ajoutons donc ici le point du routeur
et les commandes point à point, colonne oblique, identifiant de
publication, barre oblique Ici, nous avons également besoin d'un logiciel
orthomiddal et d'une fonction
de rappel ASN Tout d'abord, nous
obtenons que le coût de l'identifiant de poste est égal à l'identifiant du point de publication
du point PRM de la demande De plus, nous obtenons que Cost
UserId est égal à request point user
point underscore Ensuite, nous obtenons également que le texte Const
est égal au texte du point du corps du point de la demande Avant de faire quoi que ce soit, nous
vérifions d'abord si le texte n'est pas disponible, puis nous renvoyons simplement la réponse avec le statut 400 et moi Jason, nous passons l'objet avec propriété du
message au
commentaire, le texte est obligatoire. Maintenant, si nous avons un texte de commande
, nous devons simplement
créer une nouvelle commande. Donc, coût, un nouveau commentaire
est égal à un objet, et à l'intérieur, nous devons passer d'utilisateur à ID utilisateur et de texte à texte. Nous n'avons donc pas besoin de transmettre la date de
création car nous transmettons
déjà la date actuelle comme valeur
par défaut dans notre schéma. Nous devons maintenant placer
ce nouvel objet de commentaire dans
le tableau des commentaires des articles Pouvez-vous me dire quelle
méthode nous allons utiliser ? Oui, nous pouvons l'utiliser ici, par
identifiant et par mise à jour. Le coût de publication est égal à wait, post, point, fine by
ID et update. À la première position, nous ajoutons un identifiant de publication. À la deuxième position, nous devons adopter ce que
nous voulons mettre à jour. Maintenant, pour envoyer la nouvelle commande, nous utilisons la méthode dollar push. Ici, nous ajoutons des
crochets Cully et des commandes à ce que nous voulons envoyer avec cette nouvelle commande Et au troisième argument, nous passons l'objet avec new à vrai. Maintenant, pouvez-vous me dire pourquoi nous n'utilisons pas here at pour définir la méthode ? C'est vrai, car at to set
n'autorise pas les valeurs dupliquées. Mais ici, la commande
peut être dupliquée. Un utilisateur peut
attribuer des commandes. Nous ne pouvons pas le nier,
et c'est tout. À la fin, nous renvoyons la réponse
avec le code d'état 201. Nouvelles données, et nous renvoyons un objet JSN avec la propriété de message pour que le commentaire soit ajouté avec succès Et comme nous pouvons envoyer un commentaire pour publier les commandes point
dans un paquet carré, les commandes
post point
Length moins un, qui est la dernière
commande que nous avons ajoutée et exécutée. Maintenant, procédons à cette
implémentation. Ouvrez Postman et dupliquez
cette API, changez le nom. Pour créer une nouvelle commande. Modifiez la méthode pour publier, pointez également sur
les commandes post ID et envoyez la demande. Vous voyez ici que nous obtenons une erreur
parce que nous ne transmettons pas de texte. Dans le corps, on passe à raw et on ajoute
ici un objet
avec une propriété de texte. Que dois-je commenter ? Oui,
c'est un excellent produit. Ici, vous pouvez ajouter n'importe quelle commande.
Maintenant, envoyez la demande. Vous voyez ici que nous obtenons une commande, éditons avec succès, et ici
nous obtenons également des lettres de commande. Dans la
leçon suivante, nous allons créer une API pour ajouter une réponse
à cette commande.
180. Ajouter une réponse aux commentaires: Créons maintenant une API pour
ajouter une réponse à
une commande spécifique. C'est une
API très similaire à la précédente, donc routeur point post, barre
oblique, identifiant de publication de
colonne, commandes slash ,
slash ici, nous avons également
besoin d'un identifiant de commentaire car dans quelle commande l'utilisateur souhaite ajouter une réponse,
nous devons la trouver Et après cela, slash les réponses. Faites défiler l'écran vers le haut, copiez l'intégralité de
cette API avec OT
et collez-la dans notre API. Bien. Maintenant, nous devons
changer de petites choses ici. Tout d'abord, dans les paramètres, nous obtenons également un identifiant de commentaire Déstructurons les paramètres de la
requête en points, et nous obtenons ici l'ID de commande Maintenant, à la place du nouveau commentaire, nous le nommons nouvelle
réponse et en bas, nous allons changer la méthode
pour en affiner une et la mettre à jour. Lorsque nous utilisons fine one et update, nous devons lui transmettre son objet de
condition dès le premier argument. À l'intérieur de celui-ci, nous passons un identifiant de
soulignement à un identifiant de publication. Et nous lui transmettons également son
état, les codes doubles, les
commentaires, les points de soulignement, les
identifiants des commentaires Assurez-vous d'écrire
le bon nom de propriété,
car il distingue les majuscules et minuscules. De plus, vous pourriez demander que
nos commentaires sont un tableau, et ici nous écrivons des commentaires avec un point de soulignement
, est-ce que cela fonctionnera ? La réponse est oui, cela fonctionnera car
dans Mongo Di B,
nous utilisons cette notation
par points, nous utilisons cette notation
par points, qui nous permet qui nous permet de parcourir le
tableau des commentaires et de trouver le premier objet où
l'ID de soulignement correspond à l'
ID de commande Maintenant, dans la méthode push,
à la place des commandes, nous ajoutons des
commentaires, des points et des réponses Ici, nous pouvons utiliser les commentaires point dollar point
rep. Maintenant, vous vous demandez peut-être quelle est la différence entre les réponses à points de
commentaires et les
commentaires à points de dollars RPS L'opérateur commens dollar est donc optimisé pour cibler un élément spécifique
dans un tableau autre côté, les réponses par points de
commentaires sont destinées au champ général. Laissez-moi vous expliquer par un exemple. Supposons que ce message
comporte dix commentaires et que nous voulions ajouter une réponse
à ce second commentaire. Maintenant, si nous utilisons ici les réponses
par points de commentaire, cela ajoutera une réponse
à toutes les commandes Nous ne voulons pas que,
d'un autre côté, si vous utilisez ici les commentaires
point dollar point réponses, cela ajoutera une réponse
uniquement à la deuxième commande,
et c'est ce que nous voulons. Rappelez-vous toujours que si vous souhaitez
mettre à jour un élément
spécifique d'un tableau imbriqué, vous
devez ajouter un
opérateur dollar entre eux Comme les commentaires, point
dollar, point, réponses. Ce dollar est
appelé opérateur positionnel. En bref, dans Mongo DB, notation par
points fonctionne pour rechercher
et supprimer des éléments, et un opérateur positionnel est nécessaire pour modifier les éléments du
tableau Maintenant, dans notre méthode de mise à jour, nous changeons ce nouveau
commentaire en une nouvelle réponse. Et à la fin, nous changeons le message pour répondre, modifions avec succès, et nous envoyons simplement cette nouvelle
réponse dans notre réponse. Donc, au-dessus de celles-ci, nous
ajoutons cost comment is equal to post dot commands,
qui est le tableau. Maintenant, pour obtenir la commande
spécifique, nous devons trouver son index. Au lieu de cela, dans Mongoose, nous avons une autre
méthode appelée point ID Cela nous aidera à trouver un sous-document à l'aide de son champ
ID de soulignement dans le tableau Nous devons juste transmettre
ici l'identifiant du commentaire, mais assurez-vous d'ajouter un
point de commentaire. L'identifiant est la méthode des mangues Sinon, à l'avenir, vous serez confus
en regardant ce code. Dans la réponse au lieu
de commande, nous ajoutons une réponse,
et nous passons ici la
commande, les réponses par points, les
crochets, la
commande, les réponses par points, longueur du
point moins un. Nous obtenons ainsi la dernière
réponse que nous ajoutons simplement. Enregistrez les modifications,
et redécouvrons
cette API dans Postman. Ici, nous dupliquons
cette
API de commentaires , changeons son nom pour
ajouter une nouvelle réponse. Maintenant, dans le point de terminaison, après les commandes,
nous devons ajouter un identifiant de commentaire. Copions l'identifiant du commentaire de
l'API précédente et
collons-le dans notre API. Après l'identifiant du commentaire, nous
ajoutons des réponses avec barre oblique. Maintenant, changeons également le texte de
réponse pour vous remercier beaucoup et envoyons la demande. Ici, nous recevons le message de
réussite et nous recevons également la dernière réponse. Vous pouvez donc voir à quel point c'est simple.
181. Exercice - Supprimer un commentaire spécifique: Il est maintenant temps de faire un
peu d'exercice. Dans cet exercice,
vous devez créer une nouvelle API pour supprimer la commande spécifique
de la publication. Notre APIURL ressemblera donc cette API slash
slash post ID,
slash command, slash command ID,
et vous devrez supprimer cette commande avec cet ID de
commande Assurez-vous également que seul
l'utilisateur qui a téléchargé cette publication ou l'utilisateur qui a ajouté cette commande peut
supprimer cette commande. Tous les utilisateurs ne peuvent pas supprimer
des commandes. C'est vraiment simple. Je sais que vous pouvez le
faire, essayer, puis
regarder la solution. J'espère que vous aurez résolu cet exercice, et même si vous êtes coincé quelque part, ne vous
inquiétez pas, essayez au moins. C'est ce qui compte le plus. Voyons maintenant rapidement la
solution pour cet exercice. Ici, nous dupliquons simplement cette dernière API car
elle est très similaire. Tout d'abord, nous changeons
la méthode de suppression. De plus, depuis le point de terminaison, nous supprimons les réponses par barre oblique
car nous n'en avons pas besoin Maintenant, dans la fonction, d'abord, nous n'avons pas besoin de ce texte. De plus, nous n'avons pas besoin de
cette condition, et nous n'avons pas non plus besoin de
cette nouvelle variable de réponse. Dans la méthode fine
et mise à jour, nous devons ajouter notre condition. premier est donc l'identifiant de
soulignement de l'identifiant du message, et maintenant, pour trouver la commande, nous devons nous assurer que l'utilisateur de connexion
actuel doit
être l'auteur de la publication, ou qu'il doit être l'
auteur de la commande Nous utilisons donc ici
dollar ou opérateur, et il s'agit d'un ensemble de conditions. Objet, objet. Ici, notre première condition doit écrire ou la deuxième
condition doit écrire. Tout d'abord, nous vérifions que l'utilisateur
actuel est l'auteur
du message ou non. Ici, nous ajoutons une
colonne utilisateur, un ID utilisateur, et pour la deuxième condition, dans un autre objet,
nous passons des codes, des points
virgules soulignés ID à l'
ID du commentaire, des
codes, des commentaires à l'identifiant de
l'utilisateur deux utilisateurs Ce que nous voulons faire si l'une de
ces deux conditions est vraie. Nous voulons extraire cette commande
du tableau de commandes. Ici, sur le lieu de poussée, nous utilisons l'opérateur de traction et le champ à partir duquel
nous voulons tirer. Oui, nous voulons
extraire des commandes, et nous passons ici la condition, savoir quel élément nous voulons extraire. Ainsi, dans l'objet, nous passons d'
un identifiant valide à un identifiant de commentaire. Maintenant, nous n'avons plus besoin de cette
variable de commentaire , et dans la réponse, nous renvoyons simplement un message, un
commentaire, supprimé avec succès. De plus, nous renvoyons des commandes pour publier des commandes à points
et c'est tout Ici, ce que je pense que nous devrions
vérifier est trouvé ou non. Sinon, nous recevons directement ce message sans
procéder à aucune suppression. Donc, avant cette réponse, nous ajoutons « Je publie n'est pas disponible », puis nous renvoyons la réponse
avec le code d'état 403, et dans le Jason,
nous transmettons un message à une personne non autorisée ou publions
un commentaire introuvable. Sera utile. Enregistrez les modifications et testons cette
implémentation. Revenons à Postman Et ici, dupliquons
ce test d'API de réponse, changeons le nom en supprimant une commande ou une
méthode spécifique à supprimer. Et dans le terminal,
il suffit de supprimer ces réponses
et d'envoyer la demande. C commentez-le avec succès, et si nous envoyons à nouveau
la même demande, voyez, ici, nous n'avons pas trouvé
d'erreur, donc cela fonctionne Comme vous pouvez le constater, la création d'une
API n'est pas difficile. Si la logique est claire pour vous,
vous pouvez créer
n'importe quel type d'API. Il existe désormais de nombreuses autres
API pour les publications et les commentaires. Nous ne les créons pas toutes car, comme vous pouvez le constater, c'est répétitif et si je vous
montre toutes les API une par une, cela vous ennuiera également. Vous pouvez définir des API en fonction
des besoins de votre projet. Cela dépend entièrement de vous.
182. Gestion des erreurs: Actuellement dans notre projet, nous n'avons pas ajouté de gestion des erreurs. J'ouvre donc ici notre projet
précédent, Card Wish, et à partir
du fichier index point JS, nous copions simplement cette
variable d'enregistrement
ainsi que les deux gestionnaires d'erreurs.
Dans notre dossier InkIfIPject
in Config,
nous créons un nouveau fichier appelé
logger point js et Dans notre dossier InkIfIPject
in Config, nous logger point Maintenant, dans ce fichier, nous avons
besoin de cet objet Winston. Donc, dans le terminal, nous écrivons
NPM, installons Winston, au taux 3,17 0,0, et nous avons également besoin de
Winston MongoDB,
au taux 6,0 0,0, et de Bien. Maintenant, au sommet, le coût, Winston est égal à avoir
besoin de Winston Et nous devons également ajouter require Winston Mongo DB pour la
connexion à la base de Maintenant, dans notre enregistreur,
nous devons modifier cette chaîne de base de données pour
traiter point nw point dB Et à la toute fin, nous modulons
simplement dot exports
is equal to logger Nous pouvons utiliser cet enregistreur
dans n'importe lequel de nos fichiers. Ainsi, dans le
fichier index dogs en haut, nous ajoutons Const logger
is equal to require Nous allons dans le dossier Config
et dans cet enregistreur. Maintenant, à partir du projet précédent, nous copions également cette
méthode de cache de Mongoose connect et la remplaçons
simplement par notre méthode de cache Ainsi, à partir du projet Cardwih, nous copions ce middleware
d'erreur personnalisé pour gérer les erreurs dans les demandes d'
API et le collons dans notre projet Linky fi
après De plus, ici, nous pouvons corriger les erreurs de
journalisation par points pour des raisons de simplicité. Vous vous demandez peut-être que nous n'avons pas besoin d'ajouter ces fonctions pour gérer les exceptions indésirables et les rejets
UnhandlePmise Oui, ici, nous n'avons pas
besoin de les ajouter dans notre fichier index dogs car lorsque nous importons un
enregistreur depuis un fichier loggers, ces deux méthodes
s'
exécutent automatiquement car elles sont
configurées globalement dans ce Et c'est pourquoi nous
obtenons ici un code propre. Vous pouvez donc voir à quel point c'est simple. De plus, j'ajoute toujours ce fichier journal dans
mon référentiel Github Ainsi, chaque fois que j'ai besoin de ce code de gestion des
erreurs, je peux l'obtenir directement. Mais pour comprendre
ce qu'il y a dans le code. Si vous le savez, vous pouvez utiliser n'importe quel code et le personnaliser. C'est tout pour cette section. Dans la section suivante,
nous allons découvrir fonctionnalités en temps
réel
très intéressantes. Rendez-vous dans la section suivante.
183. Section 15 Introduction: Bienvenue dans la 15e section
du cours ultime sans JS. Dans cette section, nous allons en
apprendre davantage sur la communication en
temps réel de notre back-end à notre front-end et également de notre front end à notre back-end. Cela va être amusant
car nous allons également goûter à notre implémentation avec
le front-end comme celui-ci. Imaginez que ce sont deux utilisateurs
d'ordinateurs différents et qu'ils discutent entre
eux sur notre application inkifi Découvrez à quel point cela fonctionne bien. Nos deux utilisateurs reçoivent des messages en temps
réel, et lorsqu'un utilisateur
tape un message, autre utilisateur reçoit
l'indicateur de saisie, ce qui fait de l'
expérience utilisateur un moment propice au chat. Nous allons également
implémenter le chat de groupe, ce qui permettra à plus
d'un utilisateur de discuter en groupe. Nous allons donc implémenter
ces fonctionnalités dans notre back-end et les déguster avec
le front-end. De plus, une chose
que je tiens à préciser, c'est que nous n'allons pas
créer un front-end à partir de zéro. C'est juste pour la dégustation, afin que vous puissiez savoir plus sur
ces fonctionnalités en temps réel. Je suis très enthousiasmé par cette
section et j'espère que vous l'êtes aussi. Commençons donc.
184. Créer un chat - Modèle de message: Pour créer l'API Jet,
nous devons d'abord créer une
collection ou un modèle Jet, quel que soit le nom que vous voulez lui donner. Ici, dans notre dossier de modèles, nous créons un nouveau fichier
appelé chats point js. Maintenant, à partir du modèle utilisateur
précédent, nous copions le code entier
et le collons ici. Bien. Maintenant, d'abord, nous changeons le
nom de la variable en schéma de discussion. Supprimons également tout ce qui
se trouve dans l'objet du schéma et changeons cet utilisateur
en chat et c'est fait. Définissons maintenant le schéma
du chat. Mais avant cela, laissez-moi
clarifier ce qu'est le chat ici. Le chapeau est comme une pièce dans laquelle deux utilisateurs ou plus peuvent
communiquer entre eux. En termes simples, sur Instagram, avez-vous vu sur le côté gauche que toutes les discussions sont raccourcies
en fonction du dernier message Ces remplissages sont du chat. Il peut s'agir de groupes ou de discussions individuelles. Ce dont nous avons besoin pour ces discussions. Actuellement, nous ne faisons que
mettre en œuvre le chat individuel,
alors ne vous inquiétez pas pour les fonctionnalités de chat de
groupe. Pense juste à un contre un. Ainsi, pour le chat individuel, nous pouvons créer un champ central, et nous pouvons également créer un champ
récepteur. Et pour les deux, nous ajoutons du type au schéma de points
de Monaco, des types de points, un identifiant d'objet
point et une référence à l'utilisateur Supposons donc que l'utilisateur A envoie
le message à l'utilisateur B. Nous ajoutons l'utilisateur A comme expéditeur
et l'utilisateur B comme destinataire. Voici maintenant un gros problème. Supposons maintenant que l'utilisateur B
envoie un message à l'utilisateur A. L'expéditeur sera
alors l'utilisateur B
et le destinataire l'utilisateur A. Cela créera un
nouveau document de discussion, et ces deux utilisateurs n'
auront pas le même chat pour se
parler. Maintenant, quelle est la solution ici ? C'est vraiment simple. Ainsi, au lieu de définir séparément
l'expéditeur et le destinataire
, nous pouvons leur ajouter un
champ unique. Comme ici, nous avions des participants, c'est-à-dire le tableau dans
lequel nous allons stocker le nom d'
utilisateur des participants. Entrez les types de points du
schéma de points Mongos, l'ID de l'objet
point et la référence de l'utilisateur Si l'utilisateur A envoie un
message à l'utilisateur B, alors nous avons l'utilisateur A et l'utilisateur B, les deux identifiants figurent dans le tableau des
participants, et si l'utilisateur B envoie un
message à l'utilisateur A, les deux identifiants sont également
disponibles chez les participants. De cette façon, nous
aurons un chat unique pour que l'utilisateur A envoie un
message à l'utilisateur B, ou que l'utilisateur B envoie
un message à l'utilisateur A. Ce remplissage de participants est utilisé pour récupérer des jets pour un utilisateur spécifique Maintenant, après les participants,
nous voulons la date et l'heure. Pour cela, nous pouvons simplement activer horodatages sur true,
et c'est Maintenant, vous pouvez vous demander
qu'en est-il des messages ? Pour les messages, nous allons
créer un autre modèle. Copiez donc ce schéma, et dans le dossier des modèles, nous créons un nouveau fichier
appelé messages point js et nous collons
ici ce schéma. Maintenant, d'abord, nous changeons le schéma de
chat en
schéma de message et le
modèle de chat en message. Bien. Définissons maintenant le
schéma d'un message unique. Donc, pour le message,
nous avons d'abord besoin de son identifiant de chat. Tapez donc sur le schéma
de points de Mongo, les types de points, le point, l'ID d'objet et la référence à la collection de
discussions, que nous venons de définir Ensuite, nous
ajoutons l'expéditeur qui a envoyé ce message et son type à l'ID de
l'objet et à la référence à l'utilisateur. Nous pouvons donc simplement le couper des participants et
le
coller pour l'expéditeur. Maintenant, nous n'avons plus besoin de
ces participants. Ensuite, nous avons le type de
contenu à chaîne, et nous devons avoir la valeur true. Il s'agit du contenu ou du texte du
message que
les utilisateurs souhaitent envoyer. Maintenant, après le contenu, ce que nous ajoutons, oui, nous avons besoin
du statut de ce message. Tapez une chaîne um vers un tableau, et nous définissons ici l'
ensemble de valeurs telles que send, delivered et read. Et par défaut, nous
définissons le statut d'envoi. À l'avenir, nous
mettrons à jour le statut lorsque notre message sera livré ou lu par d'autres utilisateurs,
et c'est tout. De plus, pour les messages, nous ajoutons horodatages aux vrais en oubliant
la date et l'heure Vous pouvez maintenant vous demander pourquoi nous n'
ajoutons pas ces messages
dans le modèle de chat. Nous pouvons créer des messages pour classer et définir tous les messages
avec le chat associé. Oui, nous pouvons le faire, mais
l'une des raisons pour lesquelles nous n'ajoutons pas messages dans le modèle de chat, c'est
parce que dans le modèle de messages, nous allons effectuer des ajouts, mises à jour et des suppressions de nombreuses fois. Nous ajoutons des messages dans
le modèle de chat, puis nous devons traiter des données imbriquées
très profondes, ce qui peut nous embrouiller De plus, si nous ajoutons
un tableau de messages dans le modèle de chat, lorsque nous ouvrons le chat, nous devons récupérer tous les
messages depuis le back-end, ce qui représente beaucoup plus de
données en une seule demande Ainsi, en séparant les messages, nous ne pouvons envoyer que les
dix ou 15 derniers messages, puis si l'utilisateur souhaite
voir les anciens messages de discussion, nous récupérerons autres messages en utilisant la technique de
pagination C'est pourquoi nous séparons
les messages du modèle de chat. Ici, dans le modèle de chat, nous pouvons également ajouter un remplissage supplémentaire. Dernier message, qui correspond au schéma de points de
Monaco, aux types de points
point ObjectID et à la référence
à notre modèle de message Ainsi, nous pouvons afficher
le dernier message avec chat et nous n'avons pas besoin de le
trouver dans la collection de
messages. Dans la leçon suivante,
nous allons créer une API pour obtenir la liste
des utilisateurs de jet for login.
185. Obtenir des discussions pour les utilisateurs: Créons une API pour obtenir la liste des jets pour les utilisateurs
connectés. Ici, dans le dossier routes, nous créons un nouveau fichier
appelé jets point js. Maintenant, d'abord, nous créons Router, donc Cs Router est équivalent
à require Express. Cette expression
renverra Express Object, et ici nous
obtenons simplement point Router. Il s'agit du code d'une seule ligne pour ces deux lignes que
nous utilisons jusqu'à présent. À la fin, nous l'
exportons simplement avec module exports is
equal to Router. Maintenant, ce que nous allons faire, nous ajoutons
également ces itinéraires
dans le fichier index dogs,
appuyons sur Ctrl plus P et
accédons au fichier index dogs. Ici, nous ajoutons des itinéraires
de jet à coût égal à require, nous accédons au
dossier des routes et à l'intérieur du dossier jets tout en bas, point U de
l'application ici, nous ajoutons préfixe API slash jets
au deuxième paramètre, nous ajoutons des itinéraires à réaction et nous l'enregistrons Nous pouvons maintenant définir nos API. abord, nous voulons
connaître la liste
des jets pour l'utilisateur connecté actuel, routeur point get endpoint
to forward slash, et ici nous avons besoin d'Os Middleware car seuls les utilisateurs connectés
peuvent voir les chats ou discuter À la fin, nous ajoutons fonction de rappel
Async
avec demande et réponse Maintenant, dans cette
fonction de rappel,
nous obtenons d'abord que cost user ID est égal
à request point userid
point underscore ID Ensuite, nous pouvons trouver le chat. Le coût des chats est égal
à celui du chat en attente. voyez, la saisie automatique fonctionne avec le
point Find et ici, nous passons notre condition dans Object
participants à un identifiant utilisateur. Ici, nous pouvons également utiliser les opérateurs
Mongo Di
Be, mais cela fonctionnera également Si cela ne fonctionne pas,
nous le modifierons. Quel est le problème ?
Maintenant, sur le front-end, nous voulons montrer
quelque chose comme ça. Tout d'abord, l'utilisateur qui
reçoit ou envoie des messages. Également le dernier message, qui a envoyé le dernier message et à quelle heure il l'a envoyé. Ici, nous devons renseigner
les données utilisateur des
participants. À remplir par points Dans le premier argument,
nous passons le nom du remplissage, qui correspond aux participants,
et le deuxième argument
est le nom du remplissage, disons, l'
ID de soulignement et le nom d'utilisateur Maintenant, nous avons également besoin des
informations sur les derniers messages. Encore une fois, renseignez d'abord ce que
nous écrivons. Écrivez le dernier message, remplissez le nom, puis le second, les
remplissages dont nous avons besoin depuis
le dernier message. Tout d'abord, nous avons besoin de l'expéditeur
qui a envoyé ce message. contenu suivant, le
texte du message, et ensuite, il est créé sur. Ici, si vous ne comprenez pas
le nom de Phil, vous pouvez également regarder Schema. Maintenant, voici un petit
défi pour nous. Comme nous pouvons le voir, nous
recevons l'expéditeur de
ce dernier message, mais il s'agit également d'un identifiant,
pas d'un nom d'utilisateur. Nous avons besoin du nom d'utilisateur de cet expéditeur. Ici, nous pouvons donc faire comme ça. Après cette méthode de remplissage, nous ajoutons une autre méthode de remplissage. Tout d'abord, nous ajoutons dernier point sender
et le deuxième argument, nous ajoutons le nom de remplissage,
qui est le nom d'utilisateur. Maintenant, je pense que cela semble
un peu confus. Il existe donc un autre moyen d'
écrire la méthode de peuplement imbriqué. Laisse-moi te montrer. Jusqu'à
présent, dans la méthode populate, nous passons deux arguments Au premier argument, nous passons le nom du champ que nous voulons renseigner et au second, nous passons les propriétés que nous voulons obtenir
de la relation C'est le premier moyen. Pour la méthode populatet
imbriquée,
nous pouvons passer ici
la méthode nous pouvons passer ici Maintenant, au lieu de passer
ici des arguments, nous pouvons passer un objet. Tout d'abord, dans cet objet, nous transmettons la propriété path. Ce chemin est un nom
de champ que nous voulons renseigner, qui est le dernier message Et une autre propriété est sélectionnée. Ici, nous sélectionnons les données que
nous voulons obtenir
de la relation. Supposons que le
contenu soit centré et créé à. Nous voulons maintenant
remplir à nouveau les données de l'expéditeur. Après la sélection, nous passons une autre propriété
qui est renseignée et ici nous passons l'objet avec deux
mêmes propriétés
path et select Chemin vers ce que nous ajoutons
ici, écrivez sender. Nous n'avons pas besoin d'écrire ici le
dernier message point Sender car nous sommes déjà dans la méthode de
remplissage du dernier message, et ici nous passons la
sélection au nom d'utilisateur Ici, si vous voulez
aller plus loin,
nous pouvons également transmettre
une autre propriété de peuplement.
Pour l'instant, nous n'en avons pas besoin, nous allons
donc la supprimer Maintenant, ici, ces deux méthodes de
remplissage et cette
méthode de remplissage imbriqué unique fonctionnent toutes les deux de J'aime cette approche imbriquée car elle est claire
et ne prête pas à confusion Si vous aimez le
premier, alors allez-y. Ne vous inquiétez pas, cela
dépend entièrement de vous. Maintenant, après le remplissage,
nous voulons afficher les jets dans l'ordre inverse
du dernier message Mais ici, comment peut-on trier les avions à réaction ? C'est vraiment simple.
Lorsque quelqu'un envoie un message, comme nous le savons, nous
mettons à jour cette propriété jet, dernier message, et
lorsque nous mettons à jour cette propriété, nos jets mis à jour dans la
propriété sont mis à jour. Nous pouvons donc nous contenter de cette
mise à jour sur place. Donc, point court, et dans object, nous passons
la valeur de update at à moins un, et à la fin, nous renvoyons le point de
réponse json, Object with chats à ces
chats, et c'est tout. Actuellement, nous obtenons la liste de
discussion pour l'utilisateur connecté. Maintenant, lorsque l'utilisateur
ouvre une discussion spécifique, nous devons lui montrer les
messages de cette discussion. Dans la prochaine leçon, nous
allons créer une API pour cela.
186. Obtenir des messages de chat spécifiques: Recevons les messages d'
une discussion en particulier. Donc, point extérieur GT. abord, nous avons besoin de l'
identifiant du chat, donc de la colonne oblique, de l'
identifiant du chat, des messages de barre oblique De plus, nous avons besoin d'un
middleware et nous avons enfin une fonction de rappel
avec demande Maintenant, dans ce rappel, nous obtenons un identifiant de chat à coût égal à, et nous déstructurons les PAM à points de
demande Après cela, le coût
des messages est égal à wait message point find. Ici, nous passons simplement un identifiant de
chat d'objet à un identifiant de chat. Laissez-moi vérifier qu'il s'agit d'un
chat ou d'un identifiant de chat. Oui, c'est un identifiant de chat. C'est ce qui m'est arrivé quand j'apprenais à ne pas apprendre le
jazz. J'écris un mauvais
nom de remplissage dans la requête et je passe presque une
journée à trouver une erreur, et enfin, je vérifie
le nom de remplissage. Assurez-vous donc que cela ne vous
arrive pas. Nous voulons maintenant renseigner
ces données. Alors, remplissez les fléchettes Et ici, nous voulons
renseigner l'expéditeur, et que voulez-vous obtenir pour obtenir un trait de
soulignement, un identifiant et un nom d'utilisateur Ensuite, nous
voulons recevoir les messages dans ordre
inverse, car c'est
ainsi que nous les affichons
sur le front-end. Donc, triez ici en objet, nous passons created at
à yes, moins un. Maintenant, cette requête renverra
tous les messages de cet identifiant de chat. Mais dans le monde réel, nous n'avons besoin que dix à 20
derniers messages car personne ne
les verra dès le début. Si quelqu'un veut
voir les messages précédents, nous pouvons les récupérer
plus tard sous forme de pagination Donc, pour la pagination, nous écrivons
ici, en laissant les crochets Ci, limite de
page par virgule, égale à la déstructuration ici la
requête De plus, nous transmettons ici cette valeur par défaut si le front
end ne transmet pas ces données. Donc, passez à une page et
limitez-vous à dix. Après cela, nous devons les
convertir en nombre entier. La page est donc égale à passer
un entier et à passer ici une page. Dupliquez cette ligne avec Shift plus Alt plus flèche vers le bas ou Shift plus Option
plus flèche vers le bas. Et ici, nous changeons
cette page pour limiter, et aussi ici limiter. Dans notre requête, nous ajoutons simplement la méthode
Skip, et à l'intérieur de celle-ci, page moins un dans la limite, et nous ajoutons également la
méthode limit et passons ici la limite. Et aussi, à la fin, nous ajoutons la méthode len. Nous créons beaucoup d'API
avec la pagination, n'est-ce pas ? Maintenant, nous pouvons également ajouter ici
C a des messages précédents, est égal à la condition
« ici nous passons », longueur
des points des messages
est égale à la limite. Si c'est vrai, alors renvoyez vrai, sinon, nous renvoyons faux. Maintenant, à la fin, nous renvoyons simplement JSunObject point de
réponse aux
messages, messages précédents,
à un message précédent, page par page, et
limite à limite Et c'est tout. Pour l'instant, nous n'avons pas de chats
ni de messages, nous allons
donc essayer ces API après avoir créé le
chat et les messages. Dans la leçon suivante, nous allons créer un message d'envoi EPI
187. API pour l'envoi de messages: Créons maintenant une API
pour envoyer des messages. Nous ajoutons donc ici un
point de routeur pour le point de terminaison, nous ajoutons pour notre identifiant de jet de
colonne oblique, dans quel jet nous voulons
envoyer un message,
un message ou des messages, quel que soit le nom que vous voulez lui donner. Nous ajoutons également Osmitalware et fonction
de rappel
acing Tout d'abord, nous allons
obtenir l'ID utilisateur à partir de l'identifiant request point user
point underscore ID Au fur et à mesure que nous obtenons le coût, l'
identifiant de chat de Calibakets est égal à celui des
PRM à points demandés, de quoi d'autre avons-nous besoin ? Nous avons besoin
du contenu du message que nous
recevons du corps. Le contenu du Cost Calibacket est
égal au corps du point demandé. Maintenant, avant de faire quoi que ce soit, vérifions cet état. Si le contenu n'est pas disponible, nous renvoyons
une réponse avec le code Stata 400 et
dans la méthode JSON, nous renvoyons un objet avec
un message au contenu, ou nous pouvons dire message, le texte est défini comme obligatoire Maintenant, ce que nous voulons
faire dans cette API, nous voulons simplement stocker le
message dans la base de données. C'est ça. Ici, nous pouvons faire des frais, un
nouveau message est égal
à un nouveau message. Ici, dans l'objet, nous passons l'identifiant du jet à l'identifiant du chat, l'expéditeur à qui écrit, l'identifiant utilisateur, puis nous
ajoutons du contenu au contenu. Après cela, nous attendons le nouveau point de
message c. Et enfin,
nous renvoyons simplement la réponse
avec le code d'état 201, et dans Jason, nous passons Object, nouveau message à nouveau message. Maintenant, avant de goûter à cette API, vous vous demandez peut-être que nous n'avons pas
créé d'API pour créer un chat. Alors, comment pouvons-nous passer le Jet ID ? Votre question est juste. Nous devons créer l'API Jet
avant d'enregistrer le message. Ici, nous créons une nouvelle API, routeur point à point, un point
à une barre oblique, créez un chat Ici, nous avons besoin d'un intergiciel et également d'une fonction de rappel
avec demande Tout d'abord, nous
obtenons que l'ID utilisateur Cost est égal à request point
user point underscore ID Nous avons également besoin de l'identifiant du récepteur, qui est le récepteur ou
un autre utilisateur de ce jet. ID du destinataire du coût est égal à l'identifiant du récepteur point point point point point
point point point point point point point. Comme nous obtenons cet
identifiant de destinataire à partir du corps du point de demande, il est recommandé de le valider. Donc, si l'identifiant du destinataire n'
est pas disponible, nous renvoyons la réponse avec code d'
état 400 et dans Jason, nous renvoyons l'objet avec le message requis
au destinataire. Maintenant, avant de créer un nouveau chat, il est préférable de découvrir ces deux utilisateurs ont déjà un chat
existant ou non. Donc, laisser le chat équivaut à
attendre le point de discussion Fine one. Ici, dans object, nous passons
les participants à l'objet, et nous y ajoutons le
dollar ou le tableau,
l'identifiant utilisateur, l'identifiant du récepteur par une virgule Maintenant, cette requête signifie un jet dans lequel les participants se
trouvent à la
fois ces ID utilisateur et ID de récepteur. Et s'il s'agit d'un jet de groupe ? Il est alors possible qu'il existe plusieurs jets dans lesquels ces
deux identifiants sont disponibles. Ici, nous devons nous assurer que seuls l'identifiant utilisateur et l'
identifiant du destinataire doivent être disponibles. Pour cela, nous pouvons utiliser
ici la taille d'un dollar pour deux. Il s'agit d'un autre
opérateur utile de Mongo Dib. Je l'ai appris récemment. Et s'il n'y avait vraiment pas de chat entre l'utilisateur et le récepteur ? Il suffit ensuite de
créer un nouveau chat. Donc, si le chat n'est pas disponible, alors nous faisons que le chat est
équivalent à New Jet. Ici, dans l'objet, nous ajoutons des participants
à l'ID utilisateur du tableau, virgule, à l'ID du récepteur, puis
nous pouvons attendre le point de discussion c. À la fin, nous renvoyons simplement réponse avec le code d'état 201 En JSON, nous envoyons simplement
ce chat et c'est tout. Maintenant que nous avons créé l'API Jet, avant de créer un nouveau message, nous devons d'abord vérifier que l'utilisateur a
transmis un identifiant de chat correct ou non et qu'il
participe ou non au chat. Si
cette condition n'est pas vérifiée, importe qui peut envoyer un message
à n'importe quelle personne ou à n'importe quel groupe. Le coût du chat est égal à wait
chat point fine buy ID, et ici nous passons JatiD Ensuite, nous vérifierons
si Jet n'est pas disponible ou si le point Jet
Dot Participants inclut le nom d'utilisateur. Si l'expéditeur ne figure pas parmi
les participants, nous passons vos points d'exclamation, puis nous renvoyons la réponse
avec le code d'état 403, et dans un message JSON l'accès
refusé Maintenant, nous vérifions le jet. Dans le nouveau message, nous remplaçons cet identifiant de chat par un identifiant de soulignement par point de
discussion Maintenant, que devons-nous faire d'autre
lorsque nous envoyons un nouveau message ? Peux-tu deviner ? Bien, nous devons mettre à jour la
propriété du dernier message du chat. N'oubliez pas qu'après avoir
enregistré le message, nous écrivons le point de discussion. Le
dernier message est égal au
point de soulignement du nouveau message. Et après cela, nous
attendons également la sauvegarde des points de discussion. Et c'est tout.
Enfin, T est cette API. Ouvrez Postman et ici nous créons un nouveau dossier appelé
chats et à l'intérieur de celui-ci, nous ajoutons une nouvelle demande appelée
créer un nouveau chat Bonne méthode pour publier. terminaison, nous ajoutons le SGDP, la colonne à double
barre oblique, l'hôte local, la
colonne 3 000, l'API, les barres obliques et les barres
obliques CreThat Tout d'abord, nous devons
passer le jeton dans l'en-tête. Pour en revenir à notre API de connexion et
ici pour le compte Hari, copiez
bien ce jeton et dans notre
API de création de chat dans les en-têtes, nous avions l'autorisation d'effectuer une erreur, rythmer ce jeton et d'
envoyer la demande voyez, ici, nous obtenons une erreur
interne du serveur car l'
ID du destinataire est requis. Ici, dans le
corps, on passe à Aw. Ici, nous passons JSObject et passons ici l'identifiant du récepteur aux codes, revenons à Mango Di
Becompass et ici je copie cet autre identifiant utilisateur et le collons dans
l'identifiant Maintenant, envoyez la demande.
Vous voyez ici que nous avons un nouveau jet, copiez cet identifiant de jet. En tant que test, envoyez un message API. Assurez-vous d'enregistrer cette API avec Control plus
ou Command plus a, puis de dupliquer
cette requête de publication. Modifiez le nom de la demande
pour envoyer un nouveau message. De plus, je remarque que dans notre API, nous devons transmettre l'identifiant du chat dans le paramètre de demande et le
contenu dans le corps de la demande. Nous pouvons donc faire
quelque chose comme ça. Nous pouvons modifier notre API et
indiquer de n'envoyer que des messages. Ici, nous obtenons l'identifiant du chat
dans le corps de la demande. Bien. Sauvegardez-les et
retournez voir Postman Ici, nous modifions notre point de terminaison pour slash les chats, slash pour
envoyer Dans l'en-tête, nous avons
déjà un jeton, il suffit donc de
transmettre le corps de la requête. Ici, dans l'objet, nous transmettons du contenu, disons qu'il s'
agit du premier message. Nous ajoutons également le jet ID et le
collons ici. Maintenant, envoyez la
demande. Vous voyez ici que nous recevons le nouveau
contenu de notre message, et dans l'expéditeur, il s'agit de notre identifiant. Maintenant, il vaut mieux qu'à
l'endroit de l'expéditeur, nous puissions voir l'identifiant et le nom d'utilisateur. Ainsi, il est facile d'afficher de
nouveaux messages sur le front-end. À la toute fin, nous définissons le coût, remplir le message est égal
à wait message point
find bydNew message point
underscore ID, point Tout d'abord, nous ajoutons l'expéditeur, et au deuxième argument, nous ajoutons un
identifiant de soulignement et utilisons un nom Et dans la réponse, nous
renvoyons un nouveau message
pour remplir le message. Enregistrez les modifications et
envoyons un autre message. Il s'agit du deuxième message,
et envoyez la demande. Vous voyez, dans l'expéditeur, nous obtenons un identifiant et un nom d'utilisateur. Donc, ici, notre
API d'envoi de message fonctionne bien. Charmant.
188. Que sont les Web Sockets: Ainsi, dans les leçons précédentes, nous avons créé des API pour
envoyer le message, et nous avons également défini des API pour recevoir les messages
d'une discussion spécifique. Imaginez maintenant que c'
est notre interface,
et qu'il y a une page de discussion ouverte pour
deux utilisateurs Hurley et Mike Voici donc l'écran de Hul et voici l'
écran de Mike Les deux sont sur la page de discussion à laquelle ils participent tous les deux
, et ils reçoivent tous les deux deux deux deux deux messages
qui sont des discussions historiques. Imaginez maintenant que Harley tape un nouveau message
et clique sur Envoyer Donc, sur le bouton Envoyer, nous appellerons l'API pour envoyer
un nouveau message, n'est-ce pas ? Et comme nous le savons, cette API enregistrera ce message
dans notre base de données. Maintenant, le problème est de savoir comment
Mike va recevoir ce message car Mike a déjà récupéré tous les messages de ce
jet et Hurley envoie ensuite le nouveau La première était que Mike enverrait demande de réception de
messages toutes les 5
secondes pour recevoir de nouveaux messages. C'est comme si Mike demandait au serveur
s' il y avait un nouveau message pour moi ? serveur dit non. Encore une fois,
après 5 secondes, Mike demande s'il y a un
nouveau message pour moi ? Encore une fois, le serveur dit non. Ensuite, si le serveur reçoit un nouveau message, dans 5 secondes lorsque Mike
demandera
à nouveau le nouveau message, le serveur lui
enverra un message. Imaginez maintenant que nous avons 10 000 ou 100 000 utilisateurs sur notre site Web et que tous les utilisateurs envoient demandes de
message
toutes les 5 secondes, ce qui n'a vraiment aucun sens
car nous n'
obtiendrons de nouvelles données que lorsque notre
serveur en aura reçu de nouvelles Sinon, nos demandes seront simplement envoyées au serveur
et y reviendront. Cela
ralentira certainement
notre serveur ou même se bloquera parfois. Nous ne pouvons donc pas nous fier
à cette solution. Nous avons besoin de quelque chose qui indique
automatiquement à
Mike s'il a un
nouveau message et l'
envoie automatiquement sur l'écran de la souris. Et pour résoudre ce problème,
nous avons un socket Web. Alors, qu'est-ce que les sockets Web ? Le socket Web est un moyen pour le front end de
notre site Web et le backend de notre serveur de
communiquer entre
eux en temps réel C'est comme une conversation bidirectionnelle. En termes simples, les sockets Web nous
aideront à établir une conversation
en temps réel. D'une
connexion Internet Socket, c'est comme un appel téléphonique entre votre
navigateur et le serveur. Une fois l'appel passé, navigateur peut parler
au serveur et le serveur peut également répondre
à tout moment. Maintenant, vous vous demandez peut-être quelle est la différence entre les
API et les sockets Web. Imaginez que c'est notre
interface et que c'est notre serveur. Supposons maintenant que sur le front end
nous voulions obtenir des données, nous envoyons
donc une demande
d'API du front end
à notre serveur. Le serveur traitera cette
demande et enverra une réponse à notre
interface lorsque notre connexion API sera fermée. Par exemple, depuis le front-end, Harley envoie un message à
notre serveur à l'aide de l'API post Notre serveur va maintenant
stocker ces données dans la base de données, puis renvoyer le nouveau message
au front-end. Ici, notre connexion est fermée. C'est le mode de
connexion à l'aide des API SGDP. Voyons maintenant comment fonctionne
le socket Web. Ici, nous avons une interface, et c'est notre serveur. Maintenant, tout d'abord, nous
créons ici une connexion à
l'aide d'un socket Web. Grâce à cette connexion,
notre client peut envoyer les nouvelles données de message au
serveur sans aucun appel d'API De même, le serveur peut également
renvoyer de nouvelles données de message. Une fois que le serveur a envoyé de
nouvelles données de message, cette connexion
reste présente. Il ne se fermera pas tant que nous n'aurons pas fermé notre site Web ou que nous ne l'aurons pas
fermé manuellement avec le code. Permettez-moi de vous expliquer à
l'aide d'un exemple concret. Voici Harley, voici Mike, et voici notre serveur Supposons que Harley et
Mike établissent tous deux une connexion avec notre
serveur à l'aide de sockets Web Maintenant, si Halley envoie un
nouveau message au serveur, serveur stockera ce
message dans la base de données, puis il
enverra ce message
au micro sans que Mike n'
envoie de demande d'API Maintenant, si Mike envoie
un message au serveur, le serveur stockera également ce
message dans la base de données, puis il enverra ce
nouveau message à Harley Maintenant, si notre serveur reçoit un autre message pour Mike
d'un autre utilisateur, Mike
recevra également ce message,
mais cela ne
se produira que si Mike connexion avec le serveur à
l'aide d'un socket Web. Si Harley est connecté
au serveur, mais que Mike n'est pas connecté
au serveur via un socket Web, le nouveau message sera
stocké dans la base de données, mais il n'
atteindra pas le micro C'est ainsi que fonctionne le Web Socket. Les sockets Web sont
utilisés pour établir une communication en temps réel entre le
front-end et le back-end. Ne vous inquiétez pas, c'
est très simple. Comprenez tout cela lorsque
nous appliquons des sockets Web dans notre back-end et que nous
y goûtons avec le front-end.
189. Connexion de la prise: Maintenant, dans la leçon précédente, nous voyons que si nous voulons
envoyer et recevoir des données en temps réel, nous devons nous connecter à socket
Web pour traiter
avec un socket Web, nous utiliserons le socket point IO de
bibliothèque le plus populaire. Cette bibliothèque est utilisée par
de nombreuses plateformes populaires, nous pouvons
donc certainement l'utiliser. Ouvrez le terminal,
et nous écrivons ici NPM install socket point
IO au taux 4,8 0,1 Il entre. Bien,
minimisez ce terminal et ajoutons un socket dans
notre application principale Dans le fichier JS à points d'index, nous saisissons le coût des crochets Coli, serveur est égal à
require socket point IO. Et en bas, nous pouvons ajouter coût AO est égal à un nouveau serveur. Maintenant, sur ce serveur, nous devons
passer notre serveur SGDP. Sans serveur SGDP, le socket ne recevra pas de demande de
connexion Pour cela, nous devons
créer un serveur SDDP. Le coût SDDP est égal
au SDP requis. Il s'agit du
module SGDP intégré en bas,
nous ajoutons que le serveur Const est égal
à SDP point Nous pouvons maintenant transférer ce
serveur dans notre socket. Bien. Voici maintenant une question sur quelle carte le
serveur de sockets écoutera. Parce qu'ici, pour l'application Express, nous définissons le port 3 000
et à la fin, nous écoutons avec ce port. Dans notre implémentation actuelle, si nous ajoutons le socket point
Listen à 5 000, nos API s'exécuteront sur le port 3 000 et notre socket
fonctionnera sur le port 5 000. Ce n'est pas ce que nous voulons. Nous voulons que nos API et notre socket
fonctionnent tous les deux sur la même carte. Donc, pour cela, ici dans
le serveur de création, nous devons transmettre
cette application Express. Ce module SGTP créera ainsi un serveur
avec cette application express, et le même serveur que nous
utilisons pour initialiser le socket Toujours en bas, nous devons remplacer
cette application point Listen par point serveur Lisen Dans le cas contraire, cela
ne fonctionnera pas correctement. Enregistrez ces modifications
et redémarrons notre application pour nous
assurer qu'elle fonctionne
correctement ou non. Vous voyez ici que le serveur
fonctionne sur B 3 000, et nous connectons également
Mongo Db Cela signifie qu'il
fonctionne correctement. Donc, pour récapituler rapidement l'
initialisation du socket
dans notre backend, nous devons d'abord créer un
serveur et transmettre l'application Express InsideE, puis nous pouvons utiliser ce serveur pour
créer un serveur de socket, et à la fin, nous devons
également utiliser le point
LISN du serveur à également utiliser le point
LISN du serveur Nous avons donc réussi initialiser le socket
dans notre application Désormais, depuis le front-end, n'importe qui peut se connecter
à ce socket. Mais que voulons-nous faire lorsque quelqu'un se connecte au socket ? Nous devons ajouter cette logique.
C'est vraiment simple. Ici, après ces routes d'application, nous ajoutons IO qui est le point de l'instance du
socket, et au premier argument, nous transmettons la connexion, et
au deuxième argument, nous transmettons
ici la
fonction de rappel et ce que nous faisons lorsque quelqu'un
se connecte à notre socket Pour l'instant, nous nous contentons de
la console point log. L'utilisateur est connecté. Chaque fois que
quelqu'un se connecte à notre socket depuis le front-end , cette
fonction de rappel s'exécute Maintenant, comment pouvons-nous goûter à
cette implémentation ? Pour y goûter, j'ai
créé une application SGML et
JavaScript factice et
simple Ne t'inquiète pas. Si vous
ne connaissez rien au front-end, je
vais vous l'expliquer. De plus, si vous ne
voulez pas y goûter, vous pouvez assister à cette dégustation. vous aidera également à comprendre le flux
de travail du socket. Dans le dossier des ressources, nous avons
le dossier Project 3, et dans celui-ci, nous avons l'application de test LinkFi, copiez ce dossier et déplacez-le
vers notre dossier de projets Ici, nous collons ce dossier. Ouvrez maintenant ce
dossier en code Vas. Bien. Ici, nous utilisons d'abord
ce simple dossier de discussion. La raison pour laquelle j'utilise l'application
frontale ici , c'est qu'
avec un vrai front-end, apprendre le socket sera amusant, et cela effacera également le flux de travail
complet du socket. Ne vous inquiétez pas, vous n'avez pas besoin
d'écrire de code ici. Fais juste comme moi. Donc, pour exécuter cette interface, suivez ce simple fichier GML de points de
discussion dans le navigateur et
ouvrez-le dans le nouvel onglet Vous voyez, nous avons ici ce
type d'interface. Revenons maintenant au code VIS du
front-end et ouvrez ce simple fichier de points de discussion. En haut, vous pouvez voir que le socket d'
écriture est égal
à AO et qu'à l'intérieur, nous passons notre lien principal, qui est la colonne
hôte local 3 000 Cette expression signifie que nous
voulons nous connecter avec le socket, qui est initialisé
sur ce pot Vous pourriez également vous demander comment
nous obtenons cette méthode Ao. Nous obtenons cette méthode Ao parce que j'ai ajouté un
socket avec Dan Link. voyez, c'est ici, et c'est à
cause de cela que
nous arrivons ici, Aomthod Enregistrez cette page et
revenez à notre interface. Jetons un coup d'œil à notre console, alors cliquez avec le bouton droit sur la
page et accédez à Inspec Vous pouvez voir ici que nous obtenons cette erreur de
cours pour le socket slash de la colonne
3 000 de l'hôte
local Maintenant, vous vous demandez peut-être si nous
activons déjà le cours dans
cette application express, pourquoi nous recevons toujours
cette erreur de cours ? La raison en est que nous ne configurons le cours que pour
notre application express, mais nous devons également configurer cours pour notre serveur de sockets. C'est vraiment simple. Ici, dans la méthode server, au deuxième
argument, nous pouvons transmettre les options
du serveur de sockets. Je m'y oppose, nous passons également
ici à object, première propriété de l'origine à l'étoile, ce qui signifie que n'importe quel port est autorisé. De plus, si nous voulons transmettre
uniquement notre interface, nous pouvons transmettre ici cette URL. Mais pour le moment, nous restons avec Star. Vous pouvez copier ou transférer depuis
le navigateur frontal. Maintenant, après origin, nous
pouvons transmettre des méthodes, qui sont des tableaux, et nous
passons ici, Get et post. Cette méthode de sun spécifie quelles méthodes
SGDP sont autorisées
pendant le socket Web NDsac Maintenant, vous pouvez vous demander ce qu'
est le websocket Hensak. Lorsqu'un client se connecte à
un serveur socket ou di, il commence par une
requête SDP. La poignée de main En cas de succès,
il sera mis à niveau vers une connexion Web
Socket. Au cours de cette poignée de main,
le serveur vérifie si la
méthode SDDP entrante est autorisée ou non Il est important d'ajouter ces
méthodes, car avec elles, notre connexion s'établira. Si nous ne spécifiez pas
les bonnes méthodes, navigateur peut bloquer la connexion en raison
d'une erreur de cours. Enregistrez ceci et
actualisons notre interface. voyez, ici,
nous n'avons aucune erreur, et si nous vérifions notre
backend dans le terminal, nous recevons
un message de console indiquant qu'un utilisateur est connecté. Et nous actualisons également notre
application une fois de plus. Ensuite, dans notre back-end, vous voyez, là encore, un
utilisateur est connecté, ce qui signifie que notre utilisateur frontal
est connecté avec
succès à notre
back-end à l'aide d'un socket. Donc, pour récapituler rapidement, après avoir initialisé le socket,
dans notre backend, nous ajoutons ao point lors de la connexion, et au deuxième argument,
nous passons la fonction de rappel Ainsi, chaque fois qu'un nouvel utilisateur
se connecte à notre socket, cette
fonction de rappel s'exécute Et également dans cette fonction de
rappel, nous écrirons toute notre
logique pour le socket C'est ainsi que nous initialisons et gérons la
connexion du socket
190. Socket Emit et sur les méthodes: Vous pensez peut-être qu'il est difficile
d'écrire un
code lié au socket. Il possède de nombreuses méthodes
et fonctions. Comment les apprendre ? Si vous avez ce type d'
équations, ne vous inquiétez pas. Pour la première fois, je
pense également que le socket est très difficile. Mais quand je l'
applique réellement à mon projet, c'est vraiment simple. Le socket a principalement deux méthodes, socket point d et socket point on. 90 % du temps, nous utiliserons
ces deux méthodes, et croyez-moi, elles
sont vraiment simples. Comme nous le savons, le
socket est utilisé pour les conversations en temps
réel entre le
front end et le back-end. En gros, cela signifie que chaque fois que
notre serveur ou notre back-end peut envoyer et recevoir des données depuis le front-end sans
aucun appel d'API, et cela fonctionne également en sens inverse. front-end peut également envoyer et recevoir des données
depuis le back-end. Supposons que depuis notre interface, Harley souhaite envoyer un message au serveur principal comme si
c'était le nouveau message Maintenant, comment pouvons-nous envoyer des données depuis le front-end ? Pour cela, nous utilisons le socket
point E send message. Il s'agit du nom de l'événement, et au deuxième argument, nous pouvons ajouter nos données. En langage clair,
émettre signifie envoyer. Nous indiquons donc à notre socket, émettons les données ou, en
termes simples, envoyons les données. Nous envoyons ainsi un message
depuis le front-end, mais dans le back-end,
nous devons également écrire la logique de
gestion de cet événement. Et pour cela, nous utilisons le socket
point pour envoyer un message. Il s'agit du même nom d'événement que
celui que nous envoyons depuis
le front-end. Et au deuxième paramètre, nous passerons la fonction de rappel, qui s'exécutera lorsque nous
recevrons un événement d'envoi de message Nous allons donc écrire toute notre logique
dans cette fonction de rappel. Que nous voulions
stocker des messages dans la base de données ou que nous voulions les envoyer
directement
à d'autres utilisateurs. En termes simples,
souvenez-vous simplement que lorsque nous voulons envoyer des données du front end au
back-end ou du back-end au front end, nous utilisons la
méthode socket point avec le nom de l'événement, et lorsque nous voulons recevoir des données du back-end ou
du front end, nous utilisons socket point on, et ici nous écrivons le même nom d'événement
et la même fonction de rappel Implémentons cela
dans notre application. Donc, sur le front end, d'abord, j'
ai ajouté un événement de soumission à notre formulaire dans lequel nous
avons un bouton de saisie de message
et d'envoi Et ici, nous obtenons un message d'entrée et utilisons un nom renseigné
dans ces deux variables. Tout est donc réglé. Nous devons envoyer un
message en utilisant le socket. Voici donc la
méthode de socket que nous utilisons pour
envoyer le message. Bien sûr, nous allons utiliser le point de socket
m. Au premier argument, nous écrivons le nom de l'événement, disons, envoyer un message. Et au deuxième argument, nous pouvons transmettre les données que nous
voulons envoyer avec cet événement. Supposons que nous transmettions ici un objet
avec un expéditeur à un objet sous un identifiant
carré, disons 123, et que nous utilisions un nom pour le nom
d'utilisateur, une valeur en point. Et un autre
contenu de propriété pour saisir la valeur du point, qui est le texte de notre message. De plus, nous envoyons le
produit créé à la nouvelle date, et nous passons également le statut
à l'envoi. Et c'est tout. Ici, nous avons ajouté des remplissages tels que nous
les définissons dans la base de données. Ici, par ce code, nous envoyons les données du message
lorsque nous soumettons un formulaire. Voyons maintenant si nous obtenons
ces données dans notre backend ou non Dites-moi donc quelle méthode de socket nous utiliserons pour obtenir les données
de l'événement. C'est vrai, nous utilisons le socket point activé. Tu apprends assez vite, adorable. Dans notre backend,
au point ao activé, nous sommes au point socket activé. Au premier argument,
que fait-on passer ? Bien, nous transmettons le nom
de l'événement que nous voulons gérer, qui est envoyer un message. Assurez-vous d'écrire le même nom que celui que nous avons
indiqué sur le front-end. Sinon, cela ne fonctionnera pas
et la distinction majuscules/minuscules est également faite. Maintenant, au deuxième argument, nous passons la fonction de rappel, qui s'exécute lorsque quelqu'un
du front end envoie cet événement d'
envoi de message Dans le paramètre
de cette fonction, nous obtenons les données, et pour l'instant, nous avons simplement consigné les nouveaux
messages depuis le front-end, et nous les conservons Ces données constituent l'objet du message que nous transmettons depuis
le front-end. Maintenant, vous vous demandez peut-être
comment pouvons-nous obtenir un socket dans ce
point o lors du rappel ? Nous arrivons simplement ici
à partir du paramètre. En utilisant ce socket, nous pouvons
ajouter les méthodes emit et on. Enregistrez ces modifications et envoyons un message
depuis le front-end. Actualisez la page ici, nom
d'utilisateur et ici,
message, premier message,
puis cliquez sur Onsent Ici, rien ne se passe. Et si nous vérifions notre
back-end, vérifiez notre terminal. Ici, nous nous connectons à l'utilisateur, puis nous obtenons cet objet de
message, ce qui signifie que nous avons
reçu le message avec succès depuis le front end. C'est tellement simple d'envoyer
et d'obtenir des données à l'aide d'un socket. Nous devons juste nous souvenir de méthode
socket point et socket
point on. Maintenant, nous recevons le message
du front end. Ensuite, ce que nous voulons
faire avec ce message. Évidemment, nous voulons stocker ce message dans la
base de données, puis
le renvoyer au front-end Notre interface peut afficher
ce message à l'écran. Pour l'instant, ne vous
inquiétez pas de la logique de base de données, nous l'implémenterons plus tard. Pour l'instant, nous voulons simplement envoyer
ce message au front-end. Dites-moi quelle méthode
nous utiliserons pour envoyer les données du
back-end au front-end. Oui, nous utilisons le socket point, et au premier
argument, nous transmettons l'événement. Recevez un message. Tu peux
lui donner n'importe quel nom. Ça n'a pas d'importance. Maintenant, que voulons-nous envoyer
avec cet événement ? Vous souhaitez envoyer les mêmes données. Dans le monde réel, nous enverrons un nouvel objet de message que
nous stockerons dans la base de données. Maintenant, enregistrez ce fichier,
et dans le front-end, nous devons gérer
cet événement de message G, et vous savez déjà
quelle méthode nous devons
utiliser pour gérer l'événement
ou obtenir l'événement. Bien, nous allons écrire
ici socket point on. abord, nous passons le nom de l'événement ,
Get message, et
au deuxième argument, nous passons la fonction de rappel, et dans ce rappel, au
paramètre, nous obtenons ces données Que voulons-nous faire
avec ce message ? Nous voulons simplement afficher ce
message sur le navigateur. Donc, pour afficher le message, j'ai créé cette fonction d'affichage des
messages. Il suffit de l'appeler et de lui
transmettre les données. Cette fonction créera un message et l'
affichera sur notre navigateur. De plus, ici, vous pouvez voir
cette logique si vous le souhaitez. Enregistrez ceci, et goûtons à
cette implémentation. Assurez-vous d'actualiser la page après avoir apporté des modifications
au code frontal. Dans le cas contraire, vous
ne recevrez pas ces mises à jour. Maintenant, nous utilisons un nom pour Hurley et message pour envoyer le premier message
et envoyer le message voyez, ici, nous recevons le message sur le front-end en une
seconde ou en une seconde. Donc, pour récapituler rapidement, socket
a principalement deux méthodes, socket point m et socket point on Le socket point est utilisé pour
envoyer ou émettre les données. Et avec le socket point activé, nous pouvons gérer cet événement envoyé
ou nous pouvons voir l'événement. Si vous comprenez ces deux
méthodes, félicitations. Votre socket à 90 % est terminé.
C'est aussi simple que cela.
191. Obtenir des messages pour les deux utilisateurs: Dans l'implémentation actuelle, nous y goûtons avec un seul utilisateur. Maintenant,
goûtons-le
avec deux utilisateurs en même temps, comme Haley et Mike
discutent entre eux Ouvrez donc un autre
onglet privé du navigateur, ou vous pouvez également utiliser un autre navigateur et ouvrir
le même fichier S DML Supposons maintenant que le premier écran soit spécification
Halley et le deuxième
écran soit la spécification Mike Ils
discutent entre eux. Halley envoie un message, et voilà qu'il
reçoit ce message, mais Mike ne comprend pas le message Comment, depuis le back-end, nous envoyons
un message avec socket, comment cela fonctionne pour Halley
et non pour Mike La raison en est que,
depuis le back-end, nous utilisons le socket point m.
Cette méthode envoie événement uniquement à l'utilisateur qui
émet l'événement d'envoi du message, et c'est pourquoi Halley
reçoit ce message, mais pas Mike Maintenant, quelle est la solution ici ? Parce que nous voulons recevoir notre message, nous l'enverrons également aux autres
utilisateurs. Simplement à l'endroit
du socket point, nous utiliserons cette méthode ao point. En utilisant ao point, nous pouvons envoyer un message à tous les utilisateurs
connectés au socket. Enregistrez ce fichier et
goûtons à cette implémentation. Rafraîchissez les deux pages. Bien. De plus, ici, nous
écrivons le nom d'utilisateur pour les deux utilisateurs et à partir du Hal,
nous écrivons un message et l'envoyons. Tu vois, maintenant Mike
reçoit également ce message. Et si nous envoyons
un message de Mike, vous voyez, il le reçoit également. Et c'est ainsi que fonctionne
le chat en temps réel. En utilisant le socket point
depuis le backend, nous ne pouvons envoyer un événement qu'aux
utilisateurs qui émettent cet événement. Et si nous utilisons ao point, notre socket
enverra cet événement à tous les utilisateurs
connectés via socket.
192. Logique de rejoint une salle de chat: Dans la
leçon précédente, nous recevons des messages instantanément
chez les deux utilisateurs. Et si on ajoutait une autre fenêtre
pour voir ce qui va se passer ? Ajoutons donc une autre fenêtre
privée et ouvrons le même fichier HTML. Maintenant, écrivez ici le nom d'utilisateur et à partir de la première fenêtre,
nous envoyons un message. Regardez ici pour les deux utilisateurs,
nous avons bien compris le message. Et si un autre
utilisateur envoie un message, les autres utilisateurs
reçoivent également ce message,
ce qui signifie que notre
socket envoie le message à tous les utilisateurs connectés au socket. C'est comme si vous organisiez
une grande fête. Ici, les gens discutent
partout sans chambres, et à cause de cela, toutes les
conversations se mélangeraient. C'est comme si l'utilisateur A
parlait à l'utilisateur B, mais que l'utilisateur C entendait tout, y aurait
donc pas de conversation
privée. C'est drôle que tout le monde
soit assis dans toute
la maison au lieu de
parler doucement dans une pièce Ici, nous sommes également confrontés
à la même situation. Notre implémentation actuelle envoie des messages à tous les utilisateurs. Quelle est donc la solution ici ? Nous devons mettre en place des salles. Rooms in socket peut donc résoudre ce problème en nous
permettant de regrouper les utilisateurs. Chaque groupe ou salle est un espace
privé où seuls les membres de cette salle peuvent
envoyer et recevoir des messages. En termes simples, les
room in socket sont des espaces
virtuels auxquels
les utilisateurs peuvent se joindre et vivre. Vous pouvez ainsi
diffuser un message à
toutes les personnes présentes dans une pièce sans
déranger les autres. Supposons que Halley et Mike
veuillent discuter entre eux. Lorsque Halley ouvre une discussion, Halley rejoint
une salle qui porte
un nom unique, comme le chat
HM Halley Maintenant Mike ouvre la page Jet
pour parler à Halley. Mike a également rejoint la
même pièce appelée JathM. Désormais, les deux utilisateurs sont
connectés dans la même pièce. Donc, si Halley envoie
un message dans cette pièce, seul Mike recevra ce message, pas
la troisième personne Si Bonjour, fermez l'onglet, puis Halley a perdu
la connexion avec le socket et lorsque le
socket est déconnecté, socket point IO
retire automatiquement Halley de Room jet hm Grâce à cette implémentation,
nos jets ne seront pas rendus publics et cela fonctionne également
dans les discussions de groupe. Supposons que les utilisateurs A, B et C soient membres du groupe et qu'ils soient tous connectés
à un chat de salon ABC spécifique. Maintenant, n'importe lequel d'entre eux
envoie un message. Deux autres recevront ce message car ils sont
connectés dans la même pièce. Vous le
comprendrez bien lorsque nous mettrons en
œuvre et testerons cette fonctionnalité, et nous le ferons
dans la prochaine leçon.
193. Implémentation de la participation à un salon de discussion: Implémentons maintenant la
fonctionnalité de chambre dans notre application Inkifi. Mais avant cela, permettez-moi de
récapituler rapidement le flux de travail. Ainsi, lorsque l'utilisateur ouvre un chat,
il rejoint la salle
avec son identifiant de chat. Seuls les utilisateurs d'une même pièce peuvent envoyer et recevoir
des messages. Enfin, lorsque l'utilisateur
quitte ou ferme ce chat, nous le retirons
de la salle. Ainsi, tout d'abord, lorsque
l'utilisateur ouvre une discussion, puis depuis le front-end, un événement doit déclencher l'accès à la salle d'
appel avec un identifiant de chat. Ensuite, depuis le back-end, nous ajoutons cet utilisateur dans cette salle, et lorsque quelqu'un envoie un message, nous n'envoyons ce message
qu'aux utilisateurs qui ont
rejoint cette salle. Ici, dans notre backend, nous gérons un autre événement, socket point activé, et quel événement nous voulons gérer,
oui, c'est join room. Maintenant, nous obtenons des données, ou nous pouvons dire depuis
le front end, nous allons envoyer l'identifiant du chat, la fonction
flèche, et
maintenant pour rejoindre Room, nous écrivons simplement socket point join, et ici nous passons le
nom de la salle,
qui est notre identifiant de chat, qui est notre identifiant de chat, et pour nous assurer que nous nous connectons également à la
console point backticks, dollar
utilisateur Cali Brackets,
socket point ID, qui est l'identifiant unique actuel de l'utilisateur
fourni par socket. Rejoignez Room dollar CL
brackets chat ID. Maintenant, dans le message d'envoi, nous voulons envoyer un message
uniquement aux utilisateurs qui se
trouvent actuellement dans cette salle. Nous commentons donc cette méthode EIT
précédente, afin que vous puissiez la consulter plus tard Et ici, nous écrivons un
message MIG à points, et nous transmettons ici des données Maintenant, pour envoyer cet événement uniquement
à une salle séparée, nous ajoutons
ici un point deux, et à l'intérieur, nous devons passer nom de la salle
que
nous avons défini comme identifiant de discussion. Maintenant, la question est de savoir
comment obtenir l'identifiant du chat ? Bien, nous pouvons transmettre l'
identifiant du chat depuis le front-end. Donc, Data Chat ID, et c'est tout. Nous rejoignons l'utilisateur dans la salle, puis nous envoyons un
événement de réception de message uniquement à cette salle. Maintenant, pour tester cette implémentation, nous devons utiliser
un autre fichier SDML Ainsi, dans le dossier de test, vous trouverez un autre dossier
appelé Romjat et à l'intérieur,
vous trouverez le fichier Rojatt
SGML De plus, dans son fichier JS,
nous connectons d'abord l'utilisateur au socket, puis nous demandons le nom
de la pièce dans l'invite. Après avoir obtenu le nom de la salle, nous envoyons cet événement d'adhésion à la salle. Cela nous aidera
à rejoindre une salle, puis le reste
du code frontal le même qu'avant. Juste lors de l'envoi d'un message, nous envoyons également un jet ID car nous en avons besoin
dans le message d'envoi. Exécutons maintenant ce fichier. Creusez ce fichier et
ouvrez-le dans votre navigateur. Tout d'abord, il vous
demandera le nom de la chambre. Ici, pour la dégustation, nous
transmettons n'importe quel identifiant de jet aléatoire. Disons que le chat souligne
un, deux, trois. OK. Lorsque nous écrivons, utilisez un nom. Sans cela, nous pourrions avoir une erreur. Écrivez un nom, et
si dans notre backend, nous ouvrons la console,
nous pouvons voir ici l'utilisateur connecté, puis l'
identifiant du socket utilisateur, rejoindre la salle, et ici nous obtenons le nom de notre salle, chat, le soulignement,
un, deux, trois Génial. Ouvrons maintenant
un autre onglet et faisons de même. Écrivez ici le nom de la chambre,
discutez, soulignez un ,
deux, trois, car nous
voulons rejoindre la même salle Maintenant, nous écrivons ici le nom d'utilisateur. Ensuite, écrivez
un message et envoyez-le. Vous voyez, pour les deux utilisateurs, nous recevons ce message, donc cela fonctionne plutôt bien. Maintenant, ouvrons une autre fenêtre
et rejoignons une autre pièce. Discutons, soulignons 45, six. Bien. Maintenant, si nous envoyons
un message de cet utilisateur, ces deux utilisateurs
ne recevront pas ce message. Et si l'un de ces deux utilisateurs
envoie le même message, c'est que ce troisième utilisateur
ne reçoit pas ce message. Cela fonctionne donc également. Voilà à quel point
il est simple de rejoindre une salle et d'envoyer un message
à ces salles. Comme je vous l'ai déjà dit, socket est très simple. Tu dois juste
comprendre la logique.
194. Exercice - Indicateur de frappe: Il est maintenant temps de faire de
petits exercices. Dans cet exercice, vous
devez implémenter l'
affichage de l'indicateur de saisie lorsque
quelqu'un tape le message. La logique est que lorsque les utilisateurs
commencent à taper l'entrée, nous déclenchons la saisie d'un événement
socket. Et depuis le back-end,
nous enverrons des données sur les personnes qui tapent et dans quelle
pièce elles tapent. Maintenant, après l'
avoir implémenté en prime, lorsque notre utilisateur ne
tape pas pendant 2 secondes, nous déclencherons un autre
événement appelé Arrêter de taper, qui supprimera simplement indicateur
de
saisie du front-end. Ne vous inquiétez pas, si vous ne
connaissez pas le code frontal, écrivez
simplement du code pour le backend, gérez l'événement et envoyez le que l'utilisateur est en train de taper
ou tout autre message Dans le front-end
également, j'ai ajouté du code, qui fonctionnera lorsque nous écrivons
quelque chose dans la zone de saisie. J'ai également ajouté commandes dans lesquelles vous
devez émettre les événements ainsi que le code
que vous devez écrire lorsque vous
gérez ces événements. Le but de cet exercice est de
penser en termes d'événements. Essayez donc de l'implémenter et
ensuite quelle est la solution. Voyons maintenant la
solution de cet exercice. Donc, tout d'abord,
dans notre back-end, nous devons gérer les événements,
disons la saisie. Donc, point de saisie lors de la saisie. Et depuis le front-end, nous enverrons l'objet avec le
jet ID et le nom d'utilisateur. Nous pouvons donc le
déstructurer ici et obtenir l'identifiant du jet, ainsi que le
nom d'utilisateur, la fonction flèche Et ici, nous envoyons ce message aux autres utilisateurs qui se trouvent
dans la même pièce. Donc, au point deux ici, nous
passons l'identifiant du chat, et après cela,
point 2, nous montrons la saisie. Et ici, nous transmettons le message en dollars
BTI. Le nom d'utilisateur est en train de taper Et c'est tout. Après cela, nous devons également gérer l'événement, arrêter de taper, donc socket
point on, arrêter de taper. Et ici, nous obtenons également un objet
avec un identifiant de chat et un nom d'utilisateur. Et dans la fonction d'erreur, il
suffit d'Iot pour chatd
point m, Masquer la saisie Ici, nous passons le nom d'utilisateur qui arrête de taper, et c'est tout. Nous n'avons besoin de
rien d'autre dans le back-end. Dans cet exercice, si vous
ne comprenez pas le front-end, ne
vous inquiétez pas. Je viens d'ajouter du front
end pour la dégustation. Vous pouvez également ignorer cette partie de
dégustation dès que vous savez comment écrire la logique et l'événement du
socket. Passons maintenant rapidement à
cette partie de dégustation. Comme je vous l'ai dit dans la
leçon précédente, ici en bas, j'ai ajouté ce code, qui s'exécutera lorsque nous écrirons
quelque chose dans cette zone de saisie. Ici, si
la valeur d'entrée n'est pas vide, alors
seulement nous faisons le socket point
m et quel événement nous émettons,
nous enverrons un événement de saisie, et à la deuxième position, nous ajoutons un objet avec un ID de
chat à l'ID de chat, puis nous envoyons également le
nom d'utilisateur à la valeur utilisateur. Dans ce délai de saisie,
qui s' exécute toutes les 2 secondes lorsque
nous écrivons quelque chose dans la zone de saisie
alors que l'utilisateur n'a rien
écrit pendant deux secondes, nous envoyons un autre
événement appelé arrêt de saisie. Ici, nous dupliquons
cette méthode d'émission et la
transmettons ici et modifions cet
événement pour arrêter de taper. En dehors de cet écouteur d'événements, nous devons gérer deux événements que nous émettons depuis le back-end Socket point activé, affiche la saisie. Ici, nous passons la fonction de rappel, et ici nous recevons un message, l'utilisateur tape
cette fonction flèche, notre interface va
écrire sa logique Pour l'instant, nous ajoutons simplement ici cette logique que j'ai ajoutée en bas avec commande. Ensuite, nous ajoutons
un autre point de socket. Arrêtez de taper ici également la fonction de
rappel. Ici, nous pouvons utiliser un nom
si vous voulez l'utiliser. Et nous déplaçons ici cette deuxième
logique pour arrêter de taper. Enregistrez les modifications
et jetez-y un œil, actualisez la page, entrez le chat, identifiez, discutez, soulignez un, deux ,
trois et écrivez
un nom, Ali Maintenant, dans une autre fenêtre, nous actualisons
également la page. Entrez chat, D, chat,
soulignez un, deux,
trois, et nous écrivons
utiliser un nom pour micro Maintenant, écrivons
quelque chose de Mike. Cliquez ici pour Bonjour, nous recevons le message de
saisie. Mike est en train de taper. Mais ici, nous pouvons voir que
Mike commence à écrire, Mike est en train de taper. C'
est ce que nous voulons. Nous voulons que notre back-end envoie
uniquement un événement de saisie d'affichage aux utilisateurs présents
dans le salon de discussion, mais pas à l'expéditeur. Pour cela, ici à la
place de ao point deux, nous devons faire socket point deux et ici socket dt deux,
premier événement de saisie Je vais vous expliquer cela
dans une seconde, voir les modifications et le
tester une fois de plus. Actualisez la page,
écrivez Jet ID pour discuter, soulignez un, deux, trois et écrivez un nom d'utilisateur, Harley Et aussi pour Mike,
nous actualisons la page. Entrez Jet ID, pour
discuter, soulignez un, deux, trois et écrivez le nom
d'utilisateur, Mike Maintenant, tapez quelque chose Maintenant, seule
Harley comprend que Mike tape, et après 2 secondes, ce message est toujours là Laissez-moi vérifier l'événement. Nous gérons ici l'arrêt de saisie depuis le front-end et l'événement que nous émettons
depuis le back-end. Oh, c'est de la saisie rapide. Donc, sur notre interface, nous modifions
cet événement pour masquer la saisie. Enregistrez les modifications et
testons-le une fois de plus. Rafraîchissez la page. Écrivez un
identifiant de chat pour souligner un, deux, trois, et
ici, utilisez un nom Donc, pour Mike, nous
supprimons la page, saisissons l'identifiant du
chat pour souligner un, deux, trois, et
ici, nous utilisons un Maintenant, écrivez un message d' ici et si vous vous
arrêtez pendant 2 secondes, ce message disparaîtra. Cela fonctionne donc bien. Maintenant, voici une petite chose. Vous voyez, lorsque nous envoyons le message, pendant
un petit moment,
Mike est en train de taper. Ce
n'est pas ce que nous voulons. Nous émettrons donc également un événement d'arrêt de
saisie lorsque nous
enverrons le message. Copiez donc ce
point m pour Arrêter taper et collez-le à la
fin de notre formulaire d'envoi. Gardez les inges et laissez-moi y
goûter encore une fois. Actualisez la page, écrivez l'identifiant et le nom du
chat. De plus, nous faisons la même répression, écrivons l'identifiant et le nom du chat Maintenant, nous écrivons son
message et nous l'envoyons. Vous voyez, maintenant nous ne comprenons pas
ce type de saisie. Il existe quatre variantes de
méthodes : socket ao point, socket point I ao
point two room point M et socket point two room point m. Laissez-moi vous expliquer
chacune en termes simples. Donc, ne montrez pas la saisie. Cela enverra un
événement de saisie à tous les utilisateurs connectés, qu'ils rejoignent une salle ou non. Il enverra un événement show
typing à tous les utilisateurs
connectés au socket. Ensuite, nous avons le socket
point m, Show typing. Cela enverra l'
événement Afficher la saisie à l'expéditeur uniquement. Ensuite, nous avons la saisie du point deux, le point de la
pièce, montre la saisie. Cela enverra un événement de
saisie à tous les utilisateurs qui rejoignent cette
salle, y compris l'expéditeur. Dans notre cas, ce sont
Halley et Mic tous les deux. C'est pourquoi auparavant, nous obtenions un événement de saisie d'affichage pour les deux utilisateurs. Enfin, nous avons la saisie Socket Dot
Two Room Dot Show. Cela enverra un événement de
saisie à tous les utilisateurs qui rejoignent cette
salle, à l'exception de l'expéditeur. Si Hal tape, Haley n'aura pas accès à
cet événement de saisie d'émissions C'est la différence fondamentale
entre ces méthodes. Nous pouvons les utiliser en
fonction de nos besoins. Il n'y a aucune règle concernant
l'utilisation de ceci ou de cela uniquement. Nous utiliserons ce qui convient
le mieux à notre logique.
195. Appliquer un vrai code de message d'envoi: Actuellement, dans
notre application, lorsque l'utilisateur envoie un message, nous envoyons simplement ce message à tous les utilisateurs qui sont joints
à cette salle de discussion. Mais dans le monde réel,
nous devons également
enregistrer ces messages
dans notre base de données. Ainsi, même si l'utilisateur quitte la pièce, il peut voir ces nouveaux messages ainsi que l'historique
des messages. Sauvegardons notre message
dans la base de données. Tout d'abord, je tiens
à clarifier une chose. Lorsque, depuis le front
end, nous envoyons un message, il doit y avoir déjà un chat
créé entre les utilisateurs. Par exemple, si
Hurley veut envoyer un message à des souris et qu'elles n'ont jamais
discuté entre elles, cela signifie
qu'aucune discussion n'est
créée entre elles. Dans ce cas, lorsque Harley
envoie le premier message, nous appelons une API séparée qui
est notre API de création de chat, et lorsque Harley a un identifiant, nous émettons un
événement d'envoi de message avec l'identifiant de chat Nous le savons déjà, non ? N'oubliez pas qu'au début
de cette section, nous avons créé l'API d'envoi de messages. Oui, nous avons besoin de la même logique ici dans l'événement d'envoi de message. Copions donc ce code. Et lors de notre événement d'envoi de message, nous le collons simplement ici. Maintenant, tout d'abord,
nous devons rendre cette fonction de rappel asynchrone Bien. Nous obtenons maintenant identifiant du
chat et le contenu
du corps de la demande. Mais dans le socket, nous n'
avons pas de corps de requête, nous devons
donc obtenir l'identifiant du chat et le contenu à partir du paramètre de
fonction. Ici, nous déstructurons
ces données et obtenons ici l'identifiant et le contenu du
chat Maintenant, de quoi d'autre avons-nous besoin ? Bien, nous avons également besoin d'un identifiant utilisateur, donc nous l'obtenons également dans ces données. Et maintenant, nous n'avons plus besoin de cette ligne. De plus, en bas, nous envoyons des données
dans la réponse. Mais comme nous le savons, dans le socket, nous ne recevons pas de réponse Nous pouvons
donc simplement le supprimer et envoyer ce message de
remplissage depuis le socket situé sur le lieu de saisie des données envoyer ce message Comme dans le point 2,
nous utilisons uniquement l'identifiant du chat à la
place du point de données Jet ID. Voyons maintenant également où
nous utilisons notre réponse. Oui, dans l'erreur de retour, et ici nous utilisons également la réponse. À l'endroit de l'envoi d'
une erreur par le biais d'une réponse, nous pouvons envoyer
ici un
message d'erreur via un événement socket. Mais la question est de savoir à qui nous voulons envoyer
ce message d'erreur. Devons-nous l'envoyer à tous les
utilisateurs actifs dans cette salle ? Non, nous voulons envoyer ce
message d'erreur uniquement à l'expéditeur et me
dire quelle méthode de socket nous utilisons pour envoyer l'événement uniquement
à l'utilisateur actuel. vrai, nous utilisons le
socket point m.
Envoyons un événement appelé
error in send message, et nous envoyons simplement un
message d'erreur accès refusé. Maintenant, notre
code inférieur fonctionnera toujours. Donc, pour arrêter de l'exécuter, nous pouvons simplement ajouter ici, revenir. Ici, nous émettons également le même moteur d'événements d'erreur que
ce message dans ce message. Le texte du message de contenu est
obligatoire, puis nous ajoutons simplement return, ce qui empêchera notre code exécuter
le reste du code. Supprimons également ce code. Notre interface peut désormais gérer cet événement d'erreur comme
bon lui semble, qu' il affiche une alerte ou qu'il affiche
des notifications Toast. Ici, nous devons importer
ces modèles de chat et de message. En haut, avant ces
itinéraires, nous ajoutons des coûts, chat équivaut à
exiger des modèles de période, les chats à barres
obliques et
un autre message de coût équivaut à exiger des modèles de
période, des messages à
barre oblique, et Enregistrez les modifications et
goûtons à cette implémentation. Dans le frontend, le fichier
roomchat dots, nous pouvons enregistrer et envoyer un message nous envoyons les données ou non Oui, tout d'abord, ici,
sur le lieu de l'expéditeur, nous devons envoyer le nom d'utilisateur. Pour l'instant, nous ajoutons ici la valeur du point du
nom d'utilisateur. Donc, dans notre saisie de nom d'utilisateur, nous devons transmettre le nom d'utilisateur. Après cela, du contenu
à la valeur d'entrée. Ici, nous n'avons pas besoin de cette
création et de ce statut car elle sera générée automatiquement par les
mangues, et c'est tout Enregistrez ceci, et
reformulons la page. Ici, nous avons besoin du jet ID, donc nous copions le jet ID
du Mongo D que nous
passons et le collons ici Nous devons maintenant écrire
ici l'ID utilisateur à la place du nom d'utilisateur,
car dans le cas contraire, nous définissons l'ID utilisateur comme cette valeur point du
nom d'utilisateur. Nous copions un identifiant d'utilisateur de la collection d'
utilisateurs de Mongo Divi Compass et collons ici en tant qu'expéditeur.
Maintenant, écris un message. Disons que le socket est facile. Vous voyez, nous recevons le message et
si nous vérifions notre base de données, et qu'en bas, ce
nouveau message est également conservé, notre événement
d'envoi de message fonctionne correctement.
196. Authentifier un utilisateur dans Socket: Actuellement dans
notre implémentation, nous obtenons l'
identifiant utilisateur actuel depuis le front-end. Mais dans le monde réel, nous ne pouvons pas obtenir l'identifiant utilisateur directement
depuis le front-end. Évidemment, pour des
raisons de sécurité, car n'importe qui peut prendre n'importe quel
identifiant utilisateur et envoyer le message. Nous devons donc le rendre
un peu plus sûr. Et pour cela, nous
utiliserons un intergiciel socket. C'est le même concept que celui dans lequel nous
appliquons le middleware dans nos API Comme notre intergiciel s'exécute
avant chaque demande de
rappel, le middleware de socket s'exécutera
avant que de socket s'exécutera notre Laissez-moi vous montrer pratiquement. Ici, avant cette méthode
ao point on, nous définissons notre
intergiciel de socket en utilisant ao point U. Maintenant, dans cette méthode, nous
passons une fonction de rappel, qui s'exécutera avant que
l'utilisateur ne se connecte Pour l'instant, nous ajoutons simplement ici journal point de
la console, exécutant le
socket middleware Enregistrez les modifications et
actualisons notre interface. Ici, le chat, l'identifiant, le chat
soulignent un, deux, trois. Maintenant, si nous vérifions
notre terminal principal, voyons, nous commençons exécuter le socket middleware.
Mais c'est quoi ça ? Aucun utilisateur ne se connecte. Donc, ici, dans notre intergiciel de
socket, notre code s'arrête Nous devons le déplacer dans
la fonction suivante, comme nous l'avons fait dans notre
Express ou notre middleware Dans cette fonction de rappel, à la première position, nous obtenons un objet socket, qui est utilisé pour obtenir
des informations sur ce socket Et au deuxième
paramètre, nous obtenons next, qui fonctionne de la même manière que la fonction
next dans
Express Middleware Maintenant, après cette console, nous appelons simplement cette fonction
suivante. Enregistrez les modifications et
réprimez la page. Entrez ici le jet ID, et maintenant dans notre terminal,
C, nous lançons d'abord le
socket middleware, puis nous nous connectons à l'utilisateur Ainsi, il est clair le socket middleware est en cours d'exécution avant que notre client ne
se connecte au Maintenant, dans ce middleware socket, nous pouvons authentifier l'
utilisateur, et comment pouvons-nous le faire ? Nous l'avons déjà fait dans
notre intergiciel d'authentification. C'est vrai. Pour l'authentification,
nous utilisons JWT Donc, dans ce middleware, nous vérifions que l'utilisateur passe
le jeton JWT C'est valide ou non. S'il est valide, ce n'est qu'alors que l'utilisateur
peut se connecter au socket. Et si le jeton n'est pas valide, nous n'autoriserons pas
l'utilisateur car pour Jet, nous avons besoin d'un utilisateur connecté. Maintenant, vous vous demandez peut-être
comment pouvons-nous obtenir jeton dans cette fonction d'
intergiciel Nous allons donc utiliser ici
l'objet socket. Le jeton Const est donc égal
au socket point Hensig. Ici, nous obtenons des données que nous transmettons avec notre connexion
socket. Notre plan est d'obtenir des données dans objet OT et de passer un
jeton à l'intérieur de celui-ci. Ici, nous écrivons socket
point hensgtth point token. Après cela, nous
passons simplement ici cette condition. Si le jeton n'est pas disponible, que
faisons-nous ? Nous rejetons simplement la connexion. Pour rejeter la connexion,
nous renvoyons ici la fonction suivante, et à l'intérieur de celle-ci, nous devons
transmettre une nouvelle erreur Ici, nous passons le message d'erreur à l'erreur d'authentification,
jeton requis. Et si l'utilisateur passait un jeton ? Nous vérifions simplement ce jeton, et pour cela, nous avons besoin de JWT Donc, au sommet, le coût, JWT est égal au jeton Web
JSON requis Bien. Maintenant, dans la base de données, nous ajoutons JWT dot verify Au premier argument,
nous passons le jeton, et au second argument, nous passons notre
clé secrète process point
Env point JWT underscore Permettez-moi de vérifier le nom de
cette variable. Oui, c'est la clé JWT. Maintenant, si ce jeton est
vérifié avec succès, nous
arrivons ici aux données utilisateur, nous transmettons avec un jeton Nous le stockons dans
une variable appelée user, puis nous pouvons simplement faire en sorte que socket point user soit égal à cet utilisateur. Je tiens également à vous faire savoir que l'objet socket est
différent pour tous les utilisateurs. Ainsi, lorsque notre utilisateur
se connecte au socket, notre socket
lui attribue cet objet, et de ce fait, il est
individuel pour tous les utilisateurs. Cet utilisateur du socket possède les données de nos utilisateurs
actuellement connectés. Donc, pour voir cela,
il suffit de configurer le point log, socket user et d'adhérer au
socket point user, puis nous avons la fonction suivante. Et si ce
jeton n'était pas vérifié ? Nous devons également nous occuper de
cette affaire. Nous ajoutons donc ici blog
try and cache et déplaçons
simplement ces quatre
lignes dans le blog Try. Donc, si quelque chose ne va pas
dans ces quatre lignes, notre méthode de cache s'exécutera. Donc, dans le cache, ce que nous faisons correctement, nous rejetons simplement la connexion. Copions donc la fonction
suivante avec
l'erreur et collons-la ici. De plus, dans notre
interface de dégustation actuelle, nous devons envoyer les données
utilisateur du socket point depuis le back-end. Donc, ici, j'ajoute simplement l'événement de données utilisateur socket
point, et nous transmettons simplement
socket point user. Lors de cet événement, notre interface recevra les données des utilisateurs connectés. Sinon, nous devons saisir manuellement le nom
d'utilisateur pour la dégustation. Passons maintenant à cette implémentation. Pour cela, nous devons exécuter
notre fichier de test final. Honnêtement, c'est le
dernier fichier de test. Ne t'inquiète pas. Dans notre dossier
frontal, nous obtenons un dossier appelé test
final. Et ici, comme nous le savons, nous devons exécuter ce fichier SDML Mais avant cela, voyons ce que j'ai fait dans le fichier
JavaScript. Tout d'abord, je
demande un jeton dans lequel nous devons saisir le jeton Web
Jason. Si nous saisissons un jeton, nous serons les seuls à
connecter l'utilisateur au socket. Mais attendez, ce
que j'ai fait,
j' ajoute ici un objet que nous
envoyons au socket
et dans cet objet, nous passons un OT et un
jeton à notre jeton. Cet objet se trouve
dans notre backend dans le socket point hang point th
point tgon Maintenant, si ce jeton est vérifié
, notre connexion
sera réussie. Et si ce jeton n'est pas
vérifié ou a expiré, alors dans l'erreur socket
point on Connect, nous obtenons l'erreur socket
middleware De plus, lorsque nous
obtenons un événement de données utilisateur, je place simplement ces données
dans cette variable utilisateur. De plus, tout le code lié au socket, nous l'avons ajouté ici dans
cette condition if. Voyons voir si cela fonctionne ou non. Ouvrez donc ce fichier SDML dans
les onglets de fermeture du navigateur. Maintenant, tout d'abord, il
va demander un jeton. Passons ici un, deux, trois, et comme nous le savons, ce jeton ne
sera pas vérifié
par notre backend. Voyons ce que nous allons obtenir. Appuyez sur OK. Vous voyez ici que nous obtenons une
erreur d'authentification, jeton requis. Ouvrez postman et ouvrez simplement API de
connexion, envoyez la
demande et obtenez le jeton Copiez-le et
collez-le simplement dans notre fichier SDML. voyez, nous n'avons pas l'erreur, et si nous vérifions
notre terminal Bend, nous obtenons ici les coordonnées de l'utilisateur
avec son identifiant et son nom d'utilisateur et nous connectons
également un utilisateur, ce qui signifie que notre intergiciel
fonctionne plutôt bien Maintenant, nous utilisons cet
utilisateur socket point dans notre événement socket. Dans l'événement d'envoi d'un message, supprimez cet ID utilisateur du
paramètre, et en haut, nous ajoutons un identifiant d'utilisateur de coût égal à socket point user
et un identifiant de score. Assurez-vous de vérifier le nom de la
propriété ID et, lors l'événement de saisie, au lieu d'obtenir le nom d'utilisateur
depuis le front-end, nous pouvons transmettre ici socket
point user, point user, point user, et nous faisons de même lors de
l'événement stop typing, socket point user, point user, point user. Maintenant, nous supprimons également le
paramètre de nom d'utilisateur pour les deux événements. Maintenant, goûtons à nouveau à
ce message d'envoi. Supprimez donc la page
et basez le jeton. Maintenant, nous avons besoin de l'identifiant du chat, alors copiez-le également à partir
du MongoIVCMpass Collez-le dans l'
identifiant du chat et cliquez sur Rejoindre la salle. Sans rejoindre la salle, nous ne pouvons pas envoyer de message. Maintenant, si nous envoyons le
message d'ici, disons que c'est le premier message de
dégustation finale. voyez, nous recevons ici
le nouveau message, et si nous vérifions notre backend, il est également
stocké dans la base de données avec les données utilisateur
appropriées. Donc, pour résumer rapidement notre socket, nous ne devons pas obtenir les données utilisateur directement depuis le
front-end. Ce ne sera pas sécurisé. Nous créons donc ce
middleware de socket et demandons jeton
JWT avant de connecter
l'utilisateur à Ensuite, nous vérifions
ce jeton et définissons
simplement les données du jeton
dans le socket point user. Ici, nous pouvons donc utiliser cet utilisateur socket point dans toute
notre logique de socket. De plus, comme nous le savons,
l'utilisateur du socket point est individuel pour
tous les utilisateurs du socket. C'est ainsi que nous appliquons et
sécurisons notre socket à
l'aide du jeton Web JSON. Ici, comme nos
concepts précédents sont clairs, il est très facile de comprendre sujets
avancés tels que
le socket middleware C'est pourquoi j'explique socket étape par étape afin que vous
puissiez le comprendre correctement.
197. Marquer les utilisateurs comme en ligne et hors ligne ine: Comment savez-vous que dans de
nombreuses applications de chat,
nous activons l'utilisateur
ou le marquons en ligne. Pensez-vous à la manière dont ils
appliquent cette fonctionnalité ? Ne vous inquiétez pas dans cette leçon, nous marquerons les utilisateurs comme étant
en ligne et hors ligne. Tout d'abord, que
pensez-vous lorsqu'un utilisateur est en ligne ? Pensez-y dans
le langage humain. Notre utilisateur est en ligne
lorsqu'il se connecte au socket, et lorsqu'il est hors ligne,
écrivez, lorsque l'utilisateur quitte
votre application, ou nous pouvons dire qu' déconnecté du socket, c'est aussi
simple que cela. Ici, avant ces méthodes IO, nous déclarons qu'un nouveau
coût variable pour les utilisateurs en ligne est égal à une nouvelle carte. Maintenant, certains d'entre vous se
demanderont peut-être, qu'est-ce que cette carte ? La carte est une
version avancée de votre objet. Il s'agit également
de la collecte de la paire clé-valeur. La carte possède plus de fonctionnalités
qu'un objet. Donc, comme nous le savons, dans
un objet, la clé est le ressort. En valeur, nous pouvons lui
attribuer n'importe quelle valeur. Mais dans la carte, nous pouvons définir
n'importe quelle chaîne, nombre, lingot, objet,
tableau, fonction, n'importe quel type peut être clé Bref, pour les suppressions d'
ajouts fréquentes, la carte est généralement plus
efficace que l'utilisation d'objets Il est conçu pour gérer les paires
clé-valeur de manière
plus efficace. Sur cette carte, chaque fois qu'un utilisateur se joint, nous pouvons ajouter cet ID utilisateur en tant que clé et son identifiant de
point de socket en tant que valeur. Donc, ici, dans le
point io sur la connexion, nous écrivons simplement le jeu de points des utilisateurs
en ligne. Au premier argument, nous passons au socket point
user point score ID, qui est la clé
au deuxième argument, nous passons au socket point ID,
qui est notre valeur. Il ne nous reste plus qu'à supprimer l'utilisateur lorsque sa
connexion sera perdue, qui signifie simplement que
cet utilisateur est hors ligne. Donc, tout en bas, nous ajoutons le socket point. Ici, nous passons la déconnexion, puis nous passons la fonction de
rappel La méthode de déconnexion sera exécutée lorsque connexion au socket de l'
utilisateur durera. À ce moment-là, cette méthode de
déconnexion exécutera automatiquement. De plus, lorsque l'utilisateur ferme
l'onglet du navigateur
, cette
méthode de déconnexion s'exécute automatiquement. Nous n'avons donc pas à nous soucier d'une méthode
de déconnexion depuis le front-end. Ici, nous ajoutons
simplement l'identifiant point delete, socket point user
point underscore ID, qui est l'identifiant
utilisateur actuel voyez, sur la carte, nous
pouvons directement utiliser méthodes
set et delete pour ajouter
et supprimer des paires clé-valeur. Voyons maintenant si cela
fonctionne ou non. Nous respectons donc simplement le journal à points de la
console, les utilisateurs
en ligne et
les utilisateurs en ligne. Copions donc cette
console et collons-la lorsque nous ajouterons un utilisateur sur cette
carte. Maintenant, goûtons ça. Alors, placez le fichier SDML
dans le nouvel onglet, collez ici votre jeton Et si nous examinons
notre terminal Bend, nous pouvons
voir ici la clé de
l'utilisateur en ligne pour l'ID utilisateur et l'ID de
socket comme valeur. Et si nous fermons notre onglet, nous pouvons voir ici que notre utilisateur
en ligne est vide. C'est donc facile. Vous pouvez envoyer ces
utilisateurs en ligne vers votre interface et
afficher les indicateurs sous forme de
point vert ou autre chose.
198. Plusieurs prises pour un seul utilisateur: Voici une chose dans notre implémentation
actuelle. Comme nous le savons, notre application
sera utilisée sur le navigateur ou notre backend
peut être utilisé dans des applications Si notre utilisateur s'est connecté
dans un onglet, l'ID utilisateur et l'
ID de socket seront ajoutés aux utilisateurs en ligne. Maintenant, s'il ouvre un nouvel onglet
et se connecte au socket, alors chez nos utilisateurs en ligne, nous obtenons une autre clé comme identifiant utilisateur. Mais ici, la
clé précédente et la clé actuelle sont identiques à cause de cela, cet identifiant de socket sera
remplacé par un nouvel identifiant de point de socket. Maintenant, imaginez qu'il ferme
uniquement le deuxième onglet. Cela supprimera également cette valeur de clé utilisateur et
marquera notre utilisateur comme étant hors ligne. Mais le voilà toujours en ligne. Il est toujours en ligne
dans le premier onglet. Nous devons donc ici résoudre
ce problème de duplication. Quelle est donc la solution ici ? Nous pouvons ajouter l'ID utilisateur comme
clé, comme avant. Mais au lieu de définir directement l'identifiant du
socket, nous pouvons ajouter un tableau ou un
ensemble d'identifiants de socket, ce qui signifie que deux onglets
ont deux identifiants de socket. Nous avons les deux dans ce tableau, et si l'utilisateur ferme un seul onglet
, nous ne pouvons supprimer que cet ID de socket
particulier du tableau. Vous pouvez voir à quel point nous
progressons. C'est juste une blague. Implémentons
cela dans notre application. Tout d'abord, avant cela, nous ajoutons que cost user id is equal to socket point user
point underscore ID Maintenant, dans le jeu de points pour
les utilisateurs en ligne, nous avons d'
abord l'identifiant utilisateur, et en second
lieu, en tant que valeur, nous passons New Set. Vous pourriez vous demander ce qui est défini. Set est la
version avancée des tableaux. Ne t'inquiète pas Ils
sont vraiment simples. La raison pour laquelle nous utilisons ici set
à la place du tableau est que nous pouvons facilement ajouter et supprimer des identifiants
de socket du socket. Cette ligne signifie que nous créons une nouvelle paire clé-valeur
chez les utilisateurs en ligne. La clé est l'ID utilisateur et la valeur définie est vide. Ici, nous voulons créer
une nouvelle paire clé-valeur si
notre nom d'utilisateur n'est pas déjà
disponible pour les utilisateurs en ligne. Nous passons donc ici à la condition. Si les utilisateurs en ligne ont un nom d'utilisateur, si celui-ci est faux, nous passons exclamation Mg. Ce n'est qu'alors que nous
créons une nouvelle paire clé-valeur. Déplacez donc cette ligne ici. Maintenant, après avoir ajouté une nouvelle paire, ou même si l'identifiant utilisateur est déjà disponible,
que voulons-nous faire ? Bien, nous voulons simplement ajouter un identifiant de point de
socket dans la valeur. Nous écrivons donc aux utilisateurs en ligne point
G, que voulons-nous obtenir ? Écrivez UserId sous forme de clé, et pour ajouter une valeur dans le set, nous utilisons la méthode point add et
transmettons ici le socket point ID Et par cette ligne, nous ajoutons valeur de l'identifiant du point de
socket dans un ensemble où la clé est l'
identifiant utilisateur, c'est aussi simple que cela. Donc, ici, à la place de l' socket point user
point underscore ID, nous passons l'identifiant utilisateur Maintenant, lors de la déconnexion, nous voulons supprimer l'ID de socket
actuel. Donc, les utilisateurs en ligne n'ont pas d'identifiant utilisateur
point Dili, socket point ID. Cela supprimera l'identifiant socket point de l'ensemble où la
clé est l'identifiant utilisateur. Maintenant, que se passe-t-il si notre utilisateur
n'a aucun identifiant de socket dans la valeur ? Dans ce cas, nous souhaitons également
supprimer l'ID utilisateur en tant que paire. Nous pouvons ainsi marquer
notre utilisateur hors ligne. Nous respectons donc votre condition
si le point des utilisateurs en ligne GET userid
est égal à zéro Ensuite, nous indiquons simplement
aux utilisateurs en ligne de points Dilate UserID. Comme vous pouvez le constater, nous pouvons facilement ajouter et supprimer
des éléments de l'ensemble. Au lieu d'utiliser un tableau
où nous devons trouver l'
index de cet élément
puis le supprimer, nous pouvons facilement ajouter et
supprimer des éléments de l'ensemble. Voyons voir si cela fonctionne ou non. Supprimez donc la page, page ici, notre jeton Maintenant, dans le terminal, nous obtenons une carte, qui a une valeur clé, identifiant
utilisateur et un socket. Maintenant, dans le navigateur,
nous ouvrons un autre onglet. Ici, nous ouvrons notre fichier DML, et encore une fois, laissez-moi
coller le même jeton Bien, et
vérifions le terminal. Vous voyez ici que nous avons un identifiant utilisateur, et il a deux valeurs, qui sont notre ensemble d'identifiants de socket. Essayons maintenant de fermer
cette deuxième connexion. Encore une fois, vérifiez le terminal. Vérifiez que le dernier identifiant de socket
est supprimé d'ici, mais que notre utilisateur est toujours en ligne. Maintenant, si nous avons également fermé le
premier onglet, vérifiez le terminal. Vous voyez, notre utilisateur est
retiré de la carte, ce qui signifie qu'il est maintenant hors ligne. Voilà à quel point il est simple de
marquer les utilisateurs en ligne et hors ligne. Je sais que cette section
est un peu longue, mais vous pouvez voir comment fonctionne
cette
application en temps réel. Et si vous apprenez
cela, vous pouvez créer de nombreux types d'applications
en temps réel. Maintenant, ici, vous pouvez
faire une petite pause, boire de l'eau,
étirer votre corps ou écouter de la musique. Ici, je fais également une
petite pause et nous nous
retrouverons lors de la prochaine leçon.
199. Mettre à jour les messages délivrés: Voyons comment nous pouvons mettre à jour le statut du message pour qu'il soit livré. Tout d'abord,
découvrons sa logique
afin que vous puissiez
bien comprendre lorsque vous écrivez le code. statut
« livré » signifie donc que le message est parvenu à
l'appareil destinataire. Il y a maintenant deux situations. Imaginez que l'expéditeur
envoie le message. Tout d'abord, nous stockons ce message dans la base de données avec le
statut à envoyer. Maintenant, à ce moment-là, si le
destinataire est en ligne, ce que nous saurons par nos utilisateurs
en ligne est variable. Donc, si le destinataire est en ligne, nous marquons immédiatement
ce message comme livré. Il s'agit de la première situation. Maintenant, une autre situation est que
notre destinataire est hors ligne, ce que nous connaîtrons également
selon la variable des utilisateurs en ligne. Ainsi, si l'identifiant du destinataire n'est pas
disponible chez les utilisateurs en ligne, cela signifie qu'il est hors ligne. Donc, si le destinataire est hors ligne, statut de notre message est
initialement envoyé. Désormais, chaque fois qu'un destinataire
se connecte au socket, nous récupérons tous les messages
non livrés et les marquons comme Il s'agit de la deuxième situation. Appliquons-les un par un. Notre première situation, notre
destinataire est en ligne. S'il ou elle est en ligne, nous marquons simplement le message comme livré lorsque l'expéditeur
envoie le message. Dans l'événement d'envoi d'un message, ici dans le nouveau message, nous devons vérifier que le destinataire de
ce chat est en ligne ou non. Les consors aux utilisateurs en ligne pointent, et ici nous devons transmettre l'identifiant du destinataire. Mais
comment pouvons-nous l'obtenir ? Bien, nous les obtiendrons
auprès des participants, mais il s'agit également d'un tableau
avec un identifiant d'expéditeur. À partir de ce tableau, nous
devons donc filtrer l'ID de l'expéditeur. Ici, const
recipients est égal à at point participants
dot filter Ici, nous obtenons chaque fonction de flèche d'
identification et nous passons simplement ici condition ID point deux chaînes ne
doivent pas être égales à l'ID utilisateur. Ici, nous obtenons un tableau avec un seul identifiant car nous n'avons que deux
utilisateurs parmi nos participants. C'est pourquoi ici,
dans la méthode He, nous transmettons aux destinataires un paquet
carré, index zéro, qui est le premier élément et
c'est Mongo DiBid, nous devons le convertir en
chaîne Par conséquent, nous ajoutons une chaîne à
points deux. Maintenant, que voulons-nous faire
si notre destinataire est en ligne ? Nous renvoyons simplement
le statut à livré. Si ce n'est pas le cas, dans le cas contraire, nous retournerons envoyés. C'est ça. Il s'agit
de notre première situation. Maintenant, notre deuxième situation est que
notre destinataire est hors ligne. Ainsi, lorsque le destinataire ouvre
l'application et se connecte au socket, nous récupérons tous les messages
non livrés et
les marquons simplement comme Ici, dans le socket, nous écoutons
un autre événement sur le socket point, Marquer les messages comme livrés. Nous émettrons cet événement
depuis le front end lorsque notre utilisateur se connectera et se
connectera au socket. Maintenant, à l'intérieur de cela, nous
devons effectuer quelques étapes. Assurez-vous d'écrire ces
étapes dans la commande. Sinon, vous
serez confus. Tout d'abord, nous devons trouver tous les messages de chat dans
lesquels notre utilisateur est disponible. Le coût des messages non livrés est donc égal à wait message point find De plus, nous rendons cet appel à la fonction
Web asynchrone. Bien. Comme nous
le savons en première position, nous passons
ici un objet
avec condition. Donc, d'abord, le statut à envoyer et l'expéditeur
ne doivent pas être l'utilisateur actuel. Expéditeur dans objet, nous utilisons le dollar N pour les valeurs non égales et nous
transmettons ici le nom d'utilisateur. Nous n'avons donc pas besoin de tous les
champs des messages. Nous ajoutons donc ici une
méthode de sélection, et à l'intérieur de celle-ci, nous transmettons un identifiant de score, identifiant de
chat et un expéditeur. Maintenant, cette requête
trouvera tous les messages
dont le statut est envoyé et dont l'expéditeur n'est pas
notre utilisateur connecté, mais elle ne
vérifiera pas si notre
utilisateur connecté
participe ou non au chat. Ici, nous devons également
transmettre un identifiant de chat. Avant cette requête,
nous devons donc trouver tous les jets dans lesquels notre
utilisateur connecté est disponible. Les identifiants de chat Const sont donc équivalents
à wait chat point find. Ici, nous passons l'objet avec
les participants à l'ID utilisateur. Cela nous permettra de
discuter comme ça. Mais ici, nous ne voulons que des identifiants de chat car c'est cet identifiant que nous
transmettrons dans notre requête de mise à jour. Donc, pour détourner l'attention des seuls identifiants des données
de Mongo Di B, nous avons une autre méthode appelée
distins. Dans les codes,
nous passons le nom complet que
nous voulons détourner,
à données
de Mongo Di B,
nous avons une autre méthode appelée
distins. Dans les codes,
nous passons le nom complet que
nous voulons détourner,
à savoir l'identifiant de soulignement. Donc, auparavant, sans méthode
distincte, nous obtenions des données comme celles-ci. Maintenant, avec le disting, nous obtenons
nos données comme ceci. Nous pouvons donc simplement transmettre ces identifiants de
chat dans notre fine requête. Donc, identifiant de chat, deux
dollars de calibracet dans les identifiants de chat. Alors maintenant, il
ne trouvera que les messages dans lesquels notre
utilisateur verrouillé est disponible. Génial. Il ne nous reste plus qu'à
mettre à jour ces messages. Nous passons donc ici à la
condition I : les
messages non livrés ont une longueur de point
supérieure à zéro Ce n'est qu'alors que nous voulons mettre à
jour le statut des messages. Dans ce calibrage, attendez la mise à jour de nombreux points de
message. Dans un premier temps, nous passons un objet pour trouver les messages
non livrés Nous passons donc l'
ID de soulignement à l'objet. Ici, nous utilisons le dollar, et comme nous le savons ici, nous devons transmettre un ensemble d'identifiants de message. Comment
pouvons-nous l'obtenir ? Nous les obtenons à partir de messages
non livrés, c'
est-à-dire de la série d'identifiants. Nous rédigeons une carte à points
des messages non livrés. Ici, nous obtenons chaque fonction de flèche de
message, et nous renvoyons simplement l'identifiant du point de soulignement du
message Par cette expression,
nous obtenons le tableau des identifiants des messages
non livrés car la méthode map renvoie un tableau De plus, nous pouvons directement transmettre les messages
non livrés ici. Mais pour le moment, je m'en tiens à ça. Si vous souhaitez le
faire séparément, vous pouvez également le faire. Que souhaitez-vous mettre à jour maintenant ? Pour cela, nous passons une autre tranche de Cali
et passons ici le dollar défini à l'objet, le
statut à la livraison Assurez-vous d'écrire correctement
l'orthographe que vous avez écrite dans le schéma du message. Nous avons donc mis
à jour les messages avec succès. Maintenant, voici une partie amusante. Qu'est-ce que tu en penses ? Que
devons-nous faire ensuite ? Donc, pour expliquer cela plus clairement, imaginez que Hale et
Mike discutent une seule fois. Mike est actuellement hors ligne
et Hali a envoyé trois messages. Comme nous le savons, par défaut, son statut sera envoyé. Ici, notre destinataire n'
est pas en ligne. La logique de l'événement d'envoi du message ne
fera rien. Le statut restera tel qu'il a été envoyé. Maintenant, comme Halley, John envoie également deux
messages à Mike Leur statut sera
également défini comme envoyé. Maintenant, après un certain temps, Mike se connecte et se connecte
à la prise. Au moment où nous mettrons à jour
ces trois messages de Halley et deux
messages de John, soit un
total de cinq messages, total de cinq messages, nous mettrons à jour le
statut tel qu'il a été livré Maintenant, qu'est-ce que Halley et John vont obtenir du backend ? Nous pouvons simplement envoyer identifiant des trois messages de
Halley à Halley et l'identifiant des deux messages de
John à John
et leur indiquer les messages dont les identifiants sont ces identifiants,
ces messages sont mis à jour au fur Notre interface utilisateur mettra donc à jour
la partie interface utilisateur à l'aide de ces identifiants, ce qui signifie que le front end peut
afficher des icônes de double vérification. est aussi simple que ça. Maintenant,
voici une chose. Imaginez que Halley envoie 100 messages et que Mike est hors ligne
pendant un an. Et quand il sera en ligne, après la mise à jour, si nous envoyons les cent
identifiants de messages à Halley, cela peut augmenter la charge de données Donc, je pense qu'au lieu
de transmettre l'identifiant de tous les messages,
nous pouvons envoyer des ID jet dont les titres sont mis à jour pour être envoyés, et cet identifiant de chat unique
couvrira tous les messages contenus
dans ce chat Nous n'avons donc pas besoin de
transmettre l'identifiant de tous les messages. Donc, ici, notre
conclusion est que nous allons créer un objet où le nom de
propriété est l'ID utilisateur, et en tant que valeur, nous allons stocker un tableau d'identifiants de discussion
qui sont mis à jour. La raison pour laquelle nous utilisons ici un ensemble d'identifiants de discussion est qu'il
fonctionnera également pour le chat de groupe. Pour un seul utilisateur, il peut y avoir plusieurs identifiants de chat dont les messages
sont mis à jour au fur et à mesure de leur réception. Maintenant, après avoir obtenu cet objet, nous allons choisir cet ID utilisateur,
trouver l'ID du socket sur
notre carte des utilisateurs en ligne,
puis simplement émettre le message d'événement délivré et envoyer
ces identifiants de discussion. Actuellement, ne pensez pas à la façon dont front-end mettra à jour
les discussions. Elle peut être gérée. Ici, notre objectif principal est de
créer cet objet et envoyer un message
d'événement à chaque expéditeur. Le reste du travail
est effectué par le front-end. Notre interface mettra également à jour
tous les messages de
la liste de discussion et de la liste
des messages ou
redirigera simplement les données Implémentons cette partie. Nous allons procéder étape par étape. La première est que nous devons
créer cet objet qui a l'ID utilisateur comme propriété et
un tableau d'identifiants de chat comme valeur. Les identifiants de discussion groupés Const sont égaux aux messages
non livrés. Réduction des points Ici, nous avons deux paramètres, AEC, qui est l'accumulateur, l'accumulateur résultat Au fur et à mesure que nous recevons un message qui est
l'objet du message unique ,
la fonction
flèche, et au deuxième argument, nous pouvons transmettre la
valeur par défaut de cet accumulateur Nous passons donc ici un objet vide. Tout d'abord, nous allons vérifier. L'expéditeur du message est déjà disponible dans notre objet
SC ou non. J'ai un crochet
pour accéder à la clé de l'objet et passer
ici le point du message à l'expéditeur. S'il s'agit d'un accumulateur, l'expéditeur du
point de message n'est pas disponible, nous ajoutons
donc ici un point d'exclamation Ensuite, à l'intérieur de celui-ci, nous créons une propriété dont
le nom : accumulateur, crochet, point de
message, expéditeur est égal à un tableau vide Ensuite, nous pouvons simplement ajouter
cet identifiant de jet dans ce tableau. Accumulateur, paquet carré, expéditeur à points de
message, message push à
points, identifiant de chat à points Ce message JetD est un identifiant d'objet, nous devons
donc le convertir
en chaîne À la fin, nous renvoyons simplement
l'accumulateur. Cela garantit que l'accumulateur continue de
croître avec les nouveaux messages. Maintenant, dans ce code, il
y a un petit problème. Si un expéditeur a plusieurs
messages dans le jet, nous dupliquerons
ces identifiants de jet dans le tableau, mais nous ne voulons pas envoyer d'identifiants de jet
dupliqués dans le réseau. Donc, à la place de ce
tableau, nous pouvons utiliser set. Set n'ajoutera pas de valeurs
dupliquées. Donc, à la place de
ce tableau vide, nous ajoutons un nouvel ensemble, et au lieu d'
utiliser la méthode point push, nous utilisons la méthode point Ed pour l'ensemble. Les identifiants de discussion de groupe
renverront un objet avec l'expéditeur comme propriété et définiront
les identifiants de discussion comme valeur. Maintenant, également à la fin, nous avons besoin de valeurs dans un tableau, nous devons
donc convertir l'
ensemble en tableau. Pour cela, nous utilisons
ici pour loop const, identifiants de discussion de groupe de
l'expéditeur Dans cette boucle, nous groupons simplement les identifiants de discussion, l'expéditeur
entre crochets est égal à un tableau
vide et à l'intérieur de celui-ci un opérateur de
diffusion et nous ajoutons
simplement des identifiants de discussion de groupe entre
crochets expéditeur. Nous avons maintenant notre
objet avec l'ID utilisateur comme propriété et un tableau
d'identifiants de chat comme valeur. Maintenant, nous devons simplement émettre à l'expéditeur et transmettre
le tableau
d'identifiants de jet sous forme de données. Ici, nous utilisons à nouveau for loop, const sender ID, groups jets L'identifiant de l'expéditeur est la clé de
notre objet ID de discussion de groupe. Maintenant, dans cette boucle,
nous devons trouver que l'identifiant de l'expéditeur est en ligne ou non. Const sockets est donc égal à utilisateurs
en ligne aient un point Get sender ID Si nous avons des sockets, dont nous
savons déjà qu'ils peuvent être matriciels, nous utilisons des
sockets point pour chacun. Ici, nous obtenons un identifiant de socket
individuel, fonction
flèche, et à l'intérieur,
nous avons simplement mis à jour l'état de deux messages
socketd.it nous avons simplement mis à jour l'état de deux messages
socketd.it Au deuxième paramètre, nous transmettons les identifiants des objets de données aux
identifiants de discussion de groupe, à savoir l'identifiant de l'expéditeur du paquet
carré. Cela enverra tous les
ID CAT à cet expéditeur. Donc, si vous le souhaitez, nous pouvons le
déclarer séparément. Le coût des identifiants de chat est donc
égal aux identifiants de discussion de groupe, entre
crochets, à l'
identifiant de l'expéditeur, et en bas, nous transmettons les identifiants de chat aux identifiants de
chat et c'est fait. Passons maintenant à cette
implémentation. Donc, les modifications, ouvrez le navigateur. Dans la première fenêtre, je me
connecte avec le jeton de Hal. Et à la deuxième fenêtre, je me suis connecté avec
un autre compte. Générez un nouveau jeton
pour un autre compte. Et collez-le sur notre site Web. Maintenant, rejoignons Room. Copiez donc l'identifiant de chat depuis la boussole Mongo Dew,
collez-le et rejoignez la salle
depuis le compte Hi Maintenant j'envoie un message. Il s'agit de tester la première situation
de livraison et de l'envoyer. Tu vois, on nous livre ici. Il s'agit de notre première implémentation lorsque notre destinataire est en ligne. Maintenant, testons quand notre
destinataire est hors ligne. Fermons donc cette
deuxième fenêtre et
envoyons à nouveau le message de Bonjour, nous testons une deuxième situation
de livraison. Regardez ici, nous ne recevons pas de
message. Si nous vérifions notre base de données, notre collection de
messages, actualisons la collection,
et enfin, nous obtenons que le
statut de notre message est envoyé, ce qui signifie qu'il n'a pas été livré. Désormais, lorsque notre deuxième
utilisateur se connecte, statut de
ce message
devrait être mis à jour et Hardy obtient
également les identifiants de discussion
dont les messages sont mis à jour. Ouvrons la page SDML
dans la deuxième fenêtre. Connectez-vous avec le deuxième jeton de
compte, où se trouve-t-il, copiez-le
et ajoutez-le dans le jeton. Maintenant, dès que nous appuyons sur OK, S dans la première fenêtre, l'
icône de notification apparaît sur cet onglet, et lorsque nous passons à cette fenêtre, nous recevons vos
messages d'envoi. Cela signifie que notre implémentation
fonctionne bien. De plus, dans la console, vous obtiendrez des ID
de jet mis à jour. C'est une partie très intéressante
de l'application de chat. Même le changement
de statut en scène n'est pas si difficile car cet
état de mise à jour est fourni. Si vous êtes confus, vous
pouvez revoir cette leçon, comprendre la logique
et
comparer la logique à votre code. De cette façon, tous vos
doutes seront dissipés. Dans la leçon suivante, nous allons implémenter le statut
des messages de mise à jour tel que vu.
200. Mettre à jour l'état du message pour qu'il soit vu: Voyons comment mettre à jour
le statut du message en scène. Le statut vu signifie que notre
destinataire a vu ce message. Nous sommes donc également confrontés à
deux situations. Comprenons-les par l'exemple. Imaginez que Harley ait quatre messages
invisibles de Mike. Le
statut de ces quatre messages est délivré. Maintenant, au moment où Halley
ouvre le chat de Mike au moment où nous mettons à jour
le statut de
ces quatre
messages livrés sur scène Nous devons donc récupérer les
messages livrés et
les mettre à jour comme indiqué lorsque notre
utilisateur ouvre le chat Il s'agit de notre première situation. Imaginez maintenant que Harley est déjà disponible dans
le chat ou dans le salon et que Mike envoie un message À ce moment-là, nous devons
également marquer le nouveau message Setters to scene car Hurley est déjà disponible
dans le salon de discussion Il s'agit de notre deuxième situation. Mettons-les en œuvre un par un. Donc, dans le premier cas, nous devons mettre à jour les statistiques lorsque notre utilisateur rejoint la
salle où nous discutons. Ici, nous écoutons
un autre événement, appelons le socket point on, marquons les messages tels qu'ils sont vus et nous
passons ici la fonction de rappel Tout d'abord, nous retrouverons tous les messages qui
ne sont pas vus par notre utilisateur actuel Donc, const unseen
messages équivaut à wait message point find, et ici nous passons premier identifiant de
chat de l'objet de
comparaison à l'identifiant de chat, et nous obtiendrons l'identifiant
du chat depuis le front end
dans ce paramètre Rendons cette
fonction asynchrone. Revenons à notre objet de comparaison, ID de chat à ID de chat, expéditeur à Cully entre crochets, dollar NE n'est pas égal à l'ID utilisateur, qui est l'ID
utilisateur actuel que nous obtenons
du socket middleware et lorsque
nous passons le statut Maintenant, ici aussi, nous voulons
obtenir uniquement les remplissages sélectionnés, donc sélectionnez des points et
attribuez un identifiant et un expéditeur Maintenant, après cette requête fine, nous respectons la condition si longueur des points des messages
invisibles
est supérieure à zéro, alors
seulement nous exécutons la requête de mise à jour Donc, dans ces conditions, nous écrivons un message d'
attente, un point de mise à jour, plusieurs. Dans un premier temps, nous avons besoin du
même objet de condition. Copiez donc cet objet depuis la méthode find
et collez-le ici. Bien. Maintenant, au
deuxième argument, nous devons passer object, wet dollar set, Object,
status à scene. Laissez-moi vérifier si nous transmettons cette
valeur dans notre schéma ou non. Oh, voilà, on passe la lecture. Donc, adaptez-le à la scène, car c'est
plus convivial. Sauvegardez ceci et revenez à notre événement. Encore une fois, la question est la même. Que voulons-nous faire après avoir
mis à jour les messages tels qu'ils apparaissent ? Bien sûr, nous informerons tous les expéditeurs dont les messages
sont mis à jour vers SN. Ici, nous n'avons besoin que de l'identifiant de l'expéditeur car notre identifiant de jet est fixe, ce que nous obtenons par le front end ce fait, c'est beaucoup plus facile qu'un
événement organisé. Le coût des identifiants d'expéditeur
est donc égal pour me dire quelle méthode nous utilisons pour extraire le nouveau tableau
du tableau existant C'est vrai, nous utilisons des
messages invisibles sur la carte. Ici, nous obtenons la fonction de flèche à
message unique et nous renvoyons simplement
le message à point expéditeur. Cet expéditeur est un identifiant d'objet, nous devons
donc
le convertir en chaîne. Maintenant, comme nous le savons, cette méthode
cartographique collecte tous les identifiants de discussion à partir
des messages invisibles Nous pouvons
donc obtenir des identifiants d'
expéditeur dupliqués dans ce tableau Nous pouvons résoudre ce problème en utilisant set. Nous encadrons cette méthode cartographique entre parenthèses et
ici, un nouvel ensemble allons créer un ensemble, et maintenant pour
convertir cet ensemble en tableau, Nous allons créer un ensemble, et maintenant pour
convertir cet ensemble en tableau, il suffit de l'enrouler entre
crochets et de l'
étaler ici. Cette méthode cartographique
nous donnera un tableau avec des identifiants d'expéditeur
dupliqués. C'est pourquoi nous le
convertissons en set. J'ai réglé, nous n'arrivons pas
à dupliquer les valeurs, et après cela, nous les
convertissons à nouveau en tableau simple. Nous avons maintenant des identifiants d'expéditeur, nous pouvons
donc simplement le faire
pour loop const sender, qui est l'identifiant d'
expéditeur individuel des identifiants d'expéditeur Assurez-vous ici que vous utilisez not in, car nous utilisons in pour
obtenir les clés des objets, et nous utilisons pour oublier la
valeur d'un tableau. Auparavant, nos identifiants de
discussion de groupe étaient des objets. C'est pourquoi nous l'utilisons. Mais ici, les
identifiants des expéditeurs sont des tableaux. C'est pourquoi nous utilisons cette option. J'ai déjà fait cette erreur et c'est vraiment
frustrant car je ne reçois pas l'erreur et code ne fonctionne
toujours pas comme je
le souhaite. Assurez-vous donc de vous en souvenir. Dans cette boucle, nous faisons
encore une fois que le coût des sockets est égal à ce que
les utilisateurs en ligne n'obtiennent pas Sender. Ici, nous faisons la même chose qu'avant. Si des sockets sont disponibles, alors les sockets point fe. Ici, nous avons un identifiant de socket unique, fonction
flèche, et à l'intérieur, nous y faisons Iot two, socket ID, point m, scène de message. En tant que données, nous envoyons
l'ID de chat à l'ID de chat, et nous envoyons également l'
ID utilisateur qui envoie ces messages. Vu par deux
identifiants d'utilisateur, et c'est tout. Vous pouvez voir à quel point c'est simple. Il s'agit de notre première situation. Mettons maintenant en œuvre
la deuxième situation. Dans ce cas, notre utilisateur est déjà
disponible dans cette pièce. Nous devons mettre à jour le statut lorsqu' autre utilisateur envoie
un nouveau message dans cette même pièce. Ainsi, au lieu d'écrire une logique dans message d'
envoi, nous pouvons même émettre les
mêmes messages marqués que ceux vus depuis le front end lorsque l'utilisateur reçoit le nouveau message
dans la pièce jointe. Notre implémentation finale
liée à la scène de statut
est donc terminée ici. Maintenant, goûtons simplement à
cette implémentation. Donc, au début, lorsque nous
rejoignons une salle,
émettons ici cet événement, émettons ici cet événement, marquons les messages comme vus et
transmettons ici la valeur de l'identifiant de chat. Nous devons également émettre le même événement lorsque nous
recevons le nouveau message. Dans l'événement de message GET, nous ajoutons si l'identifiant du point de
soulignement du point expéditeur
des données de condition n'est pas égal
à l'identifiant du point de soulignement du point utilisateur Il s'agit du nom d'utilisateur de
notre utilisateur connecté. Si c'est vrai, alors
nous faisons socket point, Marquez les messages comme vus. Au deuxième argument, nous passons à une valeur de point d. Regardez les modifications et jetez-y un coup d'œil. Actualisons cette fenêtre et
passons ici le jeton de Harley. Et rejoignez également le jet. Et du bas,
nous envoyons le message. Ceci sert à indiquer le
statut de la scène de dégustation et à l'envoyer. Maintenant, si dans notre base de données, nous vérifions notre dernier message, voyons son statut à envoyer. Et maintenant, si nous ouvrons une nouvelle fenêtre et que nous nous connectons avec mon
premier jeton de compte. Encore une fois, si nous vérifions l'état de
notre message, voyons qu'il est mis à jour pour être livré. Maintenant, je copie cet identifiant de chat, et depuis un autre utilisateur,
je rejoins cette salle. Maintenant, vérifions à nouveau notre
base de données et actualisons les données. Vous voyez ici que nous recevons un message sur la
scène et que cet utilisateur recevra des données avec le chat mis à jour et qui a vu
ce message est. C'est ainsi que nous mettons à jour le
statut tel qu'il est vu à l'aide du socket.
201. Ajouter des champs de groupe dans Schema: Ajoutons maintenant quelques
fonctionnalités dans notre application. Actuellement, dans notre chat, nous
n'utilisons que le chat individuel. Maintenant, ajoutons
également le chat de groupe et nous n'avons pas besoin
d'y faire grand-chose. Tout d'abord, nous allons ajouter des champs relatifs aux groupes
dans notre schéma de discussion. Ici, dans les participants, nous pouvons ajouter plusieurs utilisateurs
qui font partie de ce groupe. Après cela, nous avons également besoin du dernier
message, puis nous transmettons ce groupe
et nous le configurons pour qu'il soit saisi sur Bullion et
par défaut sur false Ici, nous pouvons ajouter des
commandes pour les groupes. Ainsi, lorsque nous implémentons des fonctionnalités de
groupe, nous pouvons nous souvenir
des champs que nous devons gérer. Maintenant, après cela, le
groupe a un administrateur, donc des administrateurs, qui peuvent être
un ou plusieurs Nous copions simplement le
tableau des participants avec l'
ID de l'objet et la référence à l'utilisateur. Ajoutez-le ici. Ensuite, de quoi avons-nous besoin ? Oui, nous avons besoin d'un nom de groupe, qui est du type à la chaîne, et l'utilisateur peut également ajouter une icône de
groupe ou une image de groupe, qui est également du type à la chaîne. Je pense que c'est suffisant
pour les discussions de groupe. De plus, ici, assurez-vous de ne pas ajouter required
à true pour les remplissages de groupe, car
si le chat est un à un, alors required to true pour les remplissages de
groupe peut
nous donner une erreur de schéma. Voyons maintenant ce que nous devons
faire dans le schéma du message. Ici, pour le groupe, nous n'avons pas
besoin d'ajouter grand-chose. Nous avons juste besoin d'
un statut pour tous les membres du groupe. Dans un message de groupe, le
statut ne sera pas suffisant. Ici, nous ajoutons simplement le statut de livraison
archivé, qui est un tableau, et à l'intérieur, nous stockerons des objets correspondant au statut de
chaque participant. Donc, d'abord, utilisateur dans le type d'
objet mongs point schéma
point types point ID de l'objet Référence à l'utilisateur. Il s'agit de l'identifiant utilisateur de chaque
participant. De plus, pour cet utilisateur,
nous ajoutons un statut, alors copiez ce même objet d' ici et collez-le dedans. Maintenant, après cela, nous avons également besoin heure à laquelle notre message
est livré, livré selon le type à ce jour, et nous avons également besoin de voir et
de taper à la date et terminé, nous n'avons pas besoin de plus de champs. Si à l'avenir nous en avons besoin, nous pouvons certainement les
ajouter ici.
202. Créer une nouvelle API de groupe: Créons maintenant une API pour
créer un nouveau groupe. Ici, nous n'avons pas besoin d'
utiliser le socket pour cela. Dans le parcours de discussion, nous pouvons
simplement copier cette API de création de
chat et la
coller en bas. Bien. Modifiez maintenant le
point de terminaison pour créer un groupe. Et dans cette fonction, nous
devons apporter de petits changements. Tout d'abord, sur le lieu de réception, nous obtenons un tableau de participants, qui sont les
identifiants utilisateur des participants. Nous avons également le nom de son groupe. Pour l'image de groupe, nous pouvons ajouter
séparément une autre API. Et ici, nous devons
déstructurer le corps de la requête. Ensuite, nous changeons également
la condition. Si les participants ne
sont pas disponibles, nous renvoyons un message d'erreur,
les participants sont obligatoires. Maintenant, nous n'avons pas
besoin de trouver de chat car les mêmes participants
peuvent avoir plusieurs groupes. Nous supprimons simplement cette
variable de chat et
utilisons cette condition if. Et ici, nous ajoutons un chat constant. À l'intérieur de l'objet, nous ajoutons
des participants aux participants. Mais ici, nous devons également ajouter l'ID utilisateur
actuel dans le tableau
des participants. Ici, nous ajoutons un tableau
et adhérons à l'ID utilisateur. Ensuite, du nom du groupe au nom du groupe. A correspond à group to true, et nous transmettons les administrateurs au tableau,
et à l'intérieur de celui-ci, nous
passons l'ID utilisateur actuel Si, à l'avenir, nous devons ajouter d' autres participants ou si nous
voulons supprimer des participants, ou si nous voulons ajouter de nouveaux administrateurs
ou mettre à jour le nom du groupe, mettez à jour l'image du groupe Pour tout cela, nous pouvons
créer des API distinctes. Pour l'instant, nous n'en avons pas
besoin car notre objectif principal est d'apprendre les fonctionnalités du chat en temps
réel. Nous allons donc tester cette API. Pour cela, nous ouvrons Postman. Nous avons besoin d'un autre utilisateur pour les
ajouter au groupe. Ouvrez donc une nouvelle API utilisateur. Ici, nous passons un autre nom d'utilisateur. John Underscore 24, e-mail
à John at red gml.com,
et mot de passe, je garde
le même un Tu sais pourquoi, parce que
j'ai oublié les mots de passe. Bon nouvel utilisateur créé. Dupliquons maintenant la demande de
création de chat et renommons-la pour créer un nouveau groupe, en pointant sur l' API HATS
slash De plus, dans l'en-tête, nous avons déjà un jeton et
dans le corps de l'objet, nous avons d'
abord eu les participants à classer
ici, nous ajoutons tous les utilisateurs. À partir de la base de données, nous
copions simplement l'identifiant de deux autres personnes. Assurez-vous de ne pas copier l'identifiant de l'objet de votre compte
actuel, jeton que vous
transmettez dans l'en-tête. Bien. Maintenant, après les participants, nous passons le nom du groupe, et comment devons-nous le
nommer ? Disons Ninjas Nœuds. C'est le nom de l'école, non ?
Oui, et envoyez la demande. Vous voyez, ici j'ai une erreur
interne du serveur. Laissez-moi vérifier ce qui ne va pas. Dans un terminal, nous recevons une
erreur chez les participants. Oh, ici je passe directement
un tableau à l'intérieur d'un tableau. Nous diffusons donc le tableau des
participants, enregistrons les modifications et
renvoyons la demande. Vous voyez, nous créons ici
un nouveau jet de groupe.
203. Ajouter une logique de chat de groupe dans les événements Socket: Appliquons la
logique du chat de groupe à nos événements socket. Tout d'abord, nous allons commencer par l'événement
d'envoi de message. Imaginons qu'un utilisateur envoie un
nouveau message dans un groupe. Maintenant, dans les deux cas,
si l'utilisateur envoie
un message individuel ou message
de groupe depuis le front-end, il suffit de transmettre le contenu
du message
ainsi
que l'identifiant du chat. Ainsi, dans notre discussion de groupe,
nous vérifions également que le contenu
est transmis ou non. De plus, nous trouvons le jet par son identifiant. Ensuite, nous créons également un nouveau
message avec le même objet, mais dans le message de groupe, nous devons respecter le statut de
livraison, sélectionner le statut de livraison, et après cela, nous passons la condition
si jette group est vrai, puis nous devons créer un tableau d'objets qui ressemble à ceci. Pour cela, nous utilisons que le statut
de livraison est égal à la carte des participants à jet point. Ici, nous obtenons la fonction de
flèche utilisateur, et à l'intérieur de celle-ci, nous renvoyons
simplement Object. Maintenant, dans l'objet, utilisateur à utilisateur et statut ici,
nous passons la condition. Les utilisateurs en ligne utilisent les deux. Si cela est vrai, nous
ajoutons que le statut a été livré. Tel qu'il a été envoyé. De plus, nous ajoutons
la livraison à deux ici, nous avons également besoin de la même condition, afin que nous puissions ajouter une variable
avant ce retour. Le coût en ligne est égal à ce que les utilisateurs
en ligne pointent par utilisateur. Maintenant, à la place
de cette condition, nous passons en ligne et dans
le numéro de livraison également, si l'utilisateur est vrai, alors nous passons la nouvelle date,
sinon, nous passons la valeur nulle. Maintenant, voici une chose.
Chez ces participants, nous obtenons également l'identifiant
de l'expéditeur et nous ne voulons pas ajouter l'
identifiant de l'expéditeur dans le statut de livraison. Nous avons ici les destinataires, qui sont la
version filtrée des participants. Ainsi, à la place des participants au
jet point, nous ajoutons la carte à points des destinataires. De cette manière, nous n'avons pas besoin de mettre à jour statut de manière explicite en bas de page. Ensuite, nous mettons également à jour
le dernier statut du chat. Maintenant, nous remplissons les données
Sendar et émettons un événement get message
pour l'ID de chat Maintenant, nous renseignons également les données, mais ici, nous
devons également renseigner statut de
livraison par utilisateur,
car dans le cas d'un à un, nous n'utilisons que notre statut global, mais dans le chat de groupe, nous devons
afficher l'heure de chaque utilisateur Nous ajoutons ici une autre méthode
de remplissage. Dans un premier temps,
le statut de livraison indique un utilisateur, et
que souhaitez-vous renseigner Écrivez l'
ID de soulignement et le nom d'utilisateur. Voyons maintenant ce que
nous devons faire dans Marquer les messages comme événements
livrés. Comme nous le savons, il
n'est pas difficile de définir l'état de
livraison du message de groupe de l'utilisateur
connecté. Ainsi, au lieu d'utiliser
le même événement, il est préférable de créer un
événement distinct pour les messages de groupe. Ces messages marquent donc, car l'événement délivré est
réservé à une discussion individuelle. De plus, à cet égard, nous devons
apporter de petits changements. Comme nous le savons, ces identifiants de
chat sont tous
les identifiants de chat dans lesquels
notre utilisateur est disponible, mais cela
inclura également les discussions de groupe. Donc, ici, dans la méthode de recherche par chat, nous passons une autre condition. Groupez-le sur false,
ce qui signifie qu'il ne
renverra qu'un
jet par avion, et c'est tout. Nous n'avons pas besoin de changer quoi que ce
soit d'autre. Créons maintenant un nouvel événement. Donc, point sur
événement, disons, Marquez les messages de groupe
comme livrés, et nous passons ici une
SyncLWCFunction. appellerons cet événement lorsque notre utilisateur se connectera au front-end, même manière que nous émettrons
des messages marqués comme des événements livrés. Maintenant, tout d'abord, nous avons besoin tous les identifiants de jet de groupe dans
lesquels notre utilisateur est disponible. Jet IDs est équivalent à
wait chat dot find. En comparaison avec Object, nous transmettons
les participants à un identifiant utilisateur. Est-ce que le groupe est trop vrai. Et ici, nous ne voulons que des pièces d'identité. Donc, quelle méthode nous
allons utiliser, c'est vrai, nous utilisons le point distinct et
passons ici l'identifiant du trait de soulignement Ensuite, nous devons trouver messages
non livrés
dans les identifiants de ce groupe dont le statut est envoyé Comme précédemment, const
undelivered messages équivaut à wait
message point find Objet, nous transmettons l'identifiant de
chat à l'objet, le
dollar aux identifiants de chat. De même, de l'expéditeur à l'objet, dollar N pour rien est
égal à l'ID utilisateur, qui est l'ID utilisateur connecté Maintenant, nous devons également
trouver les messages qui ne sont pas remis à l'utilisateur
actuellement connecté. Nous passons donc ici le statut de livraison. Pour objecter, et comme nous le savons, statut de
livraison est un tableau d' objets avec l'utilisateur et son statut. Nous devons vérifier l'utilisateur car notre identifiant et notre statut
sont définis pour envoyer. Pour cela, nous devons
spécifier les conditions qui doivent correspondre au sein des
éléments individuels d'un tableau. Dans notre cas, il s'agit de
l'utilisateur et du statut. Ne vous y trompez pas, regardez ceci. Nous pouvons utiliser ici un autre
Mongoiboperator, dollar Aleem,
match to object, et ici
nous passons d'utilisateur à ID utilisateur, et le statut de l'utilisateur doit être envoyé Ainsi, grâce à cette image, nous pouvons spécifier la condition même
dans le tableau d'objets. De plus, nous n'avons pas besoin de
messages ou d'informations Nous ajoutons simplement un point de sélection
et nous transmettons ici l'identifiant de soulignement, l'identifiant
jet, l'expéditeur et les données de
livraison.
Génial. Maintenant, après cela, si la condition est que les messages
non livrés soient d'une
longueur supérieure à zéro Ce n'est qu'alors que nous voulons
exécuter la requête de mise à jour. Dans ce journal IP, nous utilisons un message constant à quatre boucles contenant des messages
non livrés Et à l'intérieur de ces quatre boucles, il suffit
de pondérer le point du
message pour en mettre un à jour. Tout d'abord, nous passons l'objet de
comparaison, l' soulignement à l'ID de soulignement du
point du message,
et dans les codes, le point d'
état de livraison, le point de soulignement d'utilisateur à l'identifiant d'utilisateur Au deuxième argument, nous passons un objet dont le dollar est
défini à l'objet en premier dans les codes, statut de
livraison
point dollar point statut, deux livrés. Ici, ce
statut en dollars nous aidera à
mettre à jour uniquement les champs
dont le nom d'utilisateur est le nom d'utilisateur. Maintenant, nous voulons également ajouter la
livraison à l'heure, dans les codes, statut de
livraison en dollars,
point de livraison à, et nous passons ici une nouvelle date. Et c'est fait. Cette
boucle for mettra à jour l'état de livraison de tous
ces messages non livrés Maintenant, que voulons-nous faire
après avoir mis à jour les messages ? Bien, nous voulons envoyer les identifiants
des avions dont le
statut est mis à jour. Ainsi, à partir de notre précédente méthode de marquage
des messages comme événements délivrés, nous pouvons simplement copier toute
cette logique après
cette méthode de mise à jour. Et collez-le après
la boucle d'automne et assurez-vous qu'il
figure également dans le blog I. Tout d'abord, dans ce blog, nous créons des objets
pour les expéditeurs et en tant que valeur, nous récupérons l'ensemble des
identifiants de discussion qui sont La raison pour laquelle nous utilisons cet ensemble
est qu'il supprimera tous les identifiants de chat dupliqués et nous
donnera des identifiants de chat uniques. Ensuite, nous le
convertissons en tableau, et enfin, nous exécutons cette boucle d'automne pour son
expéditeur à partir des identifiants de jet de groupe. Et dans cette boucle, nous
trouvons les identifiants de socket de ces expéditeurs et
émettons simplement le
statut des messages d'événement mis à jour, et nous transmettons ces identifiants de jet
à l'expéditeur associé Il n'est donc pas nécessaire de changer
quoi que ce soit dans cette logique. Vous pouvez voir à quel point c'est simple. Nous devons juste clarifier
ce que nous voulons faire. Passons maintenant au dernier événement, qui consiste à marquer les messages comme visibles. Ici aussi, nous créons un événement distinct pour marquer les messages de
groupe tels qu'ils sont vus. Point central sur Marquer les messages de
groupe tels qu'ils sont visibles. Et ici, nous passons la fonction de
rappel ASN, et dans le paramètre
de cette fonction, nous avons besoin du Jet ID de ce groupe Maintenant, nous copions la requête relative
aux messages non livrés depuis l'événement de distribution
par le groupe et nous la collons ici Maintenant, nous transformons non livrés en messages
invisibles, en identifiant de
chat, en identifiant de chat,
expéditeur en objet, dollar
NI pour un identifiant expéditeur en objet, dollar
NI pour différent de l'
identifiant utilisateur, du statut de livraison, de l'
image, du nom d'utilisateur à utilisateur, et le statut est un objet, un
dollar, pas égal à Maintenant, nous pouvons passer la condition I si longueur des points des messages
invisibles
est supérieure à zéro, alors nous voulons
exécuter une requête de mise à jour Encore une fois, nous copions ces
quatre boucles à partir de l'événement de groupe livré et les
collons dans notre événement vu. Maintenant, nous transformons ces messages non livrés en messages
invisibles, et dans le dollar de mise à jour défini
au lieu de livraison,
nous commercialisons le SN et également au lieu de livraison,
nous mettons à jour
le SN à Assurez-vous de ne pas avoir d'erreur dans l'un de
ces crochets cli. Fais attention à ça.
Maintenant, que voulez-vous faire fois que nous
aurons mis à jour
les messages tels qu'ils apparaissent ? Nous copions simplement la logique
de l'événement de scène simple. Et collez-le après
notre requête de mise à jour. En gros, nous faisons face la peur de l'expéditeur de
ces messages, et en utilisant for loop, nous émettons simplement
un message en cas d'événement avec identifiant de
chat et vu
par, et c'est Nous allons maintenant tester cette
implémentation. Ici, nous ouvrons le
fichier SDML final dans le navigateur, passons le jeton à l'utilisateur Bien. Nous devons maintenant
rejoindre le chat de groupe. À partir du Mongo Di, nous
parcourons la collection de discussions, nous suffit de copier notre identifiant de discussion de groupe et de le coller dans l'
identifiant de chat, puis de rejoindre la salle Maintenant, envoyons le
message à ce groupe. Bonjour, c'est un
chat de groupe et envoyez-le. Bien. Si nous vérifions notre base de données,
actualisons la collection,
et en bas, C, nous recevons un message, et
dans l'état de livraison, nous obtenons un tableau vide. Laissez-moi voir ce qui ne va pas. Passez à notre événement d'envoi de message. Dans le nouveau message, nous avons oublié d'ajouter le statut
de livraison. Donc, du statut
de livraison au statut de livraison, enregistrez les modifications, et repartons à la phase de
mise en œuvre. Actualisez le navigateur,
transmettez le jeton utilisateur. Copiez l'identifiant de chat depuis la collection de chats collez-le dans l'
identifiant de chat et rejoignez la salle. Maintenant,
envoyons à nouveau le message. Bonjour, c'est une discussion de groupe
et envoyez ce message. Maintenant, si nous
vérifions
à nouveau notre base de données, actualisons la collection en bas, nous recevons un nouveau message et,
dans l'état de livraison, nous obtenons le statut de
chaque participant. Génial. Maintenant, ajoutons
une autre fenêtre, ouvrons à nouveau SDMLFle ici, j'ajoute un jeton
de compte différent Et dès que j'appuie sur Entrée, dans notre première fenêtre,
nous recevons une notification selon laquelle votre message d'
envoi est livré, ce qui signifie que notre événement de groupe marqué comme événement livré fonctionne. J'actualise la base de données, vois dans l'état de
livraison des messages, que le statut de l'utilisateur est délivré, et nous arrivons ici
livrés à temps. Bien. Maintenant, permettez-moi de
participer à la même discussion. Alors, optez pour ce jet ID. Collez-le ici
et rejoignez la salle. Vous voyez, dans la première fenêtre, nous recevons une notification indiquant que votre
message est vu par cet utilisateur. Si nous vérifions à nouveau la base de données, actualisons la collection
et, en bas, voyons s'il s'agit de cet utilisateur, nous mettons à jour notre statut tel qu' vu et nous obtenons également
la scène à un moment donné. Cela signifie que notre marquage des messages de
groupe comme événement de scène
fonctionne également correctement. C'est tellement simple
et cela ne prête pas à confusion car nous séparons la logique
des différents événements de groupe. C'est ainsi que nous implémentons le chat de
groupe dans le socket.
204. Section 16 - Options de déploiement: Bienvenue dans la dernière section du cours de coiffure Ultimate
Node. Dans cette section, nous verrons le processus de
déploiement des applications de
nœuds. Donc, actuellement, notre application fonctionne sur notre machine locale. Maintenant, pour utiliser notre application dans le monde entier, nous devons la déployer. C'est quelque chose de très simple.
Ne t'inquiète pas pour ça. Il existe donc deux manières de
déployer des applications de nœuds. Nous pouvons utiliser pass, qui signifie
plate-forme en tant que service, ou nous pouvons utiliser Docker Nous pouvons maintenant nous demander ce que
sont pass et Docker. Donc, passer ou plateforme
en tant que service signifie que nous pouvons utiliser une plate-forme qui nous
aide à déployer
notre application. PAS, nous avons Render, Eoco, Google Cloud Platform, AWS, Microsoft, Azure, etc. Ces plateformes offrent
une variété de fonctionnalités, nous n'avons
donc pas à nous
soucier trop du processus de déploiement. C'est comme si vous
vouliez ouvrir un stand de nourriture. Désormais, au lieu de
vous soucier de l'achat d' un poêle, de l'installation de l'électricité et du raccordement à l'eau, vous louez simplement une cuisine entièrement
équipée. Ici, il vous suffit d'
apporter vos ingrédients, faire cuire vos aliments
et de commencer à vendre. C'est exactement ce que
fait PAS pour les développeurs. Avec PaS, nous n'avons pas à soucier de la configuration des serveurs, des bases de données, du réseau
ou du ski. Ces plateformes
s'occupent de tout cela pour nous. Nous écrivons simplement notre code Note JS, déployons et il
s'exécute. C'est aussi simple que ça. autre côté, si vous
souhaitez contrôler votre déploiement ou si vous souhaitez déployer votre application de nœud
sur votre propre serveur Web, Docker est une excellente option Avec Docker, nous pouvons
créer une image de notre application et la déployer sur n'importe quel ordinateur dans le monde Comme vous le devinez, l'utilisation de Docker
est un processus un peu complexe. Pour l'instant, nous n'avons pas
à nous inquiéter à ce sujet. Donc, si vous ne
voulez pas
vous soucier serveurs, des équilibreurs de charge, de
l'infrastructure ou du redémarrage de votre
application en cas de panne, la des
serveurs, des équilibreurs de charge, de
l'infrastructure
ou du redémarrage de votre
application en cas de panne, la plateforme en tant que
service est une bonne option Donc, dans cette section, nous
utiliserons le rendu pour déployer notre application de nœud,
car c'est le moyen le plus simple de
déployer une application de nœud, et il fournit également
d'excellentes fonctionnalités. Différentes personnes aiment
différentes plateformes, mais je pense que le rendu
est un excellent moyen de déploiement et qu'il
offre également un avantage. Nous pouvons donc déployer
notre application
gratuitement et sans
aucun détail de carte.
205. Simplifier le code: Avant de déployer
notre application, rendons notre
fichier index point js plus propre et plus lisible. Cela fera bonne
impression sur notre équipe et nous aimons tous
travailler sur un code propre. Faisons en sorte que cela se produise. Ici, nous créons un
fichier séparé pour des choses distinctes, comme pour la
connexion à la base de données, un fichier séparé. Pour les routes, nous
avons un autre fichier, et pour le socket, nous avons également
un fichier séparé comme celui-ci. C'est vraiment simple.
Faisons-le un par un. Tout d'abord, nous séparons la connexion
à la base de données. Dans notre projet, nous créons un nouveau dossier
appelé startups. À l'intérieur de celui-ci, nous créons un
nouveau fichier appelé DIBTjs. Maintenant, dans ce fichier, nous voulons
ajouter du code pour la connexion à la
base de données. Ici, à partir du fichier JS à points d'
index, coupez la méthode Mongoose
point Connect Et collez-le dans nos cinq nouveaux. Maintenant, nous avons besoin de
deux choses. Tout d'abord, nous avons besoin de
mangues. Succès à une mangouste équivaut à De plus, nous avons besoin de cet enregistreur, sconct logger est
égal à require,
nous ouvrons un dossier, passons à la configuration, ici Maintenant, une question que vous pourriez vous poser, comment pouvons-nous ajouter ce code
dans notre fichier JS à points d'index ? C'est vraiment simple. Ne vous y
trompez pas. Laisse-moi te montrer. Ici, en bas, nous modulons simplement
les exportations de points égales à. Ici, nous ajoutons une fonction
dans cette fonction, nous déplaçons simplement cette méthode Mongoose
point Connect Retour au fichier JS à points d'index. Dites-moi comment pouvons-nous saisir quelque chose à partir du fichier
db point js ? Nous utilisons les démarrages à barres
obliques obligatoires DV. Cette expression renvoie
tout ce que nous exportons depuis ce fichier de base de données et ce que
nous exportons fonctionne. Nous pouvons le stocker dans
une variable appelée const DB, puis nous pouvons
appeler cette fonction Au lieu de le
faire en deux lignes, nous pouvons simplement le faire
en une seule ligne. Après le stockage de cette
fonction dans une base de données variable, nous pouvons simplement l'appeler ici Lorsque nous appelons cette fonction, le code de
connexion s'exécute,
et c'est ce que nous voulons. Voilà, notre première étape est terminée. Séparons maintenant la mise en œuvre de toutes ces
routes. Dans le dossier de démarrage,
nous créons un nouveau fichier appelé routes point js. De plus, comme avant, nous exportons le module point exports est égal à la fonction
dans cette fonction, nous ajoutons toutes nos routes. donc toutes ces routes d'applications
avec le middleware d'application course express point Json et
également le middleware d'erreur global Puis collez-les
dans notre fichier de routes. Maintenant, nous avons besoin de
deux choses. Tout d'abord, nous avons besoin cette application et comment
pouvons-nous l'obtenir ? Devons-nous créer une nouvelle application dans
ce fichier, puis l'utiliser ? Non, nous ne pouvons pas le faire car
cela créera une nouvelle application
Express. Mais ici, nous voulons utiliser
notre même application. Quelle est la solution ici ? La solution est vraiment simple. Ici, à partir du
fichier index js, après cette base de données, nous avions required period, slash startup, slash routes,
ce qui est notre fonction Nous appelons cette fonction et passons
simplement app comme argument. Dans notre fonction itinéraires, nous obtenons simplement l'application en tant que paramètre. Ensuite, que voulons-nous ? Nous avons besoin d' cours et comment pouvons-nous obtenir un oui ? Nous pouvons utiliser la même méthode. Mais comme nous le savons, le cours
est notre package, et nous pouvons utiliser le package dans
n'importe quel fichier en le saisissant simplement. Avec l'application, nous ne pouvons pas le faire, c' est
seulement pourquoi
nous avons l'application en tant que paramètre. Donc, en haut, Cost course est
égal à require Cos. Nous avons également besoin d'Express, que
nous pouvons également importer ici. Cost Express est équivalent
à require express. Maintenant, après cela, nous avons également besoin de
logger, sconct, logger,
c'est égal à require, nous avons un fuler up, une configuration Maintenant, nous avons besoin de ces routes, SeconstUser routes,
est égal à require Ici, nous déplaçons également un
dossier vers le haut pour acheminer les utilisateurs. Maintenant, dupliquez cette ligne deux
fois de plus en utilisant Alter plus sift, plus flèche vers le bas ou
point d'option Tamiser plus flèche vers le bas. Ici, nous changeons d'abord
le nom de la variable pour publier les routes et le fichier pour publier. Ensuite, nous changeons la
variable en itinéraires de discussion et le fichier en chats et c'est tout.
Nous en avons terminé avec la deuxième étape. Séparons maintenant
notre logique de socket. À partir de cette variable d'utilisateurs en ligne, nous sélectionnons notre code jusqu'à ce que
nous obtenions le point LISN du serveur Coupez le dossier de démarrage, nous créons un nouveau fichier
appelé socket point js. Dans ce fichier, nous ajoutons que le module dot exports est
égal à function. Dans cette fonction,
nous ajoutons notre code. Maintenant, tout d'abord,
nous avons besoin de cette méthode AO. Dites-moi, devrions-nous
créer un nouvel objet Ao ? Nous devons utiliser le
même objet
Ao que nous avons créé à l'aide du serveur. Dans le fichier index point js, nous avions besoin d'un socket de
démarrage par période. Et ici nous appelons cette fonction et
passons simplement ici Ao Object. Dans le fichier socket point js, nous obtenons
ici un
paramètre pour l'objet Io. C'est aussi simple que ça. Maintenant, dans cette logique, nous
devons importer beaucoup de choses, alors n'essayez pas de vous presser. Allons-y ligne par ligne. voyez, dans ce
nous, nous avons besoin de ce JWT En haut de la configuration, JWT est égal à requérir un jeton Web JSON.
Ensuite, ce dont nous avons besoin. Oui, nous avons besoin de ce modèle de chat, et nous avons également besoin de
ce modèle de message. Donc, en haut, le
chat des coûts est égal à exiger ici un
dossier b modèles de chats. De plus, si vous êtes confus
lors de l'importation d'un fichier, laissez-moi vous montrer mon trig
lorsque j'importe un fichier Ici, nous voulons
importer le modèle de message. Le message de coût est égal à
require. Tout d'abord, je réduis tous les dossiers à
l'aide de ce bouton, puis j'ouvre simplement le
dossier dans lequel je travaille. Est au démarrage et
ouvre également le dossier à partir duquel
je souhaite importer. Ce sont des modèles. Actuellement,
nous sommes dans le dossier Stu. Nous devons sortir
de ce dossier Nous ajoutons
donc un point, un point,
une barre oblique Ensuite, nous voulons aller
dans le dossier Modèles, et nous importons à partir du modèle de
messages. Tu vois, c'est aussi simple que cela. Voyons maintenant ce que nous devons importer d'
autre. Je pense que c'est tout ce dont nous avons besoin. Si nous manquons quelque chose,
nous obtenons une erreur. Ne t'inquiète pas pour
ça. Voyons maintenant à quoi ressemble notre indice Dsi Vous voyez, c'est clair maintenant, mais soyons plus clairs. Ici, nous avons beaucoup d'
entrées inutilisées. Nous pouvons les supprimer. abord, nous supprimons la ligne de saisie
du code Appuyez
donc sur Ctrl plus X ou Commande+X pour
supprimer toute cette ligne. Nous supprimons donc Mongos et supprimons toutes les importations effectuées
qui ne sont pas toutes utilisées Vous voyez, notre code
semble désormais plus propre, facile à adapter, et
nous adorons tous
travailler avec ce type d'applications
propres. Voici à quoi
devrait ressembler le code des
développeurs professionnels .
206. Préparer l'application Node pour la production: Avant de commencer le processus de
déploiement, il est préférable de préparer
notre application de nœud
pour la production. Pour cela, nous avons besoin certains packages, comme le
premier est un casque. Nous l'utilisons déjà dans
notre projet précédent. Fondamentalement, le casque est utilisé pour la sécurité de notre application. C'est une excellente
option pour améliorer la sécurité de notre application
avec une configuration minimale. En outre, il protège notre application contre les
vulnérabilités Web courantes en définissant automatiquement les en-têtes
STDP
appropriés Dans notre terminal, installez
un casque NPM et si vous souhaitez
utiliser la même personne que moi, vous pouvez l'utiliser au
taux 8.1 0.0 et appuyer sur Enter Maintenant, un autre package
est la compression. C'est également un
package très utile pour les applications de nœuds. Comme nous le savons, nous devons parfois
envoyer des données volumineuses
à de nombreux utilisateurs. Par exemple, liste de publications
ou liste de messages. Ce package
compressera données volumineuses et réduira la
charge d'envoi de données volumineuses. NPM installe donc Compresson sur
le d 1.8 0.0 et appuie sur Entrée. Bien. Implémentons maintenant ces packages dans
notre application. Ne vous inquiétez pas, il ne s'agit que de
deux lignes de noyau. Ici, dans le dossier de démarrage, nous créons un nouveau fichier
appelé prod point js Dans ce fichier, nous importons
ces deux packages. Donc const, helmet est égal à
require helmet et const, compression est égale
à require Comme précédemment, nous exportons
la fonction de ce module. Le module dot exports
est donc égal à la fonction « here we
export ». Ici, nous obtenons l'application en tant que paramètre, et à l'intérieur de celle-ci, nous voulons
implémenter cette méthode intermédiaire. Casque App Dot U, c'est
ce que nous appelons la fonction. Par ce biais, seul le casque est
appliqué dans notre application. Nous ajoutons également la compression app.us, et nous l'appelons également « and done Par ces deux lignes de code, nous appliquons ces packages
dans notre application. Vous pouvez également ajouter ce
code dans le fichier route point js. Il n'y a rien de
mal à cela. ne nous reste plus qu'à importer ce module dans notre fichier d'
index principal point js. Ici, avant ces routes, nous avons simplement besoin de la période DatabSpd qui
renverra cette fonction Nous devons donc appeler
cette fonction et simplement passer votre
application en argument. Assurez-vous qu'il est ajouté
avant l'importation de cet itinéraire. Notre casque et notre système de compression
s'appliquent donc à tous les itinéraires,
et c'est tout. En utilisant ces deux lignes, nous pouvons améliorer un peu notre
application.
207. Aperçu du processus de déploiement: Voyons un aperçu du processus
de déploiement afin de ne pas
nous y perdre. Actuellement, notre code est
disponible sur notre machine locale, ou nous pouvons dire sur notre ordinateur. Maintenant, pour faire
vivre notre application sur Internet, nous utilisons une plateforme de rendu. Tout d'abord, nous
téléchargerons notre code sur Github, puis nous connecterons notre dépôt Github
à notre service, qui est render. Ne
t'inquiète pas pour ça. C'est vraiment simple.
Je vais vous expliquer toutes les étapes de manière simple
et facile. Nous verrons également comment mettre à jour notre code après le
déploiement de notre application. Commençons par télécharger l'application du
nœud sur Github.
208. Télécharger l'application Node sur Github: Voyons comment nous pouvons télécharger
notre projet sur Github. Si vous ne connaissez pas
Github, bref, il s'agit d'un site Web qui permet aux
développeurs de stocker, partager et de collaborer sur
du code avec d'autres développeurs Github permet également aux développeurs de créer un référentiel ou nous pouvons appeler des dépôts où ils peuvent stocker leur code et suivre les
modifications au fil du temps C'est le
moyen le plus simple et le plus efficace pour les équipes de travailler ensemble sur un même projet sans remplacer
le code des autres Il existe donc de nombreuses façons de
télécharger notre code sur Github, mais nous verrons la plus simple
et la plus simple, qui consiste à utiliser l'application de
bureau Github Accédez au navigateur, recherchez l' application
Github Dektop
et ouvrez ce Cliquez maintenant sur le bouton
Télécharger. Cela va prendre un certain temps. Une fois
ce téléchargement terminé, ouvrez le programme d'installation et notre processus
d'installation démarre. Bien. Maintenant, si vous ouvrez cette
application pour la première fois, vous
devez vous connecter
avec votre compte Github Donc, pour vous montrer cela, je supprime mon compte Github de l'application de bureau
Gitub Maintenant, pour vous connecter,
allez dans le fichier et ouvrez Options, puis cliquez sur ce
signe dans forgitub.com Continuez avec le navigateur. Cela nous redirigera sur le site Web de
GitUboOfficial, remplira votre nom d'utilisateur et le mot
de passe de votre compte Gitub
et Je dois vérifier mon
compte et c'est fait. Et maintenant, cliquez sur cette application de bureau Open
Github. Il
nous redirigera automatiquement sur notre application. Ne vous inquiétez pas, vous n'avez besoin de le
configurer que pour la première fois. Maintenant, vérifions-nous si nous sommes
connectés ou non. Encore une fois, allez dans
Fichier et Options, et dans les comptes, nous pouvons
voir que nous avons nos comptes. Accédez à l'option Git,
et à partir de là, nous pouvons définir notre nom et notre
e-mail pour notre Github Ainsi, lorsque nous publions
du code sur Github, autres membres de l'équipe
verront ce nom et cette adresse e-mail Assurez-vous également de sélectionner
votre adresse e-mail officielle
ici et de cliquer sur Enregistrer. Maintenant, avant d'aller de
l'avant, comme nous le savons, dans notre projet, nous avons un dossier de modules de
nœuds. Nous ne voulons pas publier ceci sur
Github car à tout moment, nous pouvons générer le dossier du module
node l'aide de la commande d'installation NPM C'est donc inutile, nous téléchargeons le dossier
entier des modules du nœud, qui contient beaucoup de fichiers. Nous devons donc ignorer le téléchargement
de ce dossier sur Github Pour cela, dans notre
projet à la racine, nous créons un nouveau fichier
appelé point git ignore. Assurez-vous de ne
pas faire de faute de frappe dans le nom de ce fichier. Ça devrait être Dot Gitignore. Maintenant, dans ce fichier, nous
pouvons ajouter les fichiers et dossiers que nous voulons
ignorer ou, en termes simples, les fichiers et dossiers nous ne voulons pas
télécharger sur Github Supposons que nous voulions ignorer
ce dossier de modules de nœud Nous écrivons
donc node
underscore modules, qui est le
nom du dossier, et une barre oblique, qui indique qu'il s'agit De même, nous voulons
ignorer le dossier des journaux. Alors, qu'est-ce que nous écrivons ? oblique vers l'avant des journaux d'écriture.
Maintenant, voici une chose. Lorsque nous téléchargerons notre code
sur Github, comme nous le savons, ce code deviendra public et tout le monde pourra
voir notre projet Supposons maintenant que nous téléchargions
notre projet et ce DonVFle soit également
téléchargé sur Github Ainsi, toutes nos informations
secrètes deviendront publiques et
n'importe qui pourra les utiliser à mauvais escient. Nous devons donc également ajouter ce fichier
point NV et gitignore. Permettez-moi de vous montrer un court résumé pour
obtenir le fichier Gate Ignore. Accédez simplement à votre navigateur et
recherchez Get Ignore, Github. Ouvrez ce premier lien, et nous obtenons ici tous les modèles pour différents types
d'applications. Faites ignorer Android Git. De plus, vous avez C plus, C et bien d'autres fichiers. Maintenant, recherchez en haut, node gitignore et
ouvrez Vous voyez, nous obtenons ici le contenu
du fichier GetI Nur. Copiez simplement ce code et ajoutez-le dans
notre fichier GetI Nur Enregistrez les modifications et nous
avons notre fichier GetI Nur. Cool. Maintenant,
téléchargeons enfin notre code sur Github Pour ajouter notre code
au référentiel, allez dans Fichier et sélectionnez
Ajouter un référentiel local. Et ici, nous sélectionnons le chemin
de notre application inkifi. Maintenant, il est dit que nous devons
créer un nouveau dépôt, alors cliquez sur ce lien. Et ici, nous devons transmettre le nom de
notre dépôt. Nous pouvons également écrire
ici une description. Il s'agit de l'application de réseau
social et cliquez sur Créer un référentiel. Maintenant, vérifions-nous si nous
avions le bon chemin ou non. Cliquez donc sur Afficher dans explorateur et vous verrez que nous
obtenons notre dossier Linky Five, alors fermez-le et cliquez simplement
sur Dépôt publié Ici, nous pouvons modifier le nom et la description du
référentiel, et nous pouvons également sélectionner
la confidentialité du code. Vous pouvez également le rendre privé, mais je voudrais
vous donner ce code. C'est pourquoi je le rends public
et je clique sur Publier. Cela prendra du temps et c'est fait. Voyons cela sur Github, alors cliquez sur Afficher sur Github et voyez ici que nous
obtenons notre application Charmant. Vous pouvez voir à quel point il est
simple de télécharger
du code sur Github Dans la leçon suivante, nous allons configurer notre compte de rendu.
209. Déployer l'application Node sur Render: Déployons notre
application principale sur Render. Rendez-vous donc sur render.com, et tout d'abord, nous allons
enregistrer notre compte ici Nous pouvons utiliser Google ou Github pour enregistrement ou simplement
utiliser l'e-mail et le mot de passe,
et nous avons obtenu ce tableau de bord.
Ne t'inquiète pas pour ça. Cliquez simplement sur le bouton Nouveau, et nous sélectionnons ici le service Web. Maintenant, nous devons connecter
notre compte Github. Glicon connecte donc Github et connectez-vous avec votre
compte Github Assurez-vous d'utiliser le même compte Github sur
lequel nous publions
notre code principal. À partir de cette page, nous pouvons sélectionner dépôt que nous voulons
ajouter à notre compte de rendu. Vous pouvez également ajouter tous les référentiels, mais dans ma suggestion, sélectionnez uniquement l'option de dépôt sélectionnée. À partir de là, nous pouvons
sélectionner le référentiel afin de sélectionner notre application
inkifi Maintenant, cela
nous redirigera vers la page d'accueil du tableau de bord. Vous voyez, maintenant nous avons ici
notre dépôt. Il suffit de cliquer sur
ce dépôt, et nous obtenons ici notre formulaire. Maintenant, tout d'abord, nous
ajoutons ici le nom de notre application, qui est notre Linkifi Nous allons obtenir ce nom comme URL de
base de notre application. Ensuite, nous avons un environnement
défini sur node.
Ne changez rien à cela. Ensuite, nous pouvons sélectionner la branche principale ou principale de notre dépôt
Github Nous pouvons également sélectionner la région. Maintenant, pour le répertoire racine, nous ajoutons un point, et
pour la commande de construction, nous écrivons NPM install Pour la commande start, nous
ajoutons simplement node index point js. En gros, par cette commande, render exécutera notre application. En bas, nous sélectionnons notre type de service que
nous sélectionnons gratuitement. Cliquez maintenant sur cette
liste déroulante avancée, sélectionnez Ajouter un fichier secret et donnez-lui un nom point et V. Revenons maintenant
à notre projet de wagon, dans lequel nous ouvrons DotyNVFLE dans lequel nous avons
nos Copiez simplement tout le code
et sur le site Web de Render, cliquez sur Contenu et
collez notre code ici. Il suffit maintenant de cliquer sur
Créer un service Web et de voir que notre
processus de déploiement est lancé. Cela prendra entre
cinq et dix minutes. C, construction réussie. Maintenant, il est en
cours de déploiement et après cela, je reçois une erreur dans une bonne
connexion B. Laissez-moi vérifier cela. Il s'agit d'une erreur liée
à la variable de base de données. Je pense que j'ai fait une erreur
en ajoutant un fichier secret. Nous passons donc à l'onglet
environnement, et ici, laissez-moi vérifier le contenu du
fichier. C'est bon. Oh, ici je saisis un
mauvais nom de fichier. Ça devrait être DotNV. Je crée intentionnellement
cette erreur parce que je veux vous montrer comment
vérifier l'environnement d'un bus. Donc les modifications, et
retour à Logstb. Ici, le processus de déploiement
recommencera. Et voici que nous avons à nouveau une
erreur lors de la connexion à la base de données. Pourquoi ? Donc, actuellement, notre
base de données est une base de données locale, ce qui signifie qu'elle fonctionne
sur notre machine locale. Désormais, lorsque nous déployons une application de
nœud, nous ne pouvons pas accéder à la base de données locale. À ce moment-là, nous devons
ajouter la base de données Cloud, et nous le ferons
dans la prochaine leçon.
210. Ajouter MongoDB Cloud Cloud: Actuellement, dans notre back-end, nous avons une base de données Mongo
Debe locale, nous devons
donc créer notre base nous devons
donc créer notre données
Mongo Dibe
dans Ainsi, tous les utilisateurs
utiliseront la même base de données. Rendez-vous donc sur mongotib.com et inscrivez-vous simplement
avec L'installation ne prendra qu'une
minute. Je suis déjà inscrit, alors j'essaie de me
connecter avec mon compte. Dieu merci, c'est ouvert. Maintenant, dans le coin supérieur gauche, nous avons le nouveau bouton Projet. Cliquez dessus et nous
écrivons ici le nom de notre projet, qui est notre Linky Fi,
puis nous cliquons sur suivant À partir de là, nous pouvons ajouter des membres de
l'équipe à notre projet. Cliquez simplement sur Créer un projet. Cliquez maintenant sur le bouton Créer. Ici, nous sélectionnons le plan, il suffit de passer à la version gratuite et de
cliquer sur Créer un déploiement. Et voyez ici que nous obtenons notre
nom d'utilisateur et notre mot de passe
pour notre base de données. Je copie donc le premier nom d'utilisateur et
dans note paid, je le colle ici. Après cela, copiez également ce mot de passe aléatoire
et collez-le également. Il s'agit de l'étape la plus importante. Nous pouvons enregistrer ce nom d'utilisateur et mot de passe comme sauvegarde
de notre base de données. Cliquez maintenant sur Créer une base de données. Ensuite, nous cliquons sur, choisissons une méthode de connexion. Sélectionnez ici Compass. Vous voyez, ici, nous obtenons l'URL de
connexion Mangaib pour le cloud. Ne vous inquiétez pas, il suffit de
copier ce lien de base et dans notre fichier ENV à la place de cette encre Mangaibi
locale, nous collons notre De plus, j'ai oublié d'ajouter un nom de base de données à
la fin de cette URL. Assurez-vous donc de l'
ajouter comme ceci. OK ? Continuons maintenant. Nous devons donner accès
à un réseau capable de lire et d'écrire
des données dans notre base de données. De n'importe où, l'utilisateur peut accéder à notre base de données et y
recevoir du courrier. Sur le côté gauche,
accédez à Network Xs. Voici notre adresse
actuelle. Cliquez sur Modifier, puis sur Autoriser l'
accès depuis n'importe où. Vous avez défini notre adresse sur 0.0.0.0, ce qui correspond à l'atout de
chacun, puis cliquez sur Confirmer Cela prendra peu de temps
et vous verrez qu'il est actif. Bien. De plus, si vous souhaitez vérifier les
paramètres liés à l'accès à la base de données, comme la modification du mot de
passe ou autre, vous pouvez le faire
à partir de cette étape. Maintenant, vérifions-nous qu'il
est connecté ou non. Ouvrez donc le terminal
et écrivez node, indexez le point js et appuyez sur Entrée. Cela prendra un certain
temps et nous
parviendrons à nous connecter
avec succès, donc cela fonctionne. Nous devons maintenant mettre à jour
notre code déployé. Comment pouvons-nous le faire ? Il suffit simplement de transférer notre code sur Github et le rendu détectera automatiquement
ces modifications C'est pourquoi nous
n'ajoutons aucun projet à Github Maintenant, voici une chose.
Nous savons que nous ignorons ce fichier Dotty et V
lors du téléchargement sur Github Pour mettre à jour les valeurs des
variables d'environnement, nous devons accéder
au site Web de rendu. Nous sélectionnons ici les variables d'
environnement. Cliquez sur Modifier et
simplement à partir d'ici, nous pouvons modifier nos valeurs. Je remplace l'URL de la base de données par Cloud. Ici aussi, vous devez ajouter le nom de
votre base de données à
la fin de cette URL. Maintenant, cliquez sur, enregistrez, reconstruisez et déployez. Bien. Si nous consultons nos journaux, après un certain temps, nous
retrouverons le journal de déploiement. Et voyez ici, Mongo to
B est connecté avec succès. Charmant. Maintenant, voyons si notre application fonctionne
réellement ou non. Nous copions donc ici l'URL Cspace
de notre application déployée. Maintenant, ouvrez postman, et dans celui-ci, nous dupliquons cette API de création d'utilisateur car nous
créons simplement la
nouvelle base de données, donc nous n'y avons pas nos données
précédentes À présent, changeons l'URL de l'hôte
local par l'URL notre application
déployée et envoyons la demande. voyez, ici, nous obtenons le jeton JWT, ce qui signifie que notre API
fonctionne. Vérifions-le. Sur le site Web de Mongo Deb, accédez à notre application Linkify nous obtenons Browse Colection et voyez,
ici nous obtenons toutes nos collections, et si nous vérifions la collection des utilisateurs Vous voyez, nous avons ici le nouvel utilisateur. Charmant. Mais attendez, pendant que j'arrive au nom de la base de données des
goûts. Je pense que j'ai oublié d'ajouter le nom
de la base de données dans
l'URL de la collection. Accédez aux
variables d'environnement, cliquez sur Modifier. Et oui, après cette URL, j'ajoute des SLA et
ici j'ajoute le nom de la base de données Supposons que notre Linky corrige et que vous cliquiez
simplement sur Enregistrer,
reconstruire et déployer Il reconstruira notre application, et à la fin, nous nous connecterons
à notre base de données. Permettez-moi de goûter à nouveau à l'API, envoyer la nouvelle demande d'utilisateur, et voilà que je reçois un nouveau jeton. Bien. Accédez maintenant au site Web de Mongoib
et actualisez la base de données. Tu vois, j'ai ici notre base de données
Inkifi. Génial. Maintenant, laissez-moi également vous montrer comment mettre à jour notre
code et le redéployer Alors, dans notre projet,
qu'est-ce que nous pouvons changer ? Voici ce message de console, le serveur fonctionne sur le portar PT C'est juste pour la démonstration, enregistrer les modifications et pour
mettre à jour le code lors du rendu. Nous devons simplement envoyer
notre code sur Github, le
rendre, récupérer automatiquement nos mises à jour et le redéployer Revenons donc à notre application de
bureau Github, et nous passons ici le message de validation Supposons que vous mettiez à jour le message de
la console et que vous cliquiez sur
Valider un fichier dans le fichier principal, et qu'à la fin,
il vous suffit d'envoyer le message d'origine. Maintenant, sur notre site Web de rendu, nous allons à la section de déploiement, et après une à deux minutes, nous pouvons voir qu'il est en cours de
déploiement et à la fin,
nous constatons que le serveur fonctionne
sur le port Notre port,
ce qui signifie que notre code a été
mis à jour avec succès. Vous pouvez voir que le processus de déploiement
est vraiment simple et facile. Il vous suffit de
télécharger votre code dans le référentiel
Github,
puis en utilisant render, nous déploierons rapidement notre
application Et si nous voulons
mettre à jour notre application, il suffit de publier les modifications
sur
le Github et dans les
deux à 3 minutes, notre serveur redémarrera
et nous recevrons nos mises à jour
211. Qu'est-ce que l'architecture MVC ? [BONUS]: Maintenant, si vous
travaillez en tant que développeur, vous avez
certainement entendu parler l'architecture
MVC
dans les grands projets Voyons donc ce qu'est l'
architecture MVC et pourquoi nous en avons besoin. MVC est donc l'abréviation de
Model View Controller. Il s'agit essentiellement d'une façon d'organiser le cœur de notre
application. À l'avenir, il sera donc
beaucoup plus facile de gérer, maintenir et de faire évoluer
l'application. En termes simples, il s'agit d'une structure de dossiers qui sépare les différentes parties
de notre application. Dans l'architecture MVC, nous créons
trois dossiers distincts. Un pour le modèle, le second pour la vue et le troisième pour le contrôleur. Ne vous y trompez pas.
C'est vraiment simple. Le dossier modèle est donc l'
endroit où se trouvent nos données. Ici, nous devons
définir comment les données doivent être structurées et comment
interagir avec votre base de données. Par exemple, dans l'application
Node, nous avons déjà créé un dossier de
modèles, dans lequel nous stockons
tous les modèles et schémas de chaque collection
Mongo be C'est pourquoi nous appelons
ce dossier Ensuite, nous avons le dossier de visualisation. Afficher signifie ce que voit l'utilisateur. Il s'agit de la partie interface utilisateur
de notre application. Par exemple, dans l'application
Node, nous pouvons avoir des
moteurs de modèles tels que EJS ou PUG ou des fichiers
SDML ou CSS que nous voulons afficher Donc, si nous avons du code lié au
front-end, nous pouvons stocker ce
code dans le dossier de visualisation. Maintenant, nous avons enfin le dossier
du contrôleur. Dans le dossier Controller, nous allons enregistrer la logique de
notre application. Par exemple, si nous
ouvrons la route de notre utilisateur, nous pouvons voir
ici qu'il s'agit de la fonction de rappel
ASN, qui s'exécute lorsque quelqu'un envoie demande de
publication sur ce C'est la partie logique.
Dans le dossier du contrôleur, nous stockerons les
fonctions ASN séparément, puis nous les importerons
simplement ici dans les itinéraires Ne vous inquiétez pas,
il suffit de couper et coller
ces fonctions. Nous verrons cela
dans une minute. Nous comprenons ici le modèle
MVC pour les données, vue pour les éléments liés à l'interface utilisateur et le contrôleur pour la logique de l'
application Mais vous vous demandez peut-être quel est l'intérêt de cette architecture
MVC ? Pourquoi les grandes entreprises l'apprécient ? Comme nous le savons, dans les grandes entreprises
, de grandes équipes
travaillent sur une seule application. Si nous créons un dossier distinct
pour chaque partie, comme le modèle, la
vue et le contrôleur, cela créera une séparation
des préoccupations. Ici, par séparation, notre
code peut être plus facile à gérer. Supposons qu'une équipe travaille sur
les fonctionnalités liées à la publication, deuxième équipe sur les fonctionnalités liées au
paiement et qu'une autre équipe travaille sur
les fonctionnalités liées aux utilisateurs. Chaque équipe n'a pas eu besoin de toucher au fichier modèle de
publication, au fichier
modèle de paiement ou au fichier modèle utilisateur. Ils travailleront sur leurs fonctionnalités
distinctes, et c'est pourquoi, lorsqu'ils publieront
du code sur Github, cela ne provoquera pas
de gros conflits En outre, un autre avantage du MVC
est qu'il est facile à entretenir. Nous voulons mettre à jour le modèle, alors nous n'avons pas besoin de
mettre à jour les fichiers de vue. Un autre avantage est qu'il est
beaucoup plus facile à adapter. que notre application grandit, à mesure que notre application grandit,
il est plus facile d'ajouter nouvelles fonctionnalités car tout est déjà bien organisé C'est pourquoi
les grandes entreprises et les
indépendants d'aujourd'hui utilisent également
cette architecture MVC Voici maintenant la structure de
dossiers pour l'architecture MVC dans Node JS Le premier est le dossier
principal de notre projet. Ensuite, nous ajoutons le fichier
index point JS, qui est notre fichier principal. De plus, nous ajoutons d'autres
fichiers ou dossiers tels que le fichier
package point sn, le
fichier point ENV ou le dossier middleware, vous restez ici dans
le Après cela, nous ajoutons un
dossier de modèles dans tous les modèles que nous stockons. Ensuite, un dossier pour tous
les fichiers liés à l'interface utilisateur, puis le dossier Controllers
pour toute la partie logique, et dans Node JS, nous
avons un dossier de routes. Nous allons donc ajouter toutes les
routes dans ce dossier. Maintenant, cette structure de dossiers convient aux projets de petite ou
moyenne taille, mais les grandes entreprises
comme Paypal et Netflix utilisent une structure de dossiers peu
différente. C'est certainement à vous et votre entreprise de choisir
la structure de dossiers à sélectionner. Je vais vous montrer les deux options. Cette autre option est
un peu différente et convient aux applications Big
Bend. Nous sommes ici le dossier principal du projet. En cela, nous avions le fichier
index point JS, qui est le principal
point d'entrée de notre application. Nous utilisons également les fichiers ENV, les fichiers Docker JCNFle
Package point et les fichiers UploadedFles, ainsi que les dossiers que nous stockons ici Après cela, nous ajoutons ici
un autre dossier appelé source ou SRC où nous pouvons
stocker notre dossier middleware, notre dossier transport et notre dossier Utils,
etc. De plus, dans le dossier SRC, nous stockons le dossier des modules
pour chaque module, et dans ce dossier, nous pouvons ajouter des dossiers pour chaque
fonctionnalité, comme le dossier utilisateur, le dossier de
publication, etc. Dans chaque dossier, nous pouvons définir trois fichiers, user point model point gs
user point routes point js et user point controller point js. Nous pouvons donc ajouter un autre fichier
user dot service dot js. Ce fichier n'est pas obligatoire, mais certaines entreprises
aiment l'utiliser. Dans ce fichier de service, nous pouvons stocker une requête de base de données. Il n'est pas obligatoire d'ajouter ce fichier user point
service point js, mais certaines entreprises
souhaitent l'ajouter. Donc, comme ça, nous pouvons également ajouter quatre
fichiers pour le dossier de publication. Lorsque nous voulons ajouter
une nouvelle fonctionnalité telle que le produit, nous créons le dossier produit
ici dans le dossier des modules, puis nous pouvons ajouter quatre
fichiers dans le dossier du produit. Comme nous pouvons le constater, c'
est très complexe, mais c'est vraiment bon pour les applications
volumineuses et complexes. Tu peux utiliser ce que
tu veux. Cela dépend entièrement de vous. La structure des dossiers peut être légèrement
différente d'une entreprise à l'autre. Ne t'inquiète pas pour ça.
Dans la leçon suivante, nous allons appliquer l'architecture MVC
dans notre application, puis déployer
ces modifications
212. Appliquez l'architecture MVC [BONUS]: Appliquons maintenant l'architecture
MVC dans notre projet Linky Fi Donc, actuellement, dans notre application, nous avons une structure très
organisée, comme nous avons déjà un dossier de modèles et
un dossier de routes. Ici, nous n'avons pas besoin voir le dossier car il n'
y a pas de code de moteur de modèle. Nous devons donc faire un petit effort pour le gérer. Alors faisons-le. Tout d'abord, nous
créons ici un dossier appelé SRC. N S comme ce dossier de configuration, maintenez la touche Ctrl ou Commande enfoncée, sélectionnez-le dans les dossiers Stu Assurez-vous de ne pas déplacer le dossier de
ces modules Node. Bien. Voyons maintenant ce que nous devons modifier dans
le fichier d'index JS. La plupart du temps, nous devons modifier
les parties du fichier d'entrée. Vous voyez, nous avons ici
ces chemins de démarrage. Nous devons le mettre à jour. Ici, nous créons plusieurs curseurs en maintenant la touche Alter ou Option enfoncée. Et ajoutez ici SRC, pour m'assurer que nous
obtenons ce fichier ou non, laissez-moi vérifier en supprimant
ce nom de fichier Vous voyez ici que nous recevons des suggestions de
fichiers, ce qui signifie que c'est correct. Maintenant, nous n'avons plus besoin de changer quoi que ce soit dans l'
index en fichier JS. Maintenant, dans le dossier SRC, nous avons déjà les dossiers models
et Routes Mais comme nous le savons, nous postulons ici. Structure d'
application Complex Node. Ici, nous créons un nouveau
dossier appelé modules. Dans ce dossier de modules, nous devons principalement créer quatre dossiers car
nous avons ici quatre modèles. Créons d'abord un
dossier appelé Jet, puis un autre dossier
appelé message. Puis un autre dossier pour le post
et le dernier dossier pour l'utilisateur. Maintenant, n'oubliez pas que dans chaque dossier, nous devons créer trois
fichiers. Alors faisons-le. abord, nous avons déplacé le fichier JS de
l'utilisateur du dossier des modèles et nous l'avons
fait dans le dossier utilisateur. Ici, nous renommons son nom de fichier
en user point model point js. Ici, il peut demander des entrées
de mise à jour. Assurez-vous de cliquer sur « Oui ». Et si vous n'
obtenez pas ce menu, vous devez le faire manuellement. Déplaçons maintenant le fichier de route
point js des utilisateurs
du dossier routes et faisons-le
dans le dossier du module utilisateur. Maintenant, il demande une mise à jour. Indiquez ici pour mettre à jour le nom de fichier de la route
point js de l'utilisateur. Renommons maintenant ce fichier
en user point routes dot js. Vous voyez, maintenant il ne
demande pas de mise à jour. Ne vous inquiétez pas, nous le
mettrons à jour manuellement. Maintenant, dans le dossier du module utilisateur, nous créons un autre fichier appelé user point controller point js. Vous pouvez maintenant vous demander ce que nous
allons ajouter dans le contrôleur. Le contrôleur est l'endroit où nous
stockons la logique de
notre application. Il s'agit d'un ensemble de fonctions de
rappel de nos
API. Laisse-moi te montrer ça. Ici, dans le parcours de l'utilisateur, nous avons d'abord l'API d'enregistrement, et il s'agit de sa fonction de
rappel Il s'agit du contrôleur
pour cette route. Coupez cette fonction de rappel à partir d' ici et dans le fichier du contrôleur, nous devons exporter cette fonction L'utilisateur de Cast register
est donc égal et supérieur à cette fonction de
rappel ici Maintenant, pour exporter cette fonction, nous ajoutons que le module exports est égal à object
car à partir de là, nous voulons exporter
plusieurs fonctions. Ici, nous pouvons ajouter un
utilisateur enregistré à un utilisateur enregistré, ou nous pouvons le supprimer. Enregistrez ce fichier, et maintenant nous
devons ajouter cette fonction
dans l'itinéraire de l'utilisateur. Donc, en haut, nous ajoutons le coût que le contrôleur
utilisateur est égal à requérir ici, nous
importons depuis point forward
slash user point Controller Maintenant, à la place de l'
API CallwayFunction, nous ajoutons simplement un contrôleur utilisateur,
point register Assurez-vous de ne pas appeler
cette fonction ici, nous devons ajouter une référence de
fonction. Maintenant, faisons de même
pour les autres API. Coupez donc ce contrôleur d'
API de connexion. Dans notre fichier, nous définissons
une nouvelle fonction, coût de connexion à l'utilisateur est égal
à coller le rappel ici Ensuite, nous avons obtenu cette fonction de
rappel de l'API. Et dans notre fichier de contrôleur, nous créons une nouvelle fonction. Cost, get user équivaut
à le coller ici. même, nous devons couper chaque fonction de rappel et la séparer dans le fichier du
contrôleur Je sais que c'est un
peu inquiétant, alors mettez de la musique et nous
pourrons terminer cela ensemble. Coupez la fonction de rappel, et dans le fichier, Cost, request, reset password revient
à le coller ici Coupez la fonction de rappel suivante, et dans le fichier,
Cast reset password revient à le coller ici Coupez la
fonction de rappel suivante pour suivre l'utilisateur, et dans le fichier, Cast, follow user revient
à la coller ici Maintenant, coupez la
fonction de rappel suivante, pour le rejet, la demande. Dans le fichier, Cast, reject, follow, request,
revient à le coller ici. J'ai maintenant la prochaine
ColBkFunction pour demande d'
acceptation, et dans le fichier, coût sauf, follow request
est égal au passé Coupez la fonction de rappel suivante, pour la liste des abonnés, et
dans le fichier, const, get other user, follow,
list, revient à la coller ici Ne vous inquiétez pas, il ne
nous en reste que quelques-uns. Coupez la
fonction de rappel suivante, pour la liste suivante. Et dans le fichier, const, get other user, la liste suivante
revient à la coller ici Coupez la fonction de rappel suivante. Et dans le fichier, on ajoute coût et on suit l'utilisateur, c'est
comme si on le collait ici. De plus, pour en revenir au fichier de route, nous avons besoin de cette fonction Cs générale pour l'API d'enregistrement et de connexion. Nous avons donc également coupé toute
cette fonction et avons
collée dans le fichier du
contrôleur. Ici, vous avez peut-être mis à jour fonction de
génération de jetons pour les jetons
excédentaires et les jetons de
référence à la fois. Voici mon ancien code car sont
des mises à jour après
la publication du cours, mais ne vous inquiétez pas, c'
est le même processus, coupez toute cette fonction et
dt dans le fichier du contrôleur. De plus, si vous avez un
itinéraire d'actualisation et un itinéraire de déconnexion, faites de même pour
ces API Ici, il suffit d'exporter ces fonctions puis de
les ajouter dans le fichier Routes. Ainsi, après avoir enregistré un utilisateur, nous ajoutons un utilisateur de connexion, demande d'utilisateur,
une réinitialisation passe, une
réinitialisation du mot de passe, un utilisateur , un
rejet, un suivi de la
demande, une
acceptation , un
suivi, une demande, un autre utilisateur, liste de
suivi et un
dernier utilisateur à ne plus suivre un utilisateur Enregistrez ce fichier, et
dans notre fichier de route,
nous ajoutons EUUser controller
dot login user Je ne déstructure pas
les fonctions ici, car si certains nouveaux
développeurs consultent notre code
, ils peuvent s'y perdre. Maintenant, contrôleur utilisateur
point god utilisateur, contrôleur
utilisateur, point
request mot de passe réinitialisation, contrôleur
utilisateur point réinitialise le mot de passe, contrôleur utilisateur point
followser contrôleur
utilisateur, point reject, follow, request, user Controller ,
point accept, follow request, follow
request, user Controller, point
accept, follow request Contrôleur utilisateur, point
get user, suivre la liste. Ensuite, contrôleur utilisateur,
point get other user, liste
suivante, et enfin, user Controller,
point unfollow user user Nous devons maintenant importer les éléments
nécessaires pour
ces contrôleurs. En haut, nous pouvons voir toutes les importations non utilisées
qui sont éliminées. Nous pouvons donc les
rassembler en déplaçant
la sauce vers le bas, en coupant simplement ces importations et en
les collant tout en haut
du fichier du contrôleur. Bien. Maintenant, nous devons
mettre à jour le chemin du modèle utilisateur Nous le changeons
donc en modèle point par point de
barre oblique, car
il se trouve dans le dossier actuel Nous pouvons également nous assurer que
ces chemins sont corrects. Oui, ça va.
Enregistrez ce fichier. Et si nous vérifions notre fichier de route, constatons qu'il semble très propre. De cette façon, nous pouvons voir
très clairement points de terminaison de
l'API avec les méthodes de l'API Maintenant, nous devons faire
de même pour les avions à réaction et les postes. Faisons-le
rapidement. Tout d'abord, nous déplaçons
le modèle jet dans le dossier jet Module et renommons le nom du fichier en
chat point model point js Déplaçons l'itinéraire du chat dans le
dossier des modules de chat, mettons à jour les entrées. Renommez maintenant le nom du fichier
chat point Rous dot js. Nous devons maintenant
créer un nouveau fichier pour chat point controller point js. Retour au fichier Routes. Tout d'abord, nous avons coupé ce
premier rappel d'API et dans le fichier du contrôleur, nous avons créé une nouvelle fonction Le coût d'obtention de chats est
égal à le coller ici. Après cela, nous avons coupé la
fonction de rappel suivante, et dans le fichier, Cast get chat messages revient
à les coller ici Ensuite, coupez la fonction de
rappel suivante, et dans le fichier, le coût création d'un chat est égal
à le coller ici Ensuite, nous n'avons pas besoin l'API d'envoi de message car nous l'avons
gérée avec Socket. Nous pouvons supprimer ce bon maintenant que nous avons la
fonction de rappel suivante et dans le fichier, groupe de création de
coûts est
égal à le coller ici Nous devons maintenant exporter
ces fonctions à partir d'ici. À la fin, les exportations du module
sont égales à Object, Gchat à GChat. Nous pouvons donc
supprimer les messages getchat,
créer un chat et créer un groupe Enregistrez-le et dans le
fichier de route ici, nous saisissons le coût, le contrôleur de
chat est
égal à ce qui est requis ici, contrôleur de point de chat
parlas Maintenant, dans nos API, nous allons ajouter ces fonctions. Donc, contrôleur de chat, points
GAD jets, contrôleur de chat, point de réception de messages, contrôleur de
chat, point de création de chat et dernier contrôleur de chat
point créer un groupe Maintenant, nous coupons ces importations
de modèles à partir d'ici, nous enregistrons ce fichier, et nous
le collons dans notre fichier de contrôleur tout en haut. Bien. Maintenant, ici, nous devons également mettre à
jour le chemin de ces deux modèles. Nous changeons donc le chemin du modèle de
chat en un modèle de point de
discussion avec barre oblique, et pour le message A, nous
ajouterons le modèle de message dans le dossier du module de
message Nous allons donc un dossier vers le haut, le modèle de message
slash message point. Enregistrez ce fichier et
nous devons déplacer le modèle de
message dans le dossier du module de
message. Changez maintenant le nom du fichier en
message point model point js. nous reste plus qu'à effectuer ce processus pour notre
dernier module de publication. Tout d'abord, nous déplaçons
le modèle de publication dans le dossier du module post et
renommons le nom du fichier en
post model point js Déplaçons maintenant post route
dans le dossier du module post, mettons à jour l'entrée, renommons
le nom du fichier, post point routes point js Bien. Nous devons maintenant créer un nouveau fichier pour les
contrôleurs post point dot js. Retour au fichier Routes. Tout d'abord, nous supprimons le
premier rappel de l'API et dans le fichier du contrôleur, nous créons une nouvelle fonction Cast Create Post
revient à le coller ici. Ensuite, nous avons coupé à côté de fonction de
rappel et
dans le fichier Cast, get my post revient
à le coller ici Ensuite, coupez la fonction de
rappel suivante. Et dans le fichier, Cs get following post est
égal à posté ici. Ensuite, nous avons supprimé une autre fonction de rappel de l'
API. Et dans le fichier, const, delete post est égal à, et collez-le ici Ne vous inquiétez pas, il ne vous reste que
quelques fonctions à emporter. Supprimez la fonction Colbeg suivante pour aimer ou ne pas aimer Et dans le fichier, const, comme, contrairement à post, est égal
à, collez-le ici Coupez la fonction Colbeg suivante. Et dans le fichier, on ajoute le coût, ajouter un commentaire revient
à le coller ici. Coupez la fonction de rappel suivante. Et encore une fois, dans le
fichier, on ajoute le coût, ajoute un commentaire, la
réponse revient à le coller ici. Et maintenant, pour la dernière fonction de rappel de l'
API, coupez-la et dans le fichier du
contrôleur, nous ajoutons le coût, nous supprimons le commentaire, c'est comme le coller ici Nous devons maintenant exporter
ces fonctions. Le module point exports est
égal à in object, create post to create
post, get my post. Une publication suivante, supprimer une publication, aimer la publication, ajouter un commentaire, ajouter une réponse à un commentaire
et supprimer une commande. Enregistrez ceci et dans le fichier de
routes de publication en haut,
nous ajoutons que le coût
du contrôleur de poste est égal
à celui du contrôleur
de point de publication Maintenant, dans notre API, nous pouvons ajouter ces contrôleurs, copy post Controller and
write, postcontroller, point create post, postcontroller, point GET MyPost, post
Controller, point GET following
Post, point Controller, point
GET following Post,
post Controller, point delete Contrôleur de poste, point, contrairement au
post, au contrôleur de poste, commande
point d'ajout, au contrôleur de
poste, point d'ajout de commentaire et au commentaire différé par
point du contrôleur de poste. Bien. Supprimons maintenant les
importations inutilisées du fichier Routes. Enregistrez ce fichier et dans le fichier du contrôleur
tout en haut,
nous le collons ici. Maintenant, nous devons mettre à jour
ces deux chemins, point, modèle de point de barre
oblique,
et pour le chemin utilisateur, et pour le chemin utilisateur, nous allons d'un dossier vers le haut, dossier utilisateur, modèle shuser point Enregistrez ceci, comme nous pouvons le voir, nos fichiers ont l'air plus organisés. Donc, ici, notre dossier de modèles et de
routes est vide maintenant, nous pouvons
donc simplement les supprimer, et je pense que nous devons mettre à jour le
chemin à un autre endroit,
à savoir routes point Jsle
dans le dossier de démarrage Voir ici le chemin n'a pas été
mis à jour automatiquement. Ici, nous changeons simplement
le chemin vers modules, user, slash user point Routes Les modules publient les itinéraires post-point
et les modules les
itinéraires JET Jett, et c'est fait Génial. Maintenant, envoyons rapidement ce
code sur Github Et ainsi, notre code peut être
automatiquement déployé. Ouvrez donc l'application de
bureau Github. Et c'est ici que nous obtenons tous les changements. Rédigez le message de validation. Et commets le. Enfin, nous avons simplement mis ce code
sur Github, et c'est Cela sera
automatiquement déployé. C'est ainsi que dans le monde
professionnel, les
grandes entreprises gèrent
leur code sans JS. De plus, l'approche
peut être
légèrement différente selon entreprises
ou les équipes avec
lesquelles vous travaillez, mais il s'agit de la structure de dossiers la plus
courante mais il s'agit de la structure de dossiers la plus
courante utilisée par
les développeurs professionnels de nos jours.