Le cours ultime sur Node JS 2026 : Express, MongoDB, REST API, Socket et plus encore | Code Bless You | Skillshare

Vitesse de lecture


1.0x


  • 0.5x
  • 0.75x
  • 1 x (normale)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Le cours ultime sur Node JS 2026 : Express, MongoDB, REST API, Socket et plus encore

teacher avatar Code Bless You, Make Coding Easy To Learn

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Leçons de ce cours

    • 1.

      Introduction du cours

      2:57

    • 2.

      Section 01 - Qu'est-ce que NodeJS

      5:51

    • 3.

      Histoire de NodeJS S

      2:40

    • 4.

      Comment fonctionne NodeJS fn

      5:48

    • 5.

      Installation de Node JS dans le système

      3:17

    • 6.

      Écrire du code de premier nœud code

      5:26

    • 7.

      Rendre le code VS cool [FACULTATIF] ]

      1:59

    • 8.

      Section 02 - Que sont les modules

      3:52

    • 9.

      Créer son propre module

      6:47

    • 10.

      Accéder à un module dans un autre module

      5:10

    • 11.

      Exercice pour votre propre module

      3:04

    • 12.

      Utiliser le module Path

      7:13

    • 13.

      Obtenir les détails du système d'exploitation

      3:08

    • 14.

      File System Module

      4:13

    • 15.

      Créer un serveur à l'aide du module HTTP

      5:18

    • 16.

      Comment gérer différentes routes

      3:41

    • 17.

      Section 03 - Introduction aux NPM

      2:27

    • 18.

      Creating Package

      4:20

    • 19.

      Installation de paquet dans le projet

      4:07

    • 20.

      Désinstallation des paquets

      1:03

    • 21.

      Le paquet d'installation en tant que dépendance du développeur

      1:46

    • 22.

      Les logiciels qui sont obsolètes et les mettent à jour

      5:56

    • 23.

      Supprimer les paquets inutilisés du projet.

      1:48

    • 24.

      Section 04 - API vs API REST

      7:41

    • 25.

      Liste de planification API pour le projet 01

      1:49

    • 26.

      Configurer une nouvelle application

      1:08

    • 27.

      Créer un serveur avec Express

      6:39

    • 28.

      Exercice pour créer un serveur Express

      2:36

    • 29.

      Créer une API pour obtenir tout un liste de tous

      3:34

    • 30.

      Configurer le redémarrage automatique de nodemon

      1:55

    • 31.

      Variables

      3:42

    • 32.

      Paramètres de route et paramètres de requête

      5:43

    • 33.

      Obtenir un tout unique par ID

      4:47

    • 34.

      API POST pour ajouter un nouveau todo

      11:06

    • 35.

      Valider les Données utilisateur

      3:20

    • 36.

      Passer un code de statut

      3:10

    • 37.

      res.send et res.json

      3:12

    • 38.

      Mettre à jour un tout simple avec la requête PUT

      5:29

    • 39.

      Exercice Supprimer un todo spécifique

      3:48

    • 40.

      Section 05 - Introduction au middleware

      4:09

    • 41.

      Créer un middleware personnalisé

      3:17

    • 42.

      Construit avec Middleware

      4:51

    • 43.

      Partager des fichiers statiques depuis un serveur

      4:28

    • 44.

      avec middleware tiers utile (

      4:58

    • 45.

      Comment coder en fonction de l'environnement

      4:02

    • 46.

      fichier env et package dotenv

      3:47

    • 47.

      Différents paramètres pour différents ENV

      3:43

    • 48.

      Moteurs de modèle dans l'application Node

      5:59

    • 49.

      Nettoyer la structure d'application du code

      5:34

    • 50.

      Section 06 - Asynchrone ou synchrone ous

      9:45

    • 51.

      Callbacks in JavaScript

      6:32

    • 52.

      Résoudre le problème avec le rappel

      7:31

    • 53.

      L'enfer des rappels

      3:39

    • 54.

      Promesse en JavaScript

      5:51

    • 55.

      Remplacer les rappels par des promesses

      7:51

    • 56.

      Async:await en JavaScript

      6:51

    • 57.

      Section 07 - Les bases de MongoDB

      1:16

    • 58.

      Introduction à la base de données

      4:34

    • 59.

      Installer MongoDB dans Windows

      4:19

    • 60.

      Connecter MongoDB avec l'application Node

      5:41

    • 61.

      Importance de Schema

      3:15

    • 62.

      Defining Schema for Document

      4:05

    • 63.

      Creating Models

      3:48

    • 64.

      Enregistrer de nouvelles données Data

      4:46

    • 65.

      Interroger les données

      7:48

    • 66.

      Opérateurs de comparaison dans MongoDB B

      6:17

    • 67.

      Opérateurs logiques dans MongoDB

      6:56

    • 68.

      Expression régulière dans MongoDB

      5:23

    • 69.

      Comprendre et estimer le nombre de documents

      2:46

    • 70.

      La pagination et la requête infinie

      6:37

    • 71.

      Mettre à jour les données

      9:20

    • 72.

      Opérateurs de mise à jour dans MongoDB

      1:42

    • 73.

      Supprimer les données

      3:01

    • 74.

      Exercice 01 - Configurer MongoDB

      7:16

    • 75.

      Exercice 02 - Pour stocker des données

      5:59

    • 76.

      Exercice 03 - Extraire les données

      5:52

    • 77.

      Exercice 04 - Mise à jour et suppression des tâches u

      8:21

    • 78.

      Section 08 - Créé dans des validateurs

      6:42

    • 79.

      Validateurs personnalisés

      4:28

    • 80.

      Validateurs async

      1:59

    • 81.

      Options utiles de SchemaTypes

      0:55

    • 82.

      Relation entre les modèles models

      5:05

    • 83.

      L'approche hybride des relations

      2:23

    • 84.

      Appliquer l’approche de la référence

      4:41

    • 85.

      Comment extraire les données de la référence [Populer]

      2:47

    • 86.

      Appliquer l'approche d'embossage

      4:25

    • 87.

      Appliquer une approche hybride

      3:11

    • 88.

      Index dans MongoDB D B

      10:54

    • 89.

      Comment fonctionnent les index dans MongoDB

      9:47

    • 90.

      Section 09 - Projet 02 et planification

      1:51

    • 91.

      Créer un nouveau serveur

      2:39

    • 92.

      Connexion à la base de données

      2:15

    • 93.

      Exercice - Création d'un modèle utilisateur

      4:10

    • 94.

      Créer le nouvel utilisateur

      12:26

    • 95.

      Utiliser le hachage du mot de passe pour la sécurité

      5:16

    • 96.

      Validation de l'entrée utilisateur à l'aide de Joi

      8:45

    • 97.

      Comment fonctionne l’authentification

      3:30

    • 98.

      Générer le jeton JWT pour l'utilisateur

      5:45

    • 99.

      Setting Expiry of Token

      2:19

    • 100.

      Sécuriser la clé de sécurité dans l'environnement

      2:13

    • 101.

      Exercice Créer un chemin de connexion

      8:11

    • 102.

      Comment authentifier un utilisateur ? Connecté ou non ?

      12:56

    • 103.

      OAuth en détails

      5:44

    • 104.

      OAuth dans l'application Node - Signin avec Google

      15:03

    • 105.

      OAuth avec JWT T

      16:36

    • 106.

      Connectez-vous avec Facebook en utilisant OAuth

      10:37

    • 107.

      Simplifier le code

      3:00

    • 108.

      Problème avec le jeton unique [MISE À JOUR]

      2:16

    • 109.

      Access Token et Refresh Token Logic [MISE À JOUR]

      7:17

    • 110.

      Implémenter le jeton d'accès et le jeton de rafraîchissement [MISE À JOUR]

      9:24

    • 111.

      Route de mise à jour pour le nouveau jeton d'accès [MISE À JOUR]

      10:37

    • 112.

      OAuth avec deux jetons [MISE À JOUR]

      2:21

    • 113.

      Route pour la déconnexion d'un utilisateur [MISE À JOUR]

      3:55

    • 114.

      Section 10 - Création du modèle de catégorie

      3:58

    • 115.

      Créer une nouvelle API de catégorie avec Image upload.

      11:27

    • 116.

      Définir le nom de fichier et filtre dans multer

      11:55

    • 117.

      Obtenir toutes les catégories API

      1:39

    • 118.

      Partager des images statiques à partir du serveur

      2:06

    • 119.

      Exercice - Définir le modèle de produits

      6:56

    • 120.

      Autorisation basée sur le rôle

      8:59

    • 121.

      Autorisation personnalisée basée sur le rôle

      5:40

    • 122.

      Gérer plusieurs images de produits

      3:30

    • 123.

      Créer de nouveaux produits Products

      7:16

    • 124.

      Obtenir toutes les données des produits

      11:37

    • 125.

      ou requête infinie

      5:58

    • 126.

      Envoyer des produits par catégorie

      3:17

    • 127.

      Envoyer produit par recherche

      2:25

    • 128.

      Exercice - Obtenir des données sur un produit unique

      5:50

    • 129.

      Exercice. - Supprimer le produit

      10:52

    • 130.

      Rechercher les produits par titre [FACULTATIF]

      4:05

    • 131.

      Section 11 - Pourquoi nous gérons les erreurs ?

      2:44

    • 132.

      Gérer les promesses rejetées

      3:25

    • 133.

      Créer un middleware des erreurs

      3:26

    • 134.

      Supprimez les blocs d'accroche

      1:44

    • 135.

      Erreurs de journal dans le fichier

      11:46

    • 136.

      Erreurs de journalisation dans mongoDB

      2:24

    • 137.

      Exceptions non prises

      7:16

    • 138.

      Promesses non traitées

      3:23

    • 139.

      Récapitulatif de la gestion des erreurs et de la journalisation

      1:50

    • 140.

      Section 12 - Créer un modèle de panier

      6:50

    • 141.

      Définir la liste API pour le panier

      1:22

    • 142.

      Ajout de produits au panier t

      20:38

    • 143.

      Obtenir un panier d'utilisateurs

      2:23

    • 144.

      Augmentez la quantité de produit

      9:22

    • 145.

      Diminuer la quantité de produit

      3:58

    • 146.

      Retirer un produit unique du panier

      5:34

    • 147.

      Créer un modèle de commandes

      4:27

    • 148.

      Flux de paiement

      3:53

    • 149.

      Mise en œuvre de la passerelle de paiement Razorpay

      49:43

    • 150.

      Paiement international avec Paypal

      49:15

    • 151.

      Obtenir l'historique des commandes

      2:21

    • 152.

      Mise à jour de l'état par l'administrateur

      5:17

    • 153.

      Nettoyer le code pour le fichier d'index

      3:27

    • 154.

      Section 13 - Introduction du projet 03

      1:05

    • 155.

      Configurer le projet 03

      5:14

    • 156.

      Créer un modèle d'utilisateur

      4:23

    • 157.

      Registering a New User

      10:35

    • 158.

      Exercice - API de connexion utilisateur

      0:28

    • 159.

      Solution - API de connexion utilisateur

      4:53

    • 160.

      Implémenter le jeton d'accès et le jeton de rafraîchissement [MISE À JOUR]

      5:16

    • 161.

      Route de rafraîchissement et de déconnexion [MISE À JOUR]

      9:00

    • 162.

      Détails de l’utilisateur actuellement enregistrés

      7:27

    • 163.

      Réinitialiser le mot de passe

      13:11

    • 164.

      aux moyens d'envoyer des e-mails dans Node JS

      2:17

    • 165.

      Configurer Amazon SES pour l'envoi d'e-mails

      21:09

    • 166.

      Envoyer des e-mails gratuitement

      10:13

    • 167.

      Logique de suivi et de suivi

      2:18

    • 168.

      Suivre l'utilisateur User

      9:08

    • 169.

      Accepter la demande de suivi

      7:45

    • 170.

      Exercice - Obtenir la liste des followers et suivre

      6:24

    • 171.

      Exercice - Ne plus suivre l'utilisateur

      3:34

    • 172.

      Section 14 - Introduction

      0:26

    • 173.

      Créer un modèle de publication

      3:43

    • 174.

      Créez un nouveau message

      15:43

    • 175.

      Obtenir les publications des utilisateurs actuels

      4:16

    • 176.

      Comment entrer en ligne de mise

      9:31

    • 177.

      Suppression de la publication

      6:51

    • 178.

      Comme et Contrairement au texte

      4:56

    • 179.

      Mettre en œuvre la fonctionnalité Commentaires

      6:15

    • 180.

      Ajouter une réponse aux commentaires

      5:21

    • 181.

      Exercice - Supprimer un commentaire spécifique

      4:37

    • 182.

      Gestion des erreurs

      3:06

    • 183.

      Section 15 Introduction

      1:10

    • 184.

      Création de chat - Modèle de message

      6:23

    • 185.

      Obtenir des chats pour les utilisateurs

      6:32

    • 186.

      Obtenir des messages de chat spécifiques

      3:44

    • 187.

      API pour l'envoi de messages

      10:02

    • 188.

      Que sont les Web Sockets ets

      5:16

    • 189.

      Connexion de la prise

      8:20

    • 190.

      Socket Emit et sur les méthodes

      8:07

    • 191.

      Recevoir des messages pour les deux utilisateurs

      2:02

    • 192.

      Logique de regroupement d'une salle de chat

      3:00

    • 193.

      Mettre en œuvre la réunion à un salon de chat a

      4:35

    • 194.

      Exercice - Indicateur de saisie

      8:48

    • 195.

      Application de vrais codes d'envoi

      5:33

    • 196.

      Authentifier un utilisateur dans Socket

      10:52

    • 197.

      Marquer les utilisateurs comme en ligne et hors ligne

      3:44

    • 198.

      Plusieurs prises pour un seul utilisateur

      5:50

    • 199.

      des messages de mise à jour

      17:15

    • 200.

      Mise à jour de l'état du message pour qu'il soit vu

      8:53

    • 201.

      Ajouter des champs de groupe dans Schema

      2:42

    • 202.

      Créer une nouvelle API de groupe

      3:41

    • 203.

      Ajouter une logique de chat de groupe dans les événements Socket

      14:22

    • 204.

      Section 16 - Options de déploiement

      2:32

    • 205.

      Simplifier le code

      8:18

    • 206.

      Préparer l'application Node pour la production

      2:58

    • 207.

      Aperçu du processus de déploiement Process

      0:39

    • 208.

      Télécharger l'application Node sur Github

      5:52

    • 209.

      Déployer l'application Node sur Render

      3:37

    • 210.

      Adding MongoDB Cloud

      6:51

    • 211.

      Qu'est-ce que l'architecture MVC ? [BONUS]

      7:00

    • 212.

      Appliquer l'architecture MVC [BONUS]

      20:56

  • --
  • Niveau débutant
  • Niveau intermédiaire
  • Niveau avancé
  • Tous niveaux

Généré par la communauté

Le niveau est déterminé par l'opinion majoritaire des apprenants qui ont évalué ce cours. La recommandation de l'enseignant est affichée jusqu'à ce qu'au moins 5 réponses d'apprenants soient collectées.

69

apprenants

--

À propos de ce cours

Bienvenue dans la masterclass 2025 ultime sur Node.js — un voyage complet en 20 heures dans le développement d'un backend moderne. Dans ce cours, vous irez au-delà de la théorie et construirez des projets concrets en utilisant Node.js, Express, MongoDB, Socket.IO et bien plus encore.

Que vous cherchiez à devenir un développeur full-stack, à décrocher votre premier poste ou à comprendre tout le fonctionnement de Node.js, ce cours vous donne tout ce dont vous avez besoin en un seul endroit.

Ce que vous allez apprendre :

  • Comprendre les concepts de base de Node.js, y compris les modules et les bibliothèques intégrées.

  • Qu'est-ce que Node JS ? Comment le nœud fonctionne sous le capot
  • Créez et structurez des API RESTful à l'aide d'Express.

  • Travaillez avec MongoDB et Mongoose pour stocker, interroger et gérer les données.

  • Mettre en œuvre l'authentification des utilisateur avec des jetons JWT.

  • Comment ajouter la connexion OAuth avec Google et Facebook.

  • Créez des flux de réinitialisation de mot de passe en utilisant Amazon SES et SMTP.

  • Comment intégrer des passerelles de paiement comme PayPal et Razorpay.

  • Développer des fonctionnalités en temps réel (chat en tête-à-tête et chat de groupe) grâce à Socket.IO.

  • Déployez des applications Node.js

  • (voir

Pourquoi vous devriez suivre ce cours :

Le développement back-end est au cœur de toute application web et mobile moderne. En maîtrisant Node.js, vous accédez aux possibilités suivantes :

  • Créez des API évolutives et prêtes à la production qui alimentent des applications réelles.

  • Ajoutez à vos projets des fonctionnalités réelles telles que l'authentification, les paiements et le chat. de

  • Appliquez vos compétences à des rôles de freelance, de startup ou de développeur professionnel.

  • Restez à jour des normes industrielles 2025 en matière de développement back-end.

J'ai conçu ce cours de manière à ce que vous passiez pas à pas d'un développeur back-end débutant à un développeur confiant, en mettant l'accent sur l'apprentissage pratique et des cas d'utilisation réels.

À qui s'adresse ce cours

Ce cours est pour :

  • Débutants qui veulent commencer le développement back-end avec Node.js.

  • Les développeurs front-end qui veulent devenir des ingénieurs complets.

  • Étudiants, entrepreneurs et développeurs en herbe qui souhaitent créer des applications complètes et réelles.

Aucune connaissance préalable en back-end n'est requise, mais vous devriez déjà avoir quelques connaissances de base en JavaScript (variables, fonctions, tableaux, objets).

Matériel/ressources

Pour suivre ce cours, vous aurez besoin de/d' : 

  • Un ordinateur avec accès à Internet.

  • Node.js et npm installés (je vous guiderai dans l'installation)

Vous aurez également accès au code de démarrage, à des modèles de projet et à des fichiers d'exemple pour vous aider à suivre. (n'importe quel

 

Rencontrez votre enseignant·e

Teacher Profile Image

Code Bless You

Make Coding Easy To Learn

Enseignant·e

Hi! I'm a passionate software engineer from Code Bless You and I love to teach about coding and general skills in less time. I've taught many people how to become professional software engineers.

My goal is to make coding fun for everyone. That's why my courses are simple, animated, and with practical implementation.

Learn by doing

Step-by-step tutorials and project-based learning.

Get support

One-on-one support from experts that truly want to help you.

don’t stress. have fun.

I can't wait to see you in class!

- Code Bless You

Voir le profil complet

Level: Beginner

Notes attribuées au cours

Les attentes sont-elles satisfaites ?
    Dépassées !
  • 0%
  • Oui
  • 0%
  • En partie
  • 0%
  • Pas vraiment
  • 0%

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

Chaque cours comprend de courtes leçons et des travaux pratiques

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

Suivez des cours où que vous soyez avec l'application Skillshare. Suivez-les en streaming ou téléchargez-les pour les regarder dans l'avion, dans le métro ou tout autre endroit où vous aimez apprendre.

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.