Der ultimative Node JS-Kurs 2026: Express, MongoDB, REST-APIs, Socket und mehr | Code Bless You | Skillshare

Playback-Geschwindigkeit


1.0x


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

Der ultimative Node JS-Kurs 2026: Express, MongoDB, REST-APIs, Socket und mehr

teacher avatar Code Bless You, Make Coding Easy To Learn

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      Kurseinführung

      2:57

    • 2.

      Abschnitt 01 - Was ist NodeJS?

      5:51

    • 3.

      Geschichte von NodeJS

      2:40

    • 4.

      Funktionsweise von NodeJS

      5:48

    • 5.

      Installieren von Node JS im System

      3:17

    • 6.

      Schreiben des ersten Knotencodes

      5:26

    • 7.

      VS-Code cool machen [OPTIONAL]

      1:59

    • 8.

      Abschnitt 02 - Was sind Module?

      3:52

    • 9.

      Eigenes Modul erstellen

      6:47

    • 10.

      Zugriff auf Modul in einem anderen Modul

      5:10

    • 11.

      Übung für eigenes Modul

      3:04

    • 12.

      Verwenden des Pfadmoduls

      7:13

    • 13.

      Betriebssystemdetails abrufen

      3:08

    • 14.

      Dateisystemmodul

      4:13

    • 15.

      Erstellen eines Servers mit dem HTTP-Modul

      5:18

    • 16.

      Umgang mit verschiedenen Routen

      3:41

    • 17.

      Abschnitt 03 - NPM Einführung

      2:27

    • 18.

      Paket erstellen

      4:20

    • 19.

      Paket im Projekt installieren

      4:07

    • 20.

      Pakete deinstallieren

      1:03

    • 21.

      Paket als Entwicklerabhängigkeit installieren

      1:46

    • 22.

      Veraltete Pakete und deren Aktualisierung

      5:56

    • 23.

      Entfernen Sie nicht verwendete Pakete aus dem Projekt

      1:48

    • 24.

      Abschnitt 04 - API im Vergleich zu REST-API

      7:41

    • 25.

      Liste der Planungs-API für Project 01

      1:49

    • 26.

      Einrichten einer neuen Anwendung

      1:08

    • 27.

      Erstellen eines Servers mit Express

      6:39

    • 28.

      Übung zum Erstellen von Express Server

      2:36

    • 29.

      API erstellen für die Liste aller todos erstellen

      3:34

    • 30.

      Automatischer Neustart von Nodämon einrichten

      1:55

    • 31.

      Umgebungsvariablen

      3:42

    • 32.

      Routingparameter und Abfrageparameter

      5:43

    • 33.

      Einzelnes Todo nach ID abrufen

      4:47

    • 34.

      POST-API zum Hinzufügen neuer Todo

      11:06

    • 35.

      Validierung von Benutzerdaten

      3:20

    • 36.

      Statuscode übergeben

      3:10

    • 37.

      res.send und res.json

      3:12

    • 38.

      Einzelnes Todo mit PUT-Request aktualisieren

      5:29

    • 39.

      Übung Bestimmtes Todo löschen

      3:48

    • 40.

      Abschnitt 05 - Einführung in Middleware

      4:09

    • 41.

      Erstellen benutzerdefinierter Middleware

      3:17

    • 42.

      Integriert in Middleware

      4:51

    • 43.

      Freigeben statischer Dateien vom Server

      4:28

    • 44.

      Nützliche Middleware von Drittanbietern

      4:58

    • 45.

      Programmieren entsprechend der Umgebung

      4:02

    • 46.

      env-Datei und dotenv-Paket

      3:47

    • 47.

      Unterschiedliche Einstellungen für unterschiedliche ENV

      3:43

    • 48.

      Vorlagen-Engines in Knotenanwendung

      5:59

    • 49.

      Bereinigen der Codeanwendungsstruktur

      5:34

    • 50.

      Abschnitt 06 - Asynchron und synchron

      9:45

    • 51.

      Callbacks in JavaScript

      6:32

    • 52.

      Problemlösung mit Callback

      7:31

    • 53.

      Callback Hell

      3:39

    • 54.

      Versprechen in JavaScript

      5:51

    • 55.

      Rückrufe durch Versprechen ersetzen

      7:51

    • 56.

      Async:await in JavaScript

      6:51

    • 57.

      Abschnitt 07 MongoDB-Grundlagen

      1:16

    • 58.

      Einführung der Datenbank

      4:34

    • 59.

      Installieren von MongoDB unter Windows

      4:19

    • 60.

      Verbinden von MongoDB mit Node App

      5:41

    • 61.

      Bedeutung von Schema

      3:15

    • 62.

      Definieren von Schema für Dokument

      4:05

    • 63.

      Erstellen von Modellen

      3:48

    • 64.

      Speichern neuer Daten

      4:46

    • 65.

      Abfrage der Daten

      7:48

    • 66.

      Vergleichsoperatoren in MongoDB

      6:17

    • 67.

      Logische Operatoren in MongoDB

      6:56

    • 68.

      Reguläre Ausdrücke in MongoDB

      5:23

    • 69.

      Dokumentanzahl zählen und schätzen

      2:46

    • 70.

      Paginierung und unendliche Abfrage

      6:37

    • 71.

      Aktualisieren der Daten

      9:20

    • 72.

      Operatoren in MongoDB aktualisieren

      1:42

    • 73.

      Löschen der Daten

      3:01

    • 74.

      Übung 01 - Konfigurieren von MongoDB

      7:16

    • 75.

      Übung 02 - Zum Speichern von Daten

      5:59

    • 76.

      Übung 03 - Abrufen von Daten

      5:52

    • 77.

      Übung 04 - Aktualisieren und Entfernen von Tasks

      8:21

    • 78.

      Abschnitt 08 - Integrierte Validierer

      6:42

    • 79.

      Benutzerdefinierte Validierer

      4:28

    • 80.

      Asynchrone Validierungsprüfungen

      1:59

    • 81.

      Nützliche SchemaTypes-Optionen

      0:55

    • 82.

      Beziehung zwischen Modellen

      5:05

    • 83.

      Hybrider Ansatz für Beziehungen

      2:23

    • 84.

      Anwenden des Referenzansatzes

      4:41

    • 85.

      So extrahieren Sie Daten aus Referenz [Populate]

      2:47

    • 86.

      Anwenden des Einbettungsansatzes

      4:25

    • 87.

      Anwendung des hybriden Ansatzes

      3:11

    • 88.

      Indizes in MongoDB

      10:54

    • 89.

      Funktionsweise von Indizes in MongoDB

      9:47

    • 90.

      Abschnitt 09 - Projekt 02 und Planung

      1:51

    • 91.

      Erstellen eines neuen Servers

      2:39

    • 92.

      Verbinden mit Datenbank

      2:15

    • 93.

      Übung - Erstellen eines Benutzermodells

      4:10

    • 94.

      Erstellen des neuen Benutzers

      12:26

    • 95.

      Hashen des Kennworts zur Sicherheit

      5:16

    • 96.

      Validierung von Benutzereingaben mit Joi

      8:45

    • 97.

      Funktionsweise der Authentifizierung

      3:30

    • 98.

      JWT-Token für Benutzer generieren

      5:45

    • 99.

      Festlegen des Ablaufdatums des Tokens

      2:19

    • 100.

      Sichern des Sicherheitsschlüssels in Umgebung

      2:13

    • 101.

      Übung Anmelderoute erstellen

      8:11

    • 102.

      Wie authentifiziere ich Benutzer? Eingeloggt oder nicht?

      12:56

    • 103.

      OAuth im Detail

      5:44

    • 104.

      OAuth in Node-Anwendung – Anmeldung mit Google

      15:03

    • 105.

      OAuth mit JWT

      16:36

    • 106.

      Anmeldung mit Facebook über OAuth

      10:37

    • 107.

      Vereinfachung des Codes

      3:00

    • 108.

      Problem mit Einzeltoken [AKTUALISIERT]

      2:16

    • 109.

      Zugriffstoken und Token-Logik aktualisieren [AKTUALISIERT]

      7:17

    • 110.

      Implementieren von Zugriffstoken und Aktualisieren von Token [AKTUALISIERT]

      9:24

    • 111.

      Route für neues Zugriffstoken aktualisieren [AKTUALISIERT]

      10:37

    • 112.

      OAuth mit zwei Token [AKTUALISIERT]

      2:21

    • 113.

      Pfad zum Abmelden eines Benutzers [AKTUALISIERT]

      3:55

    • 114.

      Abschnitt 10 - Erstellen des Kategoriemodells

      3:58

    • 115.

      Erstellen einer neuen Kategorie-API mit Image-Upload

      11:27

    • 116.

      Dateinamen und Filter in multer festlegen

      11:55

    • 117.

      API für alle Kategorien abrufen

      1:39

    • 118.

      Freigeben statischer Images vom Server

      2:06

    • 119.

      Übung - Definieren des Produktmodells

      6:56

    • 120.

      Rollenbasierte Autorisierung

      8:59

    • 121.

      Benutzerdefinierte rollenbasierte Autorisierung

      5:40

    • 122.

      Verarbeiten mehrerer Produktbilder

      3:30

    • 123.

      Erstellen neuer Produkte

      7:16

    • 124.

      Abrufen aller Produktdaten

      11:37

    • 125.

      Paginierung oder Infinite-Abfrage

      5:58

    • 126.

      Senden von Produkten nach Kategorie

      3:17

    • 127.

      Produkt per Suche senden

      2:25

    • 128.

      Übung - Einzelne Produktdaten abrufen

      5:50

    • 129.

      Übung. - Löschen des Produkts

      10:52

    • 130.

      Produkt nach Titel suchen [OPTIONAL]

      4:05

    • 131.

      Abschnitt 11 - Warum behandeln wir Fehler?

      2:44

    • 132.

      Umgang mit abgelehnten Versprechen

      3:25

    • 133.

      Fehler-Middleware erstellen

      3:26

    • 134.

      Versuchsblöcke entfernen

      1:44

    • 135.

      Fehler in Datei protokollieren

      11:46

    • 136.

      Protokollierung von Fehlern in mongoDB

      2:24

    • 137.

      Nicht erfasste Ausnahmen

      7:16

    • 138.

      Nicht bearbeitete Versprechen Ablehnung

      3:23

    • 139.

      Zusammenfassung der Fehlerbehandlung und -protokollierung

      1:50

    • 140.

      Abschnitt 12 - Erstellen eines Warenkorbmodells

      6:50

    • 141.

      API-Liste für Warenkorb definieren

      1:22

    • 142.

      Hinzufügen von Produkten zum Warenkorb

      20:38

    • 143.

      Den Benutzerkorb abrufen

      2:23

    • 144.

      Erhöhen Sie die Produktmenge

      9:22

    • 145.

      Verringern der Produktmenge

      3:58

    • 146.

      Entfernen eines einzelnen Produkts aus dem Warenkorb

      5:34

    • 147.

      Erstellen eines Auftragsmodells

      4:27

    • 148.

      Zahlungsverfahren

      3:53

    • 149.

      Implementierung des Razorpay Payment Gateways

      49:43

    • 150.

      Internationale Zahlung mit Paypal

      49:15

    • 151.

      Bestellhistorie abrufen

      2:21

    • 152.

      Status aktualisieren durch Admin

      5:17

    • 153.

      Bereinigen von Code für Indexdatei

      3:27

    • 154.

      Abschnitt 13 - Einführung in Projekt 03

      1:05

    • 155.

      Einrichten von Projekt 03

      5:14

    • 156.

      Benutzermodell erstellen

      4:23

    • 157.

      Registrieren eines neuen Benutzers

      10:35

    • 158.

      Übung - Benutzeranmeldungs-API

      0:28

    • 159.

      Lösung – Benutzeranmeldungs-API

      4:53

    • 160.

      Implementieren von Zugriffstoken und Aktualisieren von Token [AKTUALISIERT]

      5:16

    • 161.

      Aktualisieren und Abmelden von Route [AKTUALISIERT]

      9:00

    • 162.

      Details zum aktuell angemeldeten Benutzer

      7:27

    • 163.

      Benutzerkennwort zurücksetzen

      13:11

    • 164.

      Möglichkeiten zum Senden von E-Mail in Node JS

      2:17

    • 165.

      Einrichten von Amazon SES zum Senden von E-Mails

      21:09

    • 166.

      Kostenloses Versenden von E-Mails

      10:13

    • 167.

      Follower und Community der Folgenden

      2:18

    • 168.

      Folgen Sie dem Benutzer

      9:08

    • 169.

      Folgende Anfrage akzeptieren

      7:45

    • 170.

      Übung - Liste der Follower (Dativ: den Followern) abrufen und der Community folgen

      6:24

    • 171.

      Übung - Folgen Sie dem Benutzer nicht mehr

      3:34

    • 172.

      Abschnitt 14 - Einleitung

      0:26

    • 173.

      Beitragsmodell erstellen

      3:43

    • 174.

      Neuen Beitrag erstellen

      15:43

    • 175.

      Aktuelle Benutzerbeiträge abrufen

      4:16

    • 176.

      Zuhause mit Futter erhalten

      9:31

    • 177.

      Löschen des Beitrags

      6:51

    • 178.

      Wie und anders als der Beitrag

      4:56

    • 179.

      Implementieren der Kommentarfunktion

      6:15

    • 180.

      Hinzufügen von Antworten auf Kommentare

      5:21

    • 181.

      Übung - Entfernen eines bestimmten Kommentars

      4:37

    • 182.

      Fehlerbehandlung

      3:06

    • 183.

      Abschnitt 15 Einleitung

      1:10

    • 184.

      Erstellen von Chat - Nachrichtenmodell

      6:23

    • 185.

      Abrufen von Chats für Benutzer

      6:32

    • 186.

      Nachrichten eines bestimmten Chats abrufen

      3:44

    • 187.

      API zum Senden von Nachrichten

      10:02

    • 188.

      Was sind Web-Sockets?

      5:16

    • 189.

      Anschließen des Sockels

      8:20

    • 190.

      Socket-Emit- und -Methoden

      8:07

    • 191.

      Nachrichten für beide Benutzer empfangen

      2:02

    • 192.

      Logik für den Beitritt zum Chatroom

      3:00

    • 193.

      Implementieren des Beitritts zu einem Chatroom

      4:35

    • 194.

      Übung - Eingabeinzeige

      8:48

    • 195.

      Anwenden eines echten Sende-Nachrichtencodes

      5:33

    • 196.

      Benutzer im Socket authentifizieren

      10:52

    • 197.

      Benutzer als Online und Offline markieren

      3:44

    • 198.

      Mehrere Sockel für Einzelbenutzer

      5:50

    • 199.

      Zugestellte Aktualisierungsnachrichten

      17:15

    • 200.

      Nachrichtenstatus auf sichtbar aktualisieren

      8:53

    • 201.

      Gruppenfelder im Schema hinzufügen

      2:42

    • 202.

      Erstellen einer neuen Gruppen-API

      3:41

    • 203.

      Hinzufügen von Gruppenchat-Logik in Socket-Ereignissen

      14:22

    • 204.

      Abschnitt 16 - Bereitstellungsoptionen

      2:32

    • 205.

      Vereinfachung des Codes

      8:18

    • 206.

      Vorbereiten der Node-App für die Produktion

      2:58

    • 207.

      Überblick über den Bereitstellungsprozess

      0:39

    • 208.

      Hochladen der Node-Anwendung auf Github

      5:52

    • 209.

      Bereitstellen der Node-App auf Render

      3:37

    • 210.

      Hinzufügen von MongoDB Cloud

      6:51

    • 211.

      Was ist die MVC-Architektur? [BONUS]

      7:00

    • 212.

      MVC-Architektur anwenden [BONUS]

      20:56

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

71

Teilnehmer:innen

--

Projekte

Über diesen Kurs

Willkommen bei der Ultimate Node.js Masterclass 2025 – einer kompletten, 20-stündigen Reise in die moderne Backend-Entwicklung. In diesem Kurs gehen Sie über die Theorie hinaus und erstellen tatsächlich reale Projekte mit Node.js, Express, MongoDB, Socket.IO und mehr.

Ganz gleich, ob Sie Full-Stack-Entwickler werden, Ihre erste Backend-Rolle annehmen oder einfach verstehen möchten, wie Node.js unter der Haube funktioniert, dieser Kurs bietet Ihnen alles, was Sie brauchen, an einem Ort.

Das Lernziel:

  • Verstehen Sie die Kernkonzepte von Node.js, einschließlich Modulen und integrierten Bibliotheken.

  • Was ist Node JS? Funktionsweise des Knotens unter der Haube
  • Erstellen und Strukturieren von RESTful-APIs mit Express.

  • Speichern, Abfragen und Verwalten von Daten mit MongoDB und Mongoose.

  • Implementieren der Benutzerauthentifizierung mit JWT-Token.

  • Hinzufügen von OAuth-Anmeldungen mit Google und Facebook

  • Erstellen Sie Passwortrücksetzungsprozesse mit Amazon SES und SMTP.

  • Integration von Zahlungsgateways wie PayPal und Razorpay.

  • Erstellen Sie Echtzeitfunktionen (1:1-Chat und Gruppenchat) mit Socket.IO.

  • Bereitstellen von Node.js-Anwendungen

  • Viel mehr

Warum Sie diesen Kurs besuchen sollten:

Backend-Entwicklung ist das Herzstück jeder modernen Web- und mobilen Anwendung. Wenn Sie Node.js beherrschen, erhalten Sie folgende Möglichkeiten:

  • Erstellen Sie skalierbare, produktionsfähige APIs für reale Anwendungen.

  • Fügen Sie Ihren Projekten praktische Funktionen wie Authentifizierung, Zahlungen und Chat hinzu.

  • Setzen Sie Ihre Fähigkeiten bei freiberuflichen Tätigkeiten, Start-up Projekten oder professionellen Entwicklern ein.

  • Bleiben Sie mit den Branchenstandards 2025 in der Backend-Entwicklung auf dem Laufenden.

Ich habe diesen Kurs so konzipiert, dass er Sie Schritt für Schritt vom Anfänger zum selbstbewussten Backend-Entwickler führt. Dabei liegt der Schwerpunkt auf praktischem Lernen und praktischen Anwendungsfällen.

Für wen ist dieser Kurs

Dieser Kurs richtet sich an:

  • Einsteiger, die mit Node.js in die Backend-Entwicklung einsteigen möchten.

  • Frontend-Entwickler, die Full-Stack-Engineers werden möchten.

  • Studenten, Unternehmer und angehende Entwickler, die komplette, praxisorientierte Anwendungen erstellen möchten.

Es sind keine Backend-Kenntnisse erforderlich, aber Sie sollten bereits mit grundlegenden JavaScript-Kenntnissen vertraut sein (Variablen, Funktionen, Arrays und Objekte).

Materialien und Ressourcen

Für diesen Kurs brauchst du Folgendes:

Außerdem erhalten Sie Zugriff auf Startercode, Projektvorlagen und Beispieldateien, die Ihnen helfen, den Weg zu gehen.

 

Triff deine:n Kursleiter:in

Teacher Profile Image

Code Bless You

Make Coding Easy To Learn

Kursleiter:in

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

Vollständiges Profil ansehen

Level: Beginner

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

Transkripte

1. Einführung in den Kurs: Willkommen zum ultimativen NoJS-Kurs. In diesem Kurs lernen Sie alles über Nodejs von den Grundlagen bis hin zu Fortgeschrittenen in einer einfachen und leicht verständlichen Sprache Am Ende dieses Kurses werden Sie damit beginnen, schnelle, skalierbare und sichere Pend-Anwendungen zu entwickeln, skalierbare und sichere Pend-Anwendungen ohne Lassen Sie mich Ihnen einige der wichtigsten Funktionen erläutern in diesem Kurs behandelt werden Sie werden also die Datenbankverbindung lernen. Seitennummerierung und Infinanzielles Scrollen, Benutzerauthentifizierung sowie Funktionen zur Anmeldung bei Google und Anmeldung mit Facebook, Senden von E-Mails aus unserem Backend, Hochladen mehrerer Bilder, Bearbeitung und Protokollierung von Fehlern, Bearbeitung und Protokollierung von Fehlern, vollständige Zahlungsintegration auf Papier sowie Echtzeit-Chat-Funktionen über Socket, sowie Echtzeit-Chat-Funktionen über Senden von Eins-zu-Eins-Nachrichten Benutzerauthentifizierung sowie Funktionen zur Anmeldung bei Google und Anmeldung mit Facebook, Senden von E-Mails aus unserem Backend, Hochladen mehrerer Bilder, Bearbeitung und Protokollierung von Fehlern, vollständige Zahlungsintegration auf Papier sowie Echtzeit-Chat-Funktionen über Socket, Senden von Eins-zu-Eins-Nachrichten, das Tippen zeigt Indikatoren, Umgang mit dem Nachrichtenstatus, ob sie gesendet, zugestellt oder gesehen wurden, sowie diese fortgeschrittenen Konzepte zu erlernen, brauchen wir nun eine solide Basis. Zunächst werden wir also mit dem Erlernen Nodejs-Grundlagen wie den Kernkonzepten von Node, integrierten Modulen, Express, dem beliebtesten und am häufigsten verwendeten Node-Js-Framework, einigen JavaScript-Repressor-Konzepten wie Callbacks, einigen JavaScript-Repressor-Konzepten wie Promises, Außerdem werden wir Mongo DB und Mangos sehen, und wenn Sie die grundlegenden Konzepte klar verstehen, können Sie alle fortgeschrittenen Themen des Node-Jazz sehr einfach implementieren . Außerdem möchte ich eines klarstellen. In diesem Kurs werden wir kein Frontend erstellen, da dies nicht Teil dieses Kurses ist. Wir werden jedoch einige Funktionen im Frontend testen, sodass Sie einen klaren Überblick über den gesamten Arbeitsablauf dieser Funktionen erhalten klaren Überblick über den gesamten Arbeitsablauf dieser Funktionen erhalten . Ich gebe Ihnen fertigen Frontend-Code zur Verkostung, Sie müssen also nur diese Datei ausführen und schon können Sie einige Funktionen probieren. Es macht wirklich Spaß. Wenn Sie sich also ein bisschen mit Node-Jazz auskennen oder wenn Sie sich mit Konzepten nicht auskennen, wenn Sie nichts über Node-Jazz wissen, dann ist dieser Kurs genau das Richtige für Sie. In diesem Kurs werden wir drei Back-End-Anwendungen erstellen. Zunächst werden Anwendungen zum Erlernen grundlegender Konzepte erstellt, und dann zwei große Projekte, E-Commerce-Anwendung und Backend für Social-Media-Anwendungen, um fortgeschrittene Node-Jazz-Konzepte zu erlernen. Jetzt fragst du dich vielleicht, wer ich bin? Ich bin Softwareingenieur und unterrichte auch Programmieren in leicht zu erklärender Sprache über meinen YouTube-Kanal, Gott segne dich, und mit meinen Online-Kursen. Insgesamt erhalten Sie in diesem Kurs mehr als 200 SD-Videolektionen, Implementierung in der realen Welt, eine Menge Übungen, sodass Sie mit praktischer Umsetzung kein Js lernen können , einige Tipps und Tricks und vieles mehr. Nach Abschluss dieses Kurses wirst du selbstbewusst und mit den besten Techniken No-JS-Code schreiben selbstbewusst und mit den besten Techniken . Melde dich also schnell an und werde ein No Js-O to No Jazz-Held CU in diesem Kurs. 2. Abschnitt 01 - Was ist NodeJS?: NodeJS ist bei Entwicklern am beliebtesten, aber es ist keine Programmiersprache oder kein Framework Was ist dann wirklich Nod Js? Lass uns das sehen. Nojs ist einfach eine Laufzeitumgebung zum Ausführen JavaScript-Code außerhalb des Browsers. Was meine ich damit? Wie wir wissen, verwenden wir JavaScript-Code, um die Daten auf der Webseite zu ändern oder eine Logik zu implementieren, aber wir können Ja Script nicht außerhalb des Browsers ausführen. müssen unsere JavaScript-Datei mit unserer SDML-Datei verknüpfen, dann können wir sie in unserem Browser ausführen Aber mit nodejs können wir JavaScript-Code außerhalb des Browsers ausführen JavaScript-Code außerhalb des Nodejs bietet eine Laufzeitumgebung zum Entwickler verwenden Nojz hauptsächlich, um Backend-Dienste zu erstellen, die als API oder, wir können sagen, als Anwendungsprogrammierschnittstelle bezeichnet als API oder, wir können sagen, als Anwendungsprogrammierschnittstelle bezeichnet werden. Jetzt fragst du dich vielleicht, was ist eine API? Im Grunde ist es eine Möglichkeit für zwei Programme, miteinander zu kommunizieren. Ich erkläre dir das anhand eines Beispiels. Also hier ist ein Restaurant. Wir sitzen am Tisch n und wollen etwas zu essen bestellen. Was werden wir in diesem Fall tun? Wir können nicht direkt in die Küche gehen und unser Essen beim Koch bestellen. Stattdessen rufen wir einen Kellner an. Kellner, nimmt unsere Bestellung entgegen und gibt sie dann in die Küche Danach beginnt die Küche mit der Bearbeitung unserer Bestellung und gibt dem Kellner Essen Anschließend liefert der Kellner das Essen an Hier ist Water also wie ein Bote, der unsere Anfrage entgegennimmt und diese Anfrage an unser Ziel weiterleitet Und dann erhält der Kellner eine Antwortnachricht von diesem Ziel und bringt sie zu uns zurück In der realen Welt ist dieser Tisch n, auf dem wir sitzen, unsere Client-Anwendung oder unser Frontend Wir wollen einige Daten über Lebensmittel erhalten , die im Backend verfügbar sind. Wir werden Waiter anrufen, was eine API ist , und Anfragen an sie senden Jetzt überträgt die API diese Anfrage an einen Server oder eine Datenbank, die unsere Küche ist, und dieser Server oder diese Datenbank teilt die Antwort, also die Daten, die wir wollen Und die API liefert die Antwortdaten an unseren Kunden. Jetzt verstehst du , was eine API ist. API ist eine Möglichkeit für zwei Programme, miteinander zu kommunizieren. Mit NodeJS können wir reale APIs erstellen. Außerdem können wir mit Node JS superschnelle Echtzeitanwendungen erstellen mit Node JS superschnelle Echtzeitanwendungen Diese Dienste versorgen unsere Client-Anwendungen wie Webanwendungen und mobile Anwendungen mit Strom, die sehr nützlich sind Wissen Sie, dass Netflix, Paper, Uber, Lin DIN und viele andere berühmte Unternehmen No Jazz verwenden? Ja, denn Noe Jaz macht ihre Dienste superschnell und effizient Außerdem hat P großartige Nachforschungen über Noe Jaz angestellt. Ich werde dir das in einer Minute sagen. Zusammenfassend lässt sich sagen, dass Node Jazz eine Laufzeitumgebung ist und die ideale Wahl für die Entwicklung hoch skalierbarer datenbezogener Echtzeitanwendungen Jetzt fragen Sie sich vielleicht, dass es viele Frameworks und Sprachen wie Java und asp.net gibt, denen auch Dienste erstellt werden können . Was ist das Besondere an Node Jazz? Warum sollten wir Node Jazz lernen? Warum ist es so beliebt? Zuallererst können wir ohne Jazz superschnelle und hoch skalierbare Backend-Services zu niedrigen Kosten entwickeln skalierbare Backend-Services zu niedrigen Kosten Außerdem haben die Leute ein großartiges Experiment ohne Jazz gemacht. In diesem Experiment haben die Leute Anwendungs-Backend ohne Jazz erstellt und dieselbe Anwendung auch mit Java plus Spring erstellt. Und kennen Sie das Ergebnis dieses Experiments? Es ist wirklich schockierend. Sie fanden heraus, dass die Node-Anwendung doppelt so schnell wie die Java-Plus-Spring-Anwendung und mit weniger Mitarbeitern erstellt wurde schnell wie die Java-Plus-Spring-Anwendung und mit weniger Mitarbeitern In Java plus Spring haben sie fünf Entwickler, dann in Node benötigen sie nur zwei Entwickler, und trotzdem erstellen diese beiden Entwickler Anwendungen schneller in NodeJS Außerdem benötigt die Node-Anwendung 40% weniger Dateien. Außerdem haben sie in Java 5.000 Codezeilen, aber in Nodejs haben sie nur 1.500 Codezeilen, was drei x weniger ist Node-Anwendung ist also superschneller, Antwortzeit beträgt 35% schneller als die Java-Anwendung, und die Node-Anwendung kann fast zwei X-Anfragen pro Sekunde bearbeiten als die Java-Anwendung Dieses Ergebnis schockierte alle und die Leute sofort viele Dienste von Java auf Node Jz migriert Ist wirklich cool, oder? Zweitens erhalten wir mit Node Jazz eine sauberere und konsistentere Codebasis , weil wir mit weniger Code viele komplexe Dinge tun können. Außerdem eignet es sich hervorragend für das Prototyping, was bedeutet, dass Node Jazz beim Erstellen der ersten Version einer Anwendung schnell und einfach zu verwenden ist beim Erstellen der ersten Version einer Anwendung schnell und einfach zu verwenden Die erste Version wird als Prototyp bezeichnet. Wie wir wissen, werden wir im Node Jazz auch JavaScript verwenden. Wenn Sie also Freund und Entwickler sind, können Sie Node Jazz ganz einfach lernen ohne eine neue Programmiersprache zu lernen. Und wenn du sowohl Frontend als auch Backend lernst, dann kannst du deine berufliche Rolle als Full-Stack-Entwickler wechseln , deine Karriere verbessern und mehr Gehalt bekommen Und ein weiterer Vorteil von Nojs ist, dass Nojz über ein großes Ökosystem von Open-Source-Bibliotheken verfügt, was bedeutet, dass es vordefinierten Code für bestimmte Dinge gibt Nojz über ein großes Ökosystem von Open-Source-Bibliotheken verfügt, was bedeutet, dass es vordefinierten Code für bestimmte Dinge gibt. So können wir den Code einer anderen Person verwenden und deren Funktionen in unserer Anwendung implementieren Insgesamt wird das Erlernen von Nodejs im Jahr 2025 oder in Zukunft Ihnen und Ihrer Programmierkarriere also definitiv zugute kommen 3. Geschichte von NodeJS: In der vorherigen Lektion haben wir gesehen, dass No Jazz eine Laufzeitumgebung ist , um JavaScript-Code außerhalb des Browsers auszuführen JavaScript-Code außerhalb des Browsers Aber lassen Sie uns anhand einer interessanten Geschichte sehen, wie Noe Jazz erfunden hat. Vor 2009 war JavaScript wie ein Superheld, gefangen in einem Browser wie Chrome, Firefox und vielen anderen Browsern In all diesen Browsern gibt es eine JavaScript-Engine. Wenn wir unseren JavaScript-Code im Browser ausführen, übergibt der Browser diesen Code an die JavaScript-Engine. JavaScript-Engine verarbeitet diesen Code und wandelt ihn in Maschinencode um , den unser Computer verstehen kann. Beispielsweise verwendet Microsoft Taj die Chakra Engine, Firefox Spider Monkey-Engine und Google Chrome Fiat Engine, die leistungsstärkste JavaScript-Engine unter allen Browsern Aufgrund dieser unterschiedlichen JavaScript-Engines funktioniert JavaScript-Code manchmal in verschiedenen Browsern unterschiedlich Wenn wir JavaScript nur in Browsern verwenden, gibt es viele Einschränkungen. Wir können keine Server bauen oder Bend-Aufgaben wie den Umgang mit Datenbanken, Benutzerauthentifizierung oder APIs ausführen. Jetzt, wo ein Entwickler ist, kommt Yandll ins Spiel Er denkt, was wäre, wenn wir die Vat-Engine nehmen und JavaScript auf Servern statt nur in Browsern laufen lassen würden Er nimmt die Vet-Engine, die schnellste Js-Engine, und zeichnet diese Engine im CPlusPlus-Code Kann Jascip-Code auf unserem Computer ausführen und diese Software nodejs nennen und das ist SOO nodejs erfunden Nod Js ist eine Laufzeitumgebung zum Ausführen JavaScript-Code, da es über eine V JA Script-Engine verfügt Diese Umgebung unterscheidet sich kaum von der in unserem Browser. Wie im Browser-Ja-Skript haben wir ein Dokumentobjekt für den Umgang mit SDML-Dokumenten Außerdem haben wir ein Window-Objekt. Diese Objekte kommen nicht in den Node Jazz und wir wollen auch nicht auf Dokument- und Window-Objekte zugreifen , weil wir in Node Jazz Back-End-Dienste erstellen und Dokument- und Window-Objekte für Frontend-Aufgaben vorgesehen sind. Warum brauchen wir also Dokument und Fenster im Backend? Mit dem Node js können wir viele weitere Dinge tun, wie auf das Dateisystem zugreifen, um Dateien zu lesen und zu schreiben. Wir können eine Verbindung zur Datenbank herstellen und Daten in der Datenbank speichern, und wir können auch schnelle APIs und vieles mehr erstellen. Nun, eine Frage, die Sie sich vielleicht stellen könnten, wie nodejs superschnell ist, wie kein Jz funktioniert, und das werden wir in der nächsten Lektion sehen 4. Funktionsweise von NodeJS: Wir haben also gesehen, dass Nodejs für superschnelle und hoch skalierbare Backend-Anwendungen verwendet wird superschnelle und hoch Aber jetzt ist Nod Js superschnell. Der Grund, warum kein Js superschnell ist, liegt darin, dass Node JS nicht blockiert, oder wir können sagen nicht blockiert, oder wir können sagen, asynchron Jetzt fragen Sie sich vielleicht, was asynchron ist? Lassen Sie mich Ihnen das anhand eines einfachen Beispiels erklären. Stellen Sie sich vor, hier ist ein Restaurant. Wir haben hier eine Küche und wir haben mehrere Tische. Jetzt möchte der erste Kunde eine Bestellung aufgeben. Also hier, unser Kellner, geh zuerst an den Tisch, hol dir die Bestellung Sagen wir eine Pizza. Und dann gibt unser Kellner diese Bestellung dem Koch in der Küche Während unser Kellner Pizza macht, schaut er sich jetzt andere Tische an Nehmen wir an, Tisch zwei möchte eine weitere Bestellung aufgeben, dann nimmt der Kellner diese Bestellung entgegen und gibt sie auch in der Küche Unser einziger Kellner kann viele Tische bedienen. Er muss nicht warten, bis der Koch eine Bestellung abgeschlossen hat, und dann kann er eine weitere Bestellung servieren . Das muss er nicht tun. Dies wird als nicht blockierender oder asynchroner Weg bezeichnet, und so funktioniert die Node-Anwendung Dieser einzelne Writer arbeitet als einzelner Thread von Node JS, dessen Aufgabe es ist, Anfragen zu bearbeiten Dieser einzelne Thread kann also verwendet werden, um mehrere Anfragen zu bearbeiten, ohne ihn zu blockieren. Auf der anderen Seite dieses asynchronen Weges haben wir nun auch den synchronen oder blockierenden Lassen Sie uns das auch anhand desselben Beispiels verstehen. Also hier möchte Kunde Vn Ordnung geben. Unser Kellner nimmt die Bestellung vom ersten Tisch entgegen und gibt sie in die Küche, und wir selbst bereiten uns auf diese Bestellung vor, wie Pizza Wie wir wissen, kann die Zubereitung von Pizza einige Zeit in Anspruch nehmen. Zu diesem Zeitpunkt wartet unser Kellner dort in der Küche, anstatt sich um andere Tische wartet unser Kellner dort in zu kümmern, um die Bestellung abzuschließen Nehmen wir an, es dauert 10 Minuten, also wartet unser Kellner dort 10 Minuten in der Küche Danach lieferst du die Pizza an Tisch eins. Zu dieser Zeit müssen Kunden an anderen Tischen sitzen, weil unser Kellner für 10 Minuten gesperrt ist Dies wird als blockierender oder synchroner Weg bezeichnet. Die meisten älteren Backend-Frameworks wie w.net oder Rails arbeiten synchron oder Wenn also jemand Anfragen auf dem Server sendet, weist der Server einen Thread zu, um diese Anfrage zu bearbeiten Unser Beispiel ist weiter. Stellen Sie sich nun vor, wir haben Anfrage, die Benutzerliste zu erhalten. Für diese Aufgabe ist ein Datenbankvorgang erforderlich, der einige Zeit in Anspruch nehmen kann. Wenn wir zu diesem Zeitpunkt eine weitere Anfrage erhalten, müssen wir ihnen, um diese neue Anfrage zu bearbeiten, auch einen neuen Thread oder weiter geben. Stellen Sie sich nun vor, auf unserem Server gibt es 1.000 Anfragen. Sollen wir einen Thread für all diese Anfragen erstellen? Wenn ja, müssen wir die Anzahl der Serverhardware erhöhen, was sehr kostspielig und langsam ist Aus diesem Grund benötigen Anwendungen , die auf asp.net oder Rails basieren benötigen Anwendungen , die auf asp.net oder Rails mehr Server und Zu diesem Zeitpunkt kommt der Knoten ins Spiel, und wie wir gesehen haben, und wie wir gesehen haben verwenden Knoten asynchrone oder blockierungsfreie Methoden Natürlich können wir dafür sorgen, dass die ASP.NET- oder Rails-Anwendung wie eine nicht blockierende oder asynchrone Anwendung funktioniert nicht blockierende oder asynchrone Aber dafür müssen wir zusätzliche Arbeit leisten. Auf der anderen Seite funktionieren Knotenanwendungen standardmäßig asynchron oder nicht blockierend Es ist also sehr schnell und einfach zu verwalten. Wenn wir mehrere Anfragen auf dem Knotenserver erhalten, hat der Knoten einen einzigen Thread. Dieser einzelne Thread kann eine Anfrage bearbeiten. Wenn diese Aufgabe nun Zeit in Anspruch nimmt, suchen Sie etwas aus der Datenbank, suchen Sie etwas aus der Datenbank, dann fügt unser einziger Thread diese Aufgabe zur Liste mit dem Namen Event Q hinzu und geht zu einer anderen Anfrage über und beginnt mit der Bearbeitung dieser Anfrage. Dieses Ereignis Que benachrichtigt Knoten, wenn er Daten aus der Datenbank erhält, und dann sendet unser Knoten diese Daten an die Anfrage. Auf diese Weise kann unser einzelner Thread also mehrere Benutzer bedienen, und aus diesem Grund ist Nodejs eine hervorragende Option für datenintensive oder netzwerkbezogene Anwendungen Kann mehr Clients bedienen, ohne weitere Server hinzuzufügen, und aus diesem Grund sind Node-Anwendungen auch hochgradig skalierbar Die Frage ist nun, sollten wir Node Jazz für alle Arten von Anwendungen verwenden ? Und die Antwort lautet nein. Wir sollten Node nicht für CPU-intensive Anwendungen verwenden. Nun, was ist der CiPI-intensive? CPU-intensiv sind Anwendungen, die CPU-bezogene Aufgaben wie Videobearbeitungs- oder Fotobearbeitungsanwendungen haben CPU-bezogene Aufgaben wie Videobearbeitungs- oder Fotobearbeitungsanwendungen Bei diesen Arten von Anwendungen haben wir eine Menge Berechnungen, bei denen nur wenige CPU-Optionen verwendet werden können, was das Dateisystem oder das Netzwerk tut. Und wie wir wissen, handelt es sich bei Node eine Single-Thread-Anwendung, wenn sie CPI-bezogene Operationen ausführt , während andere Clients warten müssen , bis diese Aufgabe abgeschlossen ist Hier wird der Node seinen Vorteil verlieren, asynchron zu sein, und aus diesem Grund sollten wir Node nicht für SIP-intensive Anwendungen verwenden Node nicht für SIP-intensive Kann Node für Eingabe-, Ausgabe-, Netzwerk- oder Echtzeitdatenanwendungen Denken Sie daran, dass wir Node nicht für CiPI-intensive Anwendungen verwenden sollten Node nicht für CiPI-intensive Anwendungen Andernfalls kann Node für fast alle Arten von Anwendungen verwendet für fast alle Arten von Anwendungen Wir verstehen also, dass Nod Jazz schneller ist als andere Backend-Frameworks. Mach dir keine Sorgen über die Theorien. Wenn Sie Projekte in Node Jaz erstellen, werden Sie das alles sehr leicht verstehen Fangen wir also an, Node Jaz praktisch zu lernen. 5. Installieren von Node JS im System: Mal sehen, wie man NodeJS in unserem System installiert. Zunächst werden wir prüfen, ob Nojs bereits in unserem System ist Öffnen Sie also die Befehlszeile in Windows Wenn Sie Mac oder Linux verwenden, öffnen Sie Ihr Terminal und schreiben Sie Node, Dash Dash-Version, und drücken Sie die Eingabetaste Sehen Sie hier, ich erhalte diese Art von Fehlermeldung, Knoten wird nicht als interner oder externer Befehl erkannt . Das bedeutet, dass der Knoten nicht in meinem System installiert ist. Wenn Sie hier die Node.js-Version bekommen, was bedeutet, dass Node bereits in Ihrem System installiert ist, aber ich empfehle Ihnen dringend, die neueste Tabellenversion von Node JS zu installieren die neueste Tabellenversion von Node Gehen Sie also zum Browser und zu opennjs.org. Auf dieser Website können wir die Nodjs-LTS-Version herunterladen, was die neueste Tabellenversion bedeutet, deren Verwendung Node offiziell empfiehlt. Zum Zeitpunkt der Aufzeichnung dieses Kurses ist die neueste stabile Version neueste stabile Aber in Zukunft könnte es eine aktualisierte Version geben Klicken Sie also einfach auf diese Version und der Download wird gestartet. Eine Frage, die Sie sich vielleicht stellen Ist dieser Kurs für die zukünftigen Node-Versionen relevant? Und die Antwort lautet ja. Dieser Kurs bleibt für jede Node-JS-Version relevant , da wir uns in diesem Kurs stark auf die Grundlagen von Node JS konzentrieren werden auf die Grundlagen von Node JS und Sie diese Grundlagen in jeder Node-JS-Version verwenden können Sie müssen sich also keine Sorgen machen, dass es keine JS-Updates gibt. Wenn größere Updates auftreten, werde ich diesen Kurs entsprechend aktualisieren. Jetzt ist unser Setup bereit zur Installation. Also lass es uns öffnen. Lassen Sie mich hier klicken Sie auf Weiter, akzeptieren Sie die Allgemeinen Geschäftsbedingungen und klicken Sie auf Weiter. Von hier aus ändern Sie den Installationspfad, lassen ihn aber meiner Meinung nach so, wie er ist. Klicken Sie erneut auf Weiter und Weiter und installieren Sie. Und es ist geschafft. Lassen Sie uns nun überprüfen, ob Nojs erfolgreich installiert wurde oder nicht. also zur Befehlszeile oder zum Terminal zurück und schreiben Sie die Knotenversion und drücken Sie die Eingabetaste Siehst du, jetzt komme ich hier auf Nod Gs Version 22.14 0.0. Also haben wir Node erfolgreich in unserem System installiert. Eine weitere Sache, die wir in diesem Kurs benötigen, ist der Code-Editor. Mein Lieblings-Code-Editor ist Visual Studio-Code oder VS-Code , einer der besten Code-Editoren. Natürlich können Sie auch andere Code-Editoren verwenden, aber nicht viele Editoren verfügen über die gleiche Leistung wie VS-Code. Außerdem werde ich in diesem Kurs meine Tipps und Tricks für VS-Code teilen. Wenn Sie also keinen VS-Code haben, können Sie zu code.visualstudio.com gehen, VS-Code herunterladen und VS-Code herunterladen Es ist wirklich einfach. In der nächsten Lektion werden wir nun unseren ersten Node-JS-Code schreiben. 6. Schreiben des ersten Knotencodes: Schreiben wir unseren ersten Knoten-JS-Code. Öffnen Sie einen Ordner, in dem Sie ein Projekt erstellen möchten. Hier öffne ich den Projektordner und in diesem Ordner erstelle ich einen neuen Ordner, sagen wir, das erste Projekt und öffne dieses Projekt einfach in VS-Code. Gut. Dieser VS-Code sieht für diesen Kurs etwas kleiner aus. Also lass mich es zoomen. Normalerweise zoome ich nicht so stark hinein, aber mit diesem Zoom können Sie deutlich sehen, was ich mache. Perfekt. Lassen Sie uns jetzt hier eine neue Datei erstellen. Sagen wir Index Dot Js. Sie können einen beliebigen Namen verwenden. Es liegt ganz bei dir. Jetzt können wir in diese Datei unseren normalen JavaScript-Code schreiben , den wir gewohnt sind zu schreiben. Erstellen wir also einfach eine Variable namens Begrüßung entspricht Guten Morgen Und danach schauen wir uns einfach das Protokoll an. Hallo Komma und füge einfach die Begrüßungsvariable ein. Speichern Sie diese Datei. Jetzt fragen Sie sich vielleicht, wie können wir diesen Code ohne unseren Browser ausführen? Weil wir bisher JavaScript über den Browser ausgeführt haben. Um diesen Code ohne Stühle auszuführen, benötigen wir ein Terminal. Und benutze unser Systemterminal und öffne unseren Projektordner in diesem Terminal, oder wir können das VS-Code-Terminal verwenden. Ich verwende immer das VSCode-Terminal, weil es einfach zu öffnen ist Gehen Sie zum Terminalmenü und wählen Sie ein neues Terminal aus, oder Sie können Control plus Pecti drücken Es wird hier das Terminal geöffnet. Um diese Indexpunkt-JS-Datei auszuführen, schreiben wir einfach node, space und unseren Dateinamen , der index dot js lautet. Ihr Dateiname ist apt Gs, dann müssen Sie hier nodspace app dot js schreiben und die Eingabetaste drücken Siehst du, hier bekommen wir unsere Console-Linie. Also herzlichen Glückwunsch. Du schreibst deinen ersten Node.js-Code Um dieses Terminal auszublenden, können wir erneut Control plus Bectig drücken Jetzt können wir hier auch eine Funktion hinzufügen und diese Funktion aufrufen, genau wie wir es in normalem JavaScript tun Nachdem wir also die neue Zeile in der Konsole angemeldet haben, können wir eine Drucknachricht für die Funktion erstellen. Und in den Cully-Klammern konsolen wir einfach das Punktprotokoll. Hab einen schönen Tag. Und nach dieser Funktion rufen wir einfach diese Funktion zum Drucken von Nachrichten auf, damit wir diese Konsolenmeldung abrufen, diese Datei speichern und, um diese Datei erneut auszuführen, was schreiben wir in das Terminal? Schreiben Sie, wir schreiben Node Space Index Dot Js. Sehen Sie hier, wir bekommen beide Console Loui. Also können wir hier die Set-Timeout-Funktion, die Set-Timeout-Funktion usw. verwenden . Wir können fast den gesamten JavaScript-Code in die Node-Anwendung einfügen in die Node-Anwendung Jetzt fragen Sie sich vielleicht, welche Art von JavaScript-Code wir hier im Node-JS-Projekt nicht hinzufügen können. Im NodeJS-Projekt können wir also alle Arten von JavaScript-Code hinzufügen, außer dem Schreiben von Doom-Manipulationscode wie Document Dot Get Element oder Window Dot Location usw., denn wie wir wissen, läuft jeder Code, wir in einer Node-Anwendung schreiben, den wir in einer Node-Anwendung schreiben, auf dem Server und auf dem Server, wie können wir auf Dokument - und Fensterobjekte zugreifen Lassen Sie mich Ihnen praktisch zeigen, was passiert, wenn wir ein Dokument in dieser Indexpunkt-JS-Datei verwenden Ich kommentiere den ganzen Code mit Control plus Slash oder Command plus Slash und einfach hier, Console Dot Drucken Sie hier das Dokumentobjekt aus. Speichern Sie diese Datei und im Terminal führen wir erneut Node Index Dot JS aus, oder wir können einfach einen Perro drücken Es wird den vorherigen Befehl für uns bringen. Sehen Sie, hier erhalten wir eine Fehlermeldung, die besagt, dass das Dokument nicht definiert ist, und A zeigt uns die Zeile. Also können wir hier keinen Doom-Manipulationscode verwenden. Eine andere Sache ist, dass wir hier auch keine browserspezifischen Ereignisse wie Alert verwenden hier auch keine browserspezifischen Ereignisse wie Alert An der Stelle dieser Konsole fügen wir also Alert hinzu, sag Hallo. Speichern Sie diese Datei und lassen Sie uns diese Datei erneut ausführen. Sehen Sie hier, dass Alert nicht definiert ist, da es browserbezogene Ereignisse handelt. Der Server kann die Warnung nicht im Browser anzeigen. Es ist das Frontend , das Alert anzeigen kann. Um es in der Index-Js-Datei oder anderen Dateien im Node-Projekt zusammenzufassen Index-Js-Datei oder anderen Dateien im Node-Projekt Wir schreiben JavaScript-Code für Server. Wir können verschiedene Module verwenden, SddprQuest handhaben, auf unsere Systemdateien zugreifen, eine Verbindung zur Datenbank herstellen, Echtzeitanwendungen erstellen und vieles mehr, was wir in diesem Kurs Schritt für Schritt lernen werden Keine Sorge, nach diesem Kurs werden Sie Node beherrschen. Du musst nur zusammen mit mir programmieren und versuchen, Code zu schreiben, nachdem du ihn richtig verstanden hast. Nicht nur kopieren und einfügen. Sie müssen verstehen, warum wir diesen speziellen Code schreiben und ihn dann implementieren. Es ist wirklich einfach. 7. VS-Code cool machen [OPTIONAL]: Wenn Sie sich in der vorherigen Lektion fragen, wie mein Code beim Speichern der Datei neu formatiert wird Dafür verwende ich eine der besten und beliebtesten VS-Code-Erweiterungen namens Installiere diese Erweiterung. Jetzt müssen wir kleine Einstellungen für Installation von Pretty E vornehmen. Scrollen Sie also im Installationsbereich nach unten zum Standard-Formatierer-Bereich Und hier, kopiere diese beiden Codezeilen ohne Cully-Klammern. Öffnen Sie nun die Einstellungen über das untere Zahnradsymbol, gehen Sie zu Einstellungen und öffnen Sie von hier aus in der oberen rechten Ecke Einstellungen, Berührungen und Datei in der letzten Zeile Fügen Sie in der letzten Zeile ein Komma hinzu und dann in der neuen Zeile hinter diesen Sehen Sie sich diese Datei an. Kehren Sie nun beim Speichern zu den Einstellungen und dem Suchformat und stellen Sie sicher, dass es aktiviert und fertig ist. Außerdem fragen mich viele Schüler, welches Thema und welche Schriftarten ich für meinen VS-Code verwende. Derzeit verwende ich mein Lieblingsthema, nämlich Au Mirage Warder Sie können das vom Erweiterungspanel herunterladen. Dieses Thema ist nicht sehr hell oder nicht sehr dunkel, also ist es gut für unsere Augen und es sieht gut aus. Der Name der Schrift, die ich verwende, ist Monisa. Welche ist die kostenpflichtige Schriftart, Sie können diese Schriftart herunterladen , wie Sie möchten Ich kann nichts weiter sagen. Installieren Sie sie in Ihrem System. Sie dann in der VS-Code-Einstellung Suchen Sie dann in der VS-Code-Einstellung hier nach der Schriftfamilie und fügen Sie Ihren Schriftnamen ganz am Anfang hinzu, und fertig. Sie können jedes beliebige Thema und jede beliebige Schriftart verwenden. Es liegt ganz bei dir. Und wenn Sie eine großartige Kombination haben, können Sie Ihre VS-Code-Screenshots im Bereich Fragen und Antworten hinzufügen im Bereich Fragen und Antworten Ich liebe es, das zu sehen, und das war's. Wir sind bereit zu gehen. Lassen Sie uns also in diesen Node-JS-Code eintauchen. 8. Abschnitt 02 - Was sind Module?: Willkommen im zweiten Abschnitt des ultimativen Node-JS-Kurses. In diesem Abschnitt erfahren wir alles, was wir über Module wissen müssen , z. B. was sind Module? Wie können wir unsere eigenen Module erstellen? Außerdem haben wir einige integrierte Module wie Pfad, Betriebssystem, Dateisystem, DTP-Modul zum Erstellen von Servern und vieles mehr Fangen wir mit den Modulen an. Aber vorher möchte ich Ihnen eine Situation nennen. Im vorherigen Abschnitt haben wir diese Indexpunkt-JS-Datei erstellt. Stellen Sie sich nun vor, dies ist das Began-Projekt von Netflix, das wirklich große Projekt. Dieses Projekt hat viele Funktionen wie Datenbankverbindung, Benutzerauthentifizierung, Zahlungsgateway und viele andere APIs. Stellen Sie sich nun vor, wir fügen gesamten Feature-Code in eine G-Datei mit einem einzigen Indexpunkt ein. Wie werden Sie das schaffen? Oder wenn Ihnen jemand sagen würde, dass Sie ein weiteres Feature in demselben Projekt hinzufügen sollen, dann stellen Sie sich vor, wie verwirrend und schwierig das sein wird. Was ist hier die Lösung? Denk darüber nach. Hier können wir diese Funktionen separat in verschiedenen Dateien erstellen diese Funktionen separat in verschiedenen Dateien und sie dann einfach in die NodeJS-Hauptindex-Datei eingeben Diese verschiedenen kleinen Dateien werden in Node JS als Module bezeichnet Wenn ich Probleme mit der Datenbankverbindung hatte, kann ich zum Datenbankverbindungsmodul gehen und diesen Code unabhängig lösen oder verbessern. Zusammenfassend ist das Modul ein Code , der eine bestimmte Aufgabe ausführt. Stellen Sie sich zum Beispiel vor, Sie bauen ein Auto. Ein Auto hat viele Teile wie Motor, Räder, Bleche usw. Jedes Teil wird separat gebaut und kann auch ersetzt oder repariert werden, und kann auch ersetzt oder repariert werden ohne das gesamte Auto zu beeinträchtigen In Node JS funktionieren Module jetzt ähnlich. Jedes Modul stellt einen anderen Teil unserer Anwendung dar, und diese Module können zusammenarbeiten , um eine vollständige Anwendung zu bilden. Und deshalb sind Module sehr wichtiger Bestandteil von Node JS. Jetzt können wir Module in drei Typen unterteilen. Das erste sind lokale Module. Dies sind die Module , die wir für unsere eigene Anwendung erstellen werden , wie das DB-Modul für die Datenbankverbindung, das Zahlungsmodul für die Zahlungsabwicklung usw. Das zweite sind Kernmodule. Dies sind die eingebauten Module , die wir mit Node JS erhalten. Sie sind bereits in allen Node-Anwendungen verfügbar. Zum Beispiel FS für das Dateisystem, STTP zum Erstellen eines STTP-Servers oder zum Erstellen von STTPRQuests OS für betriebssystembezogene Funktionen Keine Sorge, ich werde Ihnen unsere Kernmodule in den nächsten Lektionen dieses Abschnitts erläutern . Jetzt sind das dritte Modul Module von Drittanbietern. Dies sind die Module, die von anderen Entwicklern erstellt und veröffentlicht wurden. Wenn wir sie verwenden wollen, müssen wir diese Module manuell in unserem Projekt installieren . Zum Beispiel ist Express Dot JS ein Modul eines Drittanbieters, das uns hilft, APIs schnell zu erstellen. Ein anderes Modul ist Mongoose für Mongo Div et cetera. Dies sind Module von Drittanbietern, die von jemand anderem erstellt wurden, und wir können sie auch in unserem Projekt verwenden. Sie sich über all diese Dinge keine Sorgen, wir werden Schritt für Schritt vorgehen und jedes von ihnen lernen. Um es kurz zusammenzufassen, Modul ist ein Code , der eine bestimmte Aufgabe ausführt Wir können sie in separaten Dateien speichern und sie dann in beliebigen anderen Dateien verwenden In der nächsten Lektion werden wir nun unser eigenes Modul erstellen. 9. Eigenes Modul erstellen: Lassen Sie uns unser eigenes benutzerdefiniertes Modul erstellen. Also hier in unserer Anwendung erstellen wir eine neue Datei namens math operations dot js. In diesem Modul werden wir einige grundlegende mathematische Operationen hinzufügen und sie dann in unserer Haupt-Indexpunkt-JS-Datei wiederverwenden. Lassen Sie uns also zunächst eine neue Funktion namens AD erstellen und hier zwei Parameter namens A und B übergeben. Und in dieser Funktion schreiben wir einfach die Addition dieser beiden Parameter, A plus B. Sie fragen sich vielleicht, wie wir diese Funktion in unserer Indexpunkt-JS-Datei verwenden können ? Weil wir alle wissen, wenn wir Funktion innerhalb einer Datei definieren, können wir sie nur in dieser Datei verwenden, nicht außerhalb der Datei. Um diese Anzeigenfunktion also in einer anderen Datei zu verwenden, müssen wir diese Funktion aus diesem Modul für mathematische Operationen exportieren aus diesem Modul für mathematische Operationen und dann können wir sie in eine Indexpunkt-JS-Datei importieren. Aber vorher lass mich dir etwas zeigen. In nodejs haben also alle Dateien ein Objekt, das in diesem Modulobjekt aufgerufen wird. Wir haben viele Eigenschaften, die Informationen über dieses bestimmte Lass mich dir das praktisch zeigen. Nach dieser Funktion schreiben wir einfach Console Dot Log und drucken hier das Modulobjekt aus. Jetzt müssen wir dieses Modul für mathematische Operationen ausführen. Öffnen Sie also das Terminal und schreiben Sie Node, Math und drücken Sie die Tabulatortaste Der Dateiname wird automatisch vervollständigt. Siehst du, hier bekommen wir dieses Modulobjekt mit einer Reihe von Eigenschaften Die erste ist ID, die eindeutige ID für das Modul. Als Nächstes haben wir den Pfad , der der vollständige Pfad unseres Projekts ist. Danach haben wir den Export und es wird auf ein leeres Objekt gesetzt. Sie raten richtig, wenn wir die Funktion add exportieren wollen, dann müssen wir ihre Funktion in diesem Export-Objekt hinzufügen. Danach haben wir den aktuellen Dateinamen mit vollständigem Pfad und einer Reihe anderer Eigenschaften. Wie können wir nun diesem Exportobjekt eine Funktion zum Hinzufügen hinzufügen ? Es ist wirklich einfach. Hier schreiben wir also Module Dot Exports Dot Add, was bedeutet, dass der Eigenschaftsname der Funktion add entspricht Achten Sie darauf, dass wir hier nicht add function aufrufen. Wir fügen hier einfach den Funktionsnamen hinzu. Ich weiß, dass du das für etwas verwirrend hältst, aber glaub mir, das ist es nicht. Lass mich dir das zeigen. Verschieben Sie also einfach dieses Konsolen-Punktprotokoll unter dieses Modul Dot Exports. Speichern Sie diese Datei und im Terminal führen wir diese Datei erneut aus. Sie können im Exportobjekt sehen, dass wir Eigenschaft hinzufügen haben und es auf Funktion hinzufügen eingestellt ist. Wenn Sie also mit demselben Eigenschaftsnamen verwirren, können wir hier auch den Eigenschaftsnamen ändern , wie zum Beispiel Zahlen hinzufügen Speichern Sie diese Datei und lassen Sie uns diese Datei erneut ausführen. Sehen Sie, hier erhalten wir Anzeigennummern und den Eigenschaftsnamen, um eine Funktion hinzuzufügen. Jetzt können wir auch mehr als eine Funktion aus dem Modul exportieren . Also hier erstellen wir eine weitere Funktion namens Sub Track. Auch hier benötigen wir zwei Parameter, A und B, und innerhalb dieser Funktion wir einfach A minus B zurück Können Sie mir nun sagen, wie man diese Funktion exportiert? Richtig, wir schreiben hier einfach Modul Punkt exportiert Punkt subtrahieren entspricht unserer Subtraktionsfunktion . Schau, ob sich das ändert und schau es dir an. Lassen Sie uns diese Datei erneut ausführen. Siehst du, hier wird diese neue Eigenschaft von unserer abstrakten Funktion subtrahiert Es ist auch nicht notwendig, dass wir nur Funktionen aus unserem Modul exportieren können Wir können auch Variablen, Objekte oder Arrays exportieren, im Grunde alles, was wir wollen. Nehmen wir an, wir erstellen hier oben eine Variable namens name. Entspricht, sagen wir, Code plus U und einer anderen Variablen, Glückszahl entspricht, sagen wir, sieben Wenn wir nun nur die Namensvariable exportieren wollen, können wir hier nur den Modulpunkt exportieren hinzufügen , der Punktname entspricht dem Wir müssen die zweite Variable nicht exportieren, wenn wir sie in keiner anderen Datei verwenden wollen Exportieren Sie nur Variablen oder Funktionen , die wir an anderer Stelle in unserer Anwendung verwenden müssen. Jetzt ist hier eine Sache. Diese drei Codezeilen sehen ein bisschen hässlich aus, weil wir Modulpunktexporte wiederholen. Gibt es eine Abkürzung , um das zu schreiben? Ja, lass es mich dir zeigen. Also hier können wir so etwas schreiben. Modul Dot exports entspricht, und hier übergeben wir Objekt und fügen alle Eigenschaften hinzu, die wir exportieren möchten , in diesem einzelnen Objekt Also schreiben wir, addieren, kühlen, Funktion, fügen eine weitere Eigenschaft hinzu, fügen eine weitere Eigenschaft hinzu, substack colon function, substack und wir können den Namen auf den Variablennamen setzen Dieser Code und diese drei Codezeilen funktionieren genauso, weil wir hier Eigenschaften nacheinander festlegen Aber hier setzen wir sie direkt in das Objekt. Lassen Sie uns diese drei Zeilen entfernen. Wir brauchen es nicht. Speichern Sie diese Datei. Lassen Sie uns das Terminal mit CLS löschen und dann dieselbe Datei ausführen und sehen, dass wir hier dasselbe Exportobjekt wie zuvor erhalten Wenn wir also wissen, wann unser Eigenschaftsname und der Name des übergebenen Werts identisch sind, können wir diese Spalte und den Variablennamen entfernen Dieses Hinzufügen bedeutet also Spalte hinzufügen. Genauso wie wir diesen Spaltenabzug und auch den Spaltennamen entfernen diesen Spaltenabzug und auch den Spaltennamen Es gibt also mehrere Möglichkeiten , denselben Code zu schreiben. Speichern Sie das und lassen Sie es uns noch einmal ausführen. Sehen Sie hier, wir erhalten wieder dasselbe Exportobjekt. Jetzt haben wir Eigenschaften im Exportobjekt und können Exportobjekt zugreifen in jeder anderen Datei in diesem Projekt auf dieses Das werden wir in der nächsten Lektion sehen. 10. Zugriff auf Modul in einem anderen Modul: In der vorherigen Lektion haben wir unser Modul für mathematische Operons erstellt und drei Eigenschaften exportiert Lassen Sie mich auch diese Konsolenzeile entfernen. Wir brauchen es nicht. Lassen Sie uns nun sehen, wie wir auf diese Eigenschaften in der Indexpunkt-JS-Datei oder einer anderen Datei zugreifen können diese Eigenschaften in der Indexpunkt-JS-Datei . Lassen Sie uns diesen vorherigen Code entfernen. Wir wollen es nicht. Um nun ein beliebiges Modul in unsere Datei zu importieren, benötigen wir eine Funktion im Knoten Js. Wir rufen diese Funktion hier und innerhalb dieser Funktion in Codes geben wir unseren Modulpfad ein. Da wir also sehen können, dass sich diese beiden Dateien im selben Ordner befinden, können wir hier einen Schrägstrich mit einem Punkt schreiben, aktuellen Ordner darstellt Und hier schreiben wir unseren Dateinamen, math operations dot js Oder wir können diese Punkt-JS-Erweiterung auch entfernen denn wenn wir die Erweiterung nicht mit unserem Modulnamen übergeben , verwendet Nodejs standardmäßig Punkt js als Was ist, wenn wir diese mathematische Operationsdatei im Unterordner haben? Dann müssen wir hier zuerst den Ordnernamen schreiben und dann den Schrägstrichnamen hinzufügen Und wenn wir dieses Modul für mathematische Operationen im übergeordneten Ordner haben , dann verwenden wir hier anstelle von Single Dot Double Mach dir keine Sorgen mit der Übung, das wirst du lernen. Schreiben Sie vorerst einfach mathematische Operationen mit Punkt und Schrägstrich. Diese erforderliche Funktion return exportiert ein Objekt aus diesem Modul, das wir hier interminal bekommen . Lass es mich dir zeigen Hier speichern wir diesen Wert in Variablen, die als mathematische Operationen bezeichnet werden. Sie können jeden anderen Namen verwenden, aber meistens verwenden wir denselben Namen wie dieses Modul. Wir müssen uns also keinen anderen Namen merken, also müssen wir uns keinen anderen Namen merken. Hier betrachten wir einfach die mathematischen Operationen mit Punktprotokollen, speichern die Änderungen und jetzt können wir diese Indexpunkt-JS-Datei ausführen Knotenindex Punkt js. Sehen Sie, hier erhalten wir das Objekt mit drei Eigenschaften , die wir dem Exportobjekt in Mth Operations hinzugefügt haben dem Exportobjekt in Mth Operations Hier an der Stelle einfacher mathematischer Operationen können wir Methoperons mit dem Punkt AD ausführen Und hier übergeben wir Argumente, sagen wir 20 und 30. Speichern Sie diese und lassen Sie uns diese Datei erneut ausführen. Siehst du, hier bekommen wir die Addition von zwei Zahlen. Wir verwenden also erfolgreich eine Funktion aus einem anderen Modul. Sie können sehen, wie einfach es ist, ein Modul zu erstellen und es in anderen Dateien zu verwenden. Wir müssen nur aus diesem Modul exportieren und dann mit require können wir diese Exporte in jeder anderen Datei verwenden. Wir können also andere Eigenschaften wie Methoperons dot Substack oder Methoperons dot Name verwenden Methoperons dot Substack oder Methoperons dot Aber wir können sehen, wann wir eine dieser Eigenschaften verwenden müssen, wir müssen diesen mathematischen Operations-Punkt schreiben Also können wir hier das Javascript-Thema namens Objektdestrukturierung verwenden namens Objektdestrukturierung Wahrscheinlich wissen Sie davon, weil es ein reines Javascript-Thema ist Aber lass uns das schnell sehen. Hier schreiben wir also unser Objekt und wollen seine Eigenschaften als Variablen extrahieren. An der Stelle des Methoperon-Punkts AD müssen wir also nur EdD schreiben Am Anfang schreiben wir hier Cs, jetzt müssen wir geschweifte Klammern verwenden, die unserem Objektnamen entsprechen, was Kannst du dir vorstellen, was wir in diese geschweiften Klammern schreiben müssen in diese geschweiften Klammern schreiben müssen Wir müssen hier den Namen der Eigenschaften schreiben , den wir als Variable aus diesem Objekt extrahieren wollen Wir schreiben hier add, was unsere Funktion ist, subtract, was eine weitere Funktion ist, name, was unsere Variable ist Nun, an der Stelle dieser mathematischen Operationen Punkt ad können wir einfach dieses Hinzufügen verwenden und wir können hier auch den Namen hinzufügen. Speichern Sie diese Datei und lassen Sie uns sie in unserem Terminal ausführen. Siehst du, hier haben wir 50 und unseren Namen. Außerdem verwenden einige erfahrene Entwickler anstelle der Objektumstrukturierung in einer anderen Zeile Objektumstrukturierung in einer anderen Zeile gerne dieselbe Zeile. Also haben sie dieses Objekt einfach von hier bekommen und es einfach an der Stelle eingefügt , an der der Name dieser mathematischen Operation steht. Also brauchen wir diese zusätzliche Zeile nicht, speichern Sie diese Datei und lassen Sie uns sie erneut ausführen. Siehst du, hier bekommen wir das gleiche Ergebnis. Wenn Sie bei dieser objektiven Strukturierung verwirrt sind, können Sie einfach die mathematischen Operationen Punkt und Methode verwenden Es ist völlig in Ordnung. Am Ende des Tages sollte unser Code funktionieren. 11. Übung für eigenes Modul: Jetzt ist es Zeit für ein wenig Übung, damit Sie Module überarbeiten können Hier müssen Sie also in Ihrer Anwendung ein neues Modul namens Logger erstellen in Ihrer Anwendung ein neues Modul namens Logger Und darin müssen Sie zwei Funktionen exportieren. Eine Funktion gibt das aktuelle Datum mit diesem Ausdruck zurück , und eine andere Funktion gibt das aktuelle Jahr mit diesem Ausdruck zurück . Und dann müssen Sie dieses Ergebnis in der JS-Datei mit dem Indexpunkt konsolidieren, genau wie wir es im Modul für mathematische Operationen tun, und unsere Ausgabe sollte so aussehen, probieren Sie es aus und schauen Sie sich dann die Lösung an. Ich hoffe also, dass Sie diese Übung abschließen oder zumindest versuchen, diese Übung zu lösen. Sehen wir uns nun die Lösung an. Zunächst erstellen wir eine neue Datei namens logger dot js. Jetzt müssen wir hier zwei Funktionen hinzufügen. Die erste Funktion ist also das aktuelle Datum, und in der GLY-Klammer wir einfach eine neue Zeichenfolge mit Punkt und zwei Uhrzeiten zurück Lassen Sie uns nun diese Funktion duplizieren, sie auswählen und Shift plus Alter plus Abwärtspfeil oder Shift plus Wahltaste plus Abwärtspfeil drücken Abwärtspfeil oder Shift plus Wahltaste plus Abwärtspfeil Lassen Sie uns den Funktionsnamen in aktuelles Jahr ändern und an der Stelle der beiden Zeitzeichenfolgen schreiben wir get full year. Wissen Sie noch, wie wir diese Funktionen exportieren? Wir verwenden Modulpunktexporte, und hier setzen wir es einfach auf Objekt und darin schreiben wir das aktuelle Datum in die Funktion „Aktuelles Datum und das aktuelle Jahr in die Funktion „Aktuelles Jahr“. Oder wir können sie vereinfachen, indem wir denselben Namen entfernen. Großartig. Also exportieren wir diese Funktionen. Jetzt müssen wir diese Funktionen nur noch in unsere Indexpunkt-JS-Datei eingeben . Also fügen wir oben die erforderliche Funktion hinzu und übergeben hier einfach unseren Modulpfad , der einen Schrägstrich hat, weil sich dieses Modul auch im selben Ordner und Logger befindet Jetzt können wir seinen Exportwert in einer Variablen namens Logger speichern seinen Exportwert in einer Variablen namens Logger Oder, wie wir es in der vorherigen Lektion getan haben, können wir es auf diese Weise destrukturieren Fügen Sie hier Kalibrakets hinzu und sehen Sie, dass wir hier die Eigenschaften für das aktuelle Datum und das aktuelle Jahr erhalten Jetzt, nach dieser Konsole, fügen wir eine weitere Konsole hinzu und rufen hier einfach nacheinander beide Funktionen auf, aktuelles Datum und aktuelles Speichern Sie die Änderungen und lassen Sie uns diese Datei im Terminal ausführen. Es handelt sich um einen Knotenindex-Stuhl, und hier sehen Sie, wie wir unsere Ausgabe erhalten. So können Sie sehen, wie einfach und leicht es ist, unsere eigenen Module zu erstellen und in anderen Modulen darauf zuzugreifen. 12. Verwenden des Pfadmoduls: Bis jetzt haben wir gesehen, wie man mit lokalen Modulen arbeitet. Sehen wir uns nun einige Kernmodule an, oder wir können sagen , Module, die bereits im Knoten JS verfügbar sind. Gehen Sie also zu nodjs.org und öffnen Sie im Header die zugehörige Dokumentation Stellen Sie sicher, dass wir hier eine andere Version und die Ts-Version auswählen, da es sich um die stabile Version handelt Hier erhalten wir alle Informationen über Node JS, wie Simple Object, Console. Außerdem haben wir viele Themen erklärt und wie man sie benutzt. Wir haben einige Kernmodule wie das Dateisystem. Darin erklären sie alle Methoden und Eigenschaften. Außerdem haben wir ein STP-Modul, Betriebssystemmodul, ein Pfadmodul und vieles mehr Hier werden wir einige wichtige Kernmodule sehen , die wir benötigen, um unser Backend zu erstellen Wenn Sie all dies lernen möchten, können Sie diese Dokumentation lesen. In meinem Vorschlag werde ich jedoch alle wichtigen Module behandeln. Beginnen wir mit dem Path-Modul. Das Path-Modul wird verwendet, um mit Datei- und Verzeichnispfaden zu arbeiten. Wenn wir beispielsweise ein hochgeladenes Bild auf unserem Server speichern möchten , können wir diesem Bild mithilfe dieses Pfadmoduls den richtigen Pfad zum Speichern in einem bestimmten Ordner angeben . Wenn Sie also zwei Pfade oder andere pfadbezogene Dinge zusammenführen möchten , können Sie dieses Pfadmodul verwenden. Lass mich dir das zeigen. Sie können hier auch sehen, dass sie uns zeigen, wie wir in unserer Anwendung auf dieses Modul zugreifen können . Genauso wie wir in der erforderlichen Funktion auf unsere lokalen Module zugreifen . Aber an die Stelle des Dateipfads schreiben wir unseren Modulnamen. Also entferne ich in unserer Anwendung einfach diesen Code. Wir brauchen ihn jetzt nicht, hier schreiben wir die Funktion require und in die Codes schreiben wir Knotenspalte und unseren Kernmodulnamen, der Pfad ist. In der vorherigen Knotenversion schreiben wir einfach den Namen des Kernmoduls ohne das Präfix der Knotenspalte. Dies wird auch in der aktuellen Version funktionieren. Ich verwende diese vorherige Syntax, Sie können jede Syntax verwenden, es liegt ganz bei Ihnen. Wie zuvor erfordert diese geschriebene Funktion nun, dass das Objekt aus diesem Pfadmodul exportiert wird. Wir müssen sie in einem variablen Pfad speichern. Jetzt fragen Sie sich vielleicht, warum wir dieses Objekt hier nicht wie zuvor destrukturieren dieses Objekt hier nicht wie zuvor Ja, das können wir auch hier tun, aber wir kennen seine Eigenschaften noch nicht Es ist also besser, hier nicht zu destrukturieren. Lassen Sie mich Ihnen nun einige nützliche Methoden des Pfadmoduls zeigen. Angenommen, wir möchten einige Informationen zu einer bestimmten Datei sehen . Hier haben wir also die Methode zur Analyse von Pfadpunkten und in dieser Analysefunktion, wie wir den vollständigen Pfad unserer Datei übergeben Aber wie können wir den vollständigen Pfad unserer Datei ermitteln? In Node JS haben wir also zuvor gesehen, dass alle Dateien ein Modulobjekt haben, das wir als Modulpunktexporte verwenden. Außerdem haben alle Dateien zwei weitere Variablen. Eine davon ist der Unterstrich, der Dateiname , der den vollständigen Pfad der aktuellen Datei zurückgibt, und der Unterstrich Dname, der der Verzeichnispfad der aktuellen Datei ist Lassen Sie mich Ihnen zuerst diese beiden zeigen. Im Moment kommentiere ich diese Methode zur Pfadeingabe aus und konsolere schnell das Punktprotokoll, den Unterstrich, den Unterstrich, den Dname-Konsolen-Punktprotokoll, den Unterstrich und den Dateinamen . Speichern Sie die Änderungen und lassen Sie uns diese Datei ausführen. Sehen Sie, hier erhalten wir den vollständigen Pfad des aktuellen Verzeichnisses. Verzeichnis bedeutet Ordner, und darunter steht für Underscore DescefName vollständige Pfad mit dem Nun zurück zu unserer Datei, wir entfernen sowohl die Konsole als auch Kommentar von hier, indem wir Strg plus Schrägstrich oder Befehl plus Schrägstrich verwenden plus Schrägstrich oder Befehl plus Schrägstrich und in dieser Parse-Funktion einfach wir entfernen sowohl die Konsole als auch den Kommentar von hier, indem wir Strg plus Schrägstrich oder Befehl plus Schrägstrich verwenden und in dieser Parse-Funktion einfach den Underscredsc-Dateinamen übergeben. Wir erhalten einige Details zu diesem Dateipfad und um das Ergebnis auszudrucken, schließen wir es einfach Gut, speichern Sie die Änderungen und lassen Sie uns diese Datei ausführen. Siehst du, hier bekommen wir dieses Objekt. Zuerst erhalten wir die Root-Eigenschaft, das ist der Stammpfad des aktuellen Pfads. Hier in Windows erhalten wir einen C-Dolon und einen umgekehrten Schrägstrich. Wenn Sie Mac- oder Linux-Benutzer sind, erhalten Sie hier einen Schrägstrich. Als nächstes haben wir DR, das ist der Verzeichnispfad, danach haben wir Base, das ist der letzte Teil dieses Pfads , der Indexpunkt Js ist Danach haben wir EXT als Erweiterung und zuletzt erhalten wir den Namen des letzten Teils, der Index ist. Diese Parch-Methode wird verwendet, um Details über den spezifischen Pfad zu erhalten Sehen wir uns nun eine weitere nützliche Methode des Pfadmoduls an, nämlich Join Angenommen, wir möchten in unserer Datenbank den Pfad speichern, in dem wir unser hochgeladenes Bild wie das Profilbild speichern. Verstehen Sie, dass die Profilbilder in Ihrem Projekt in einem Ordner namens Uploads gespeichert Ordner namens Uploads Hier können wir die Path Dot Join-Methode verwenden. Hier benötigen wir zunächst den Pfad des aktuellen Projekts, und wie können wir diesen Ordnerpfad abrufen? Sollten wir einen Unterstrich und einen Unterstrich für den Dateinamen verwenden? Nein, wir müssen den Unterstrich undisco dirname verwenden. Beim zweiten Argument übergeben wir unseren Ordnernamen , übergeben wir unseren Ordnernamen Wir erhalten einen Pfad zu unserem Projektordner und schließen uns am Ende dieses Projektpfads dem Ordner Uploads an . Mal sehen, was wir bekommen Wir entfernen diese Konsole und speichern diesen Pfad in einer Variablen namens profile Path und die Konsole protokolliert diesen Profilpfad. Speichern Sie diese Datei und lassen Sie uns diese Datei ausführen. Siehst du, hier bekommen wir den vollständigen Pfad. Dieser erste Teil besteht aus einem Unterstrich, lieber Name, und am Ende schließen wir uns dem Ordner Uploads an Ich weiß, das ist etwas verwirrend, aber machen Sie sich keine Sorgen, wenn wir diese Module in unserem Projekt verwenden, das alles wird Sinn Nun, hier fragen Sie sich vielleicht, können wir zwei Teile manuell zusammenfügen? Warum wir Ihr Pfadmodul verwenden müssen. Wie wir wissen, verwendet Windows für einen Dateipfad einen umgekehrten Schrägstrich und Mac- und Linux-Benutzer einen Schrägstrich Wir erhalten also unterschiedliche Ergebnisse in verschiedenen Systemen. Wenn wir den Pfad manuell mit einem umgekehrten Schrägstrich schreiben, können wir auf dem Mac unseren Pfad nicht finden Außerdem ist unser Projekt derzeit lokal verfügbar, und deshalb kennen wir seinen Pfad Aber in der realen Welt stellen wir unsere Backend-Anwendung irgendwo im Internet bereit und wir kennen den Pfad zu diesem Server nicht Daher ist dieses Pfadmodul in einer solchen Situation sehr nützlich 13. Betriebssystemdetails abrufen: Manchmal benötigen wir einige Details unserem Serverbetriebssystem , z. B. welches Betriebssystem es verwendet oder wie viel Speicher es hat usw. Dafür haben wir ein weiteres Kernmodul namens OS, was Betriebssystem bedeutet Also entfernen wir diesen vorherigen Code und können Sie mir sagen, wie wir auf dieses Betriebssystem zugreifen können? Richtig, wir können es mit der Funktion require verwenden und einfach hier den Knoten, die Spalte OS übergeben. Wir können nur OS verwenden. Jetzt können wir das in einer Variablen namens OS speichern. Angenommen, wir möchten hier einen bestimmten Code für das Windows-System und für Mac ausführen , wir möchten etwas anderes ausführen. Hier können wir schreiben, ob die Bedingung eine Punktplattform Dadurch wird der Plattformname zurückgegeben , auf der dieser Code ausgeführt wird. Wenn die st-Plattform Win 32 entspricht und dies zutrifft, werden wir Code für Windows ausführen Im Moment schreiben wir einfach Console Dot Log, hallo, Windowsser Danach wollen wir etwas Code für das Mac-System ausführen. Wir fügen s hinzu und überprüfen, ob die Punktplattform Dawn entspricht. Dies ist der Plattformname für macOS. Darin führen wir Console Dot Log aus, hallo McUser. Endlich übergeben wir einfach ls und Consol dot log Hellouser. Prüfen Sie, ob das funktioniert oder nicht. Sehen Sie sich die Änderungen an und werfen Sie einen Blick darauf. Siehst du, hier bekommen wir Hello Windows User, also funktioniert es. Jetzt haben wir im OS-Modul viel mehr Eigenschaften. Ich möchte Sie nicht langweilen, indem ich alle Eigenschaften erkläre , denn das wird viel Zeit in Anspruch nehmen. Aber lassen Sie mich Ihnen zwei weitere nützliche Eigenschaften des OS-Moduls erklären . Erstens können wir mit diesem Betriebssystemmodul den Gesamtspeicher des Betriebssystems abrufen . Also nicht die Gesamtanzahl MM für den Arbeitsspeicher, und wir können sie einfach mit dem Punktprotokoll der Konsole ausdrucken. Außerdem haben wir eine weitere Eigenschaft namens free MM, um den freien Speicher zu erhalten. Also duplizieren wir diese Zeile mit Shift plus Alter plus Abwärtspfeil oder Shift plus Wahltaste plus Abwärtspfeil und ändern diese gesamte MM-Funktion mit FreeMM Speichern Sie die Änderungen und schauen Sie sich das an. Siehst du, hier bekommen wir das Gedächtnis in Bissen. Ich habe insgesamt acht GB Speicher und der freie Speicher beträgt fast zwei GB Sie können sehen, dass dies die Bedeutung von Node JS ist. Vor Node JS können wir mit einfachem JavaScript diese Art von Details nicht abrufen. So wird das OS-Modul verwendet um Informationen über das Betriebssystem abzurufen. 14. Dateisystemmodul: Es gibt ein weiteres beliebtes Kernmodul , das wir für die Interaktion mit Dateien verwenden. Mit dem Dateisystem oder dem FS-Modul können wir beispielsweise die Datei schreiben, lesen , die Datei aktualisieren und auch eine bestimmte Datei löschen. Also hier in der Knotendokumentation öffnen wir das Dateisystemmodul. Wir können sehen, dass es so viele Methoden und Eigenschaften hat. Lassen Sie mich Ihnen zeigen, wie wir das FS-Modul verwenden können. Lassen Sie uns diesen vorherigen Code entfernen. Mach dir keine Sorgen. Ich werde den ganzen Code in einer separaten Datei hinzufügen , damit Sie ihn sich später ansehen können. Hier wollen wir auf das Kernmodul zugreifen, benötigen den Code Fs und speichern ihn in einer Variablen namens Fs. Jetzt schreiben wir einfach Fs dot und sehen hier, dass wir die Liste aller Methoden bekommen. Aber was ist das? All diese Methoden haben zwei Varianten. Bei der einen handelt es sich um synchrone oder blockierende Methoden und bei der anderen um Methoden ohne Synkyword, und bei der anderen um Methoden ohne Synkyword was asynchron oder nicht blockierend bedeutet Wie wir wissen, ist Node aufgrund seiner asynchronen oder blockierenden Methode beliebt seiner asynchronen oder blockierenden Wir müssen in Node js immer asynchrone Methoden verwenden. Node gibt uns der Einfachheit halber eine synchrone Methode. Lass mich dir eins nach dem anderen beide zeigen. Hier wollen wir die Liste der Dateien abrufen , die wir im aktuellen Ordner haben. Dafür haben wir eine Methode namens read directory sync, und hier übergeben wir den Pfad des Verzeichnisses, das wir lesen möchten. Punktstrich, das ist das aktuelle Verzeichnis, und wir speichern diese Daten in einer Variablen namens data Und am Ende protokollieren wir diese Daten einfach. Speichern Sie die Änderungen und lassen Sie uns sehen, was wir hier bekommen. Siehst du, hier bekommen wir die Liste aller Dateien in diesem Ordner. Lassen Sie uns nun auch sehen, wie wir die Methode Asynrns verwenden können. Also als rotes Punktverzeichnis und wie zuvor übergeben wir an der ersten Position unseren Verzeichnispfad, bei dem es sich um einen Punkt mit einem Schrägstrich handelt Jetzt müssen wir bei fast allen asynchronen Methoden das zweite Argument übergeben, nämlich die Callback-Funktion, also die Funktion, die ausgeführt wird wenn diese asynchrone Arbeit abgeschlossen Und das können wir auch in Vorschlägen sehen . Jetzt gibt es zwei Möglichkeiten für alle asynchronen Arbeiten Wir erhalten eine Fehlermeldung oder wir schließen diese Arbeit erfolgreich ab. Ich weiß, dass das ein bisschen verwirrend ist, wenn Sie aus Zeitgründen mit asynchroner Arbeit zu tun haben, aber machen Sie sich keine Sorgen in den nächsten Abschnitten, ich habe einen vollständigen Abschnitt für asynchrones Sie werden all dies ausführlich lernen. Jetzt erhalten wir in dieser Funktion an der ersten Position einen Fehler und beim zweiten Parameter erhalten wir unsere Daten. Wenn wir einen Fehler erhalten, erhalten wir in diesen Daten Null. Und wenn wir unsere Daten erhalten, erhalten wir bei diesem Fehler Null. Um mit diesem Szenario fertig zu werden, können wir ihre Bedingung erfüllen. Wenn ein Fehler vorliegt, werden wir den Fehler protokollieren. Da wir unsere Daten per Konsole protokollieren werden. So einfach ist das. Lassen Sie uns nun diese Konsole für die synchrone Methode auskommentieren für die synchrone Methode Speichern Sie die Änderungen und schauen Sie sich das an. Siehst du, hier bekommen wir wieder die gleichen Daten. Wenn Sie nun überprüfen möchten, ob wir einen Fehler erhalten oder nicht, können wir diesen Pfad in einen anderen ändern, diesen speichern und diese Datei erneut ausführen. Siehst du, hier bekommen wir die Fehlermeldung, keine solche Datei oder kein solches Verzeichnis. Jetzt verstehst du also, wie diese Schauspielmethoden funktionieren. Sie sich auch keine Sorgen über diese Komplexität , da wir diese Kernmodule in unserem Projekt kaum verwenden. Derzeit zeige ich Ihnen nur Module, und dieses Dateimodul ist für diese Phase noch wenig fortgeschritten. Also mach dir darüber keine Sorgen. Sie werden es beherrschen, wenn wir sie in unseren Projekten verwenden. 15. Erstellen eines Servers mit HTTP-Modul: Sehen wir uns eines der wichtigsten Kernmodule von Node JS an, das SDTP-Modul SDDP-Modul ermöglicht es uns, einen SDDP-Server zu erstellen und auch verschiedene SDDPRQuests Wie wir wissen, wird NodeJS verwendet, um ein Backend für unsere Client-Anwendung zu erstellen. Derzeit greifen wir jedoch nur in unserem Derzeit greifen wir jedoch nur Terminal auf dieses Backend zu. Was ist, wenn unser Frontend auf unser Backend zugreifen möchte? Um also mit dem Web in Node zu interagieren, haben wir das SDDP-Modul Lassen Sie mich Ihnen direkt zeigen, wie wir einen Server erstellen können. Also wie zuvor, greifen mit der erforderlichen Funktion auf das STDP-Modul zu und übergeben Sie hier SDDP und speichern Sie das in Können Sie mir jetzt sagen, was für dieses STDP-Modul geschrieben wurde? Ich werde die SDDB-Methode zurückgeben. Nun, dieses STDP hat eine Methode namens Create Server, die verwendet wird, um Server für unsere Backend-Anwendung zu erstellen Was werden wir nun in dieser Servererstellungsfunktion übergeben? Einfach, hier übergeben wir die Callback-Funktion. Wenn jemand Anfragen an unseren Server sendet, wird diese Callback-Funktion Lass mich dich etwas fragen. Was ist die Hauptaufgabe unseres Servers? Wenn der Benutzer also eine Anfrage an den Server sendet, muss der Server die Antwort entsprechend der Datenanforderung zurückgeben. Hier in unserer Serverfunktion benötigen wir also die Informationen über die Benutzeranfrage, für welche API er oder sie anfordert usw. Also hier, in diesem Funktionsargument, erhalten wir das Anforderungsobjekt, das die Details der Benutzeranfrage enthält Jetzt haben wir hier Informationen zur Anfrage. Unser Server führt also seinen Prozess durch und nehmen an, wir möchten die Antwort als Hello World-Nachricht zurückgeben. hier im Funktionsargument eine Antwort zu senden, erhalten wir hier ein Antwortobjekt nach diesem Anforderungsobjekt. Außerdem schreiben viele Entwickler gerne einen Kurznamen, Rg für Anfrage und Rs für Antwort Um die Hello World-Nachricht zurückzugeben, schreiben wir den Antwortpunkt R. Und in Codes geben wir unsere Nachricht Hello World In der realen Welt werden wir Daten von hier zurückgeben. Im Moment schreiben wir nur eine Nachricht, Moment schreiben wir nur wenn jemand eine Anfrage auf den Server sendet. Und hier müssen wir auch sagen, dass diese Antwort hier beendet ist. Also schreiben wir Antwort Punkt N. Dadurch wird sichergestellt, dass unser Antwortprozess hier beendet ist. Jetzt erstellen wir hier unseren Server, aber wir müssen diesen Server auf einem Port starten. Wenn Sie nicht reagieren, läuft unsere Anwendung auf dem lokalen Host 5173, falls er von y erstellt wurde. Jetzt müssen wir diesen Server auch auf einem Port starten Mal sehen, wie wir das machen können. Hier dieser Punkt Servermethode erstellen, unser Serverobjekt zurückgeben, wir speichern es in einer Variablen namens Server Und danach schreiben wir unten den Serverpunkt LISN Und in dieser Funktion übergeben wir unseren Port, auf dem wir diesen Server starten wollen Viele Entwickler betreiben Server gerne auf 5.000 oder 3.000. Sie können jedoch einen beliebigen Port angeben Stellen Sie sicher, dass dieser Port in Ihrem System nicht verwendet wird. Hier verwende ich gerne 3.000. In der realen Welt, wenn wir unseren Server bereitstellen, wird dieser Port durch unseren Bend-Domainnamen wie catwis.com oder tasrag dotben.com usw. ersetzt catwis.com oder tasrag dotben.com In dieser Funktion können wir auch eine weitere Callback-Funktion übergeben wir Diese Funktion wird ausgeführt , wenn unser Server erfolgreich gestartet wurde Hier schreiben wir einfach Consol Dot Log Server Start Listening auf Port 3.000 Speichern Sie die Änderungen und lassen Sie uns diesen Code ausführen , denn wenn dieser Code nicht ausgeführt wird, wird der Server den Knotenindex Dot JS erstellen Siehst du, hier fangen wir den Server an, auf Port 3.000 zu lauschen. Wenn Sie einen Mac verwenden und Port 5.000 verwenden, erhalten Sie möglicherweise die Fehlermeldung, dass der Port 5.000 bereits verwendet wird, da auf dem Mac ARP-Empfängerumfragen auf diesem Port ausgeführt Sie können einen anderen Port wie 5.001, 5.002 oder sogar 3.000 verwenden Es gibt keine Regel für die Portnummer, solange der Port bereits von einem anderen Dienst auf unserem System verwendet wird Um dies zu überprüfen, müssen wir Anfragen an diesen Port senden. Öffnen Sie also einen Browser und schreiben Sie hier einfach URL, Local Host Column 3.000 oder Ihre Portnummer. Siehst du, hier bekommen wir unsere Botschaft, Hello World. Also haben wir erfolgreich unseren Server erstellt und auch diesen Server gestartet. Wenn also jemand Anfragen an den Server sendet, wird diese Funktion ausgeführt und diese Nachricht einfach gedruckt. 16. Umgang mit verschiedenen Routen: Derzeit senden wir Anfragen auf der Portrout-Route, was soviel wie Home-Route bedeutet. In der Realität können Benutzer jedoch Anfragen an den lokalen Host senden . Spalte 3.000 Schrägstrich Über uns oder Schrägstrich zu Wir müssen also auch diese verschiedenen Routen auf unserem Server verwalten diese verschiedenen Routen auf unserem Und für die Bearbeitung verschiedener Routen benötigen wir zunächst Informationen, für welche Route der Benutzer eine Anfrage sendet. Und dafür haben wir hier ein Objekt angefordert. Wir schreiben hier die Bedingung, dass ich anfordere Punkt-URL in Codes entspricht, Schrägstrich Dieser einfache Schrägstrich steht für die Root-Route. In den CL-Klammern können wir diese Antwortfunktion einfach mit einem Punkt verschieben, können wir diese Antwortfunktion einfach mit einem Punkt verschieben wobei Alter oder Option zurückgehalten werden und der Pfeil nach oben Danach wollen wir uns, sagen wir, mit der Route befassen Hier fügen wir also URL der Anfrage mit dem Punkt in den Codes about entspricht , und wenn sie wahr ist, geben wir einfach eine weitere Nachrichtenantwort mit Punkt rechts zurück Es geht um die Route. Auf diese Weise können wir so viele Anfragen hinzufügen, wie wir möchten. Und nach allen Routen werden wir weiterleiten, was bedeutet, dass Benutzer Routen übergeben, was hier nicht behandelt wird. Und deshalb geben wir hier die einfache Antwort Punkt rechts zurück , Route nicht gefunden. Stellen Sie außerdem sicher, dass diese Antwortpunktfunktion ganz am Ende dieser Serverfunktion aufgerufen wird. Speichern Sie die Änderungen und kehren Sie zu unserem Browser zurück. Wenn wir unsere URL in Schrägstrich ändern, können Sie mir sagen, was wir hier bekommen werden? Lass uns sehen Siehst du, hier bekommen wir dieselbe Hallo-World-Nachricht , weil in unserem Terminal immer noch unser alter Code läuft , in dem wir keine Routen verarbeitet haben. Um diesen neuen Code auszuführen, müssen wir unsere Anwendung erneut ausführen. Im Terminal beenden wir zuerst die Anwendung, indem wir sowohl unter Windows als auch unter Mac Strg plus C drücken. Danach führen wir erneut Node Index Dot JS aus. Gut, wir kommen hierher, Server fangen an, den Port abzuhören, und wenn wir im Browser unsere Seite aktualisieren, sehen Sie, jetzt bekommen wir hier eine Nachricht. Hier geht es um die Route. Und wenn wir versuchen, andere Routen anzufordern, dann bekommen wir hier, dass die Route nicht gefunden wurde. So behandeln wir verschiedene API-Routen mithilfe des SGDP-Moduls Stellen Sie sich nun vor, wir haben 20 verschiedene API-Routen und um sie zu handhaben, müssen wir 18 weitere SF-Blocks schreiben Und wenn all diese Routen Hunderte von Codezeichen enthalten, wird die Verwaltung unseres eigenen Servers sehr chaotisch In der realen Welt werden wir dieses SDDP-Modul also nicht verwenden. Oder dass wir ein sehr beliebtes Drittanbieter-Modul namens Express haben und Express viel mehr Vorteile bietet als dieses SDTP-Modul Mit Express können wir unsere Routen auch in verschiedene Dateien aufteilen, sodass wir nicht verwirrt werden, wenn wir Aktualisierungen vornehmen oder neue Funktionen hinzufügen möchten Ich erkläre all diese Module damit Sie kaum verstehen, wie Node funktioniert, und Sie sich mit einer gewissen JavaScript-Syntax vertraut machen . Ich hoffe, Ihnen gefällt dieser Abschnitt, sehen uns im nächsten Abschnitt. 17. Abschnitt 03 - NPM Einführung: Kommen Sie zum dritten Abschnitt der ultimativen Node-JS-Ergebnisse. In diesem unterhaltsamen kleinen Abschnitt werden wir alles über den Node Package Manager oder kurz NPM Was ist also der Node Package Manager? Node Package Manager ist ein Tool, das uns hilft , Pakete oder Bibliotheken für unser Node-Projekt zu verwalten. In einfachen Worten, NPM ist wie ein großes Lagerhaus für Entwickler In diesem Warehouse speichern Entwickler ihren JavaScript-Code, sodass andere Entwickler diesen Code durchsuchen und den wiederverwendbaren Code in ihr Projekt herunterladen können und den wiederverwendbaren Code in ihr Projekt herunterladen Lass mich dir das zeigen. Also geh rüber zu NPM JS.com. Hier können wir unseren Paket- oder Bibliotheksnamen suchen Paket oder Bibliothek bedeutet einen wiederverwendbaren Code. Im vorherigen Abschnitt habe ich Ihnen beispielsweise gesagt, dass wir Express Library für die Erstellung eines STD-Servers verwenden werden . Sehen Sie, hier erhalten wir viele Ergebnisse für diese Suche. Wir öffnen einfach dieses Express-Paket. Auf der linken Seite finden wir grundlegende Dokumentation, wie man es benutzt usw., und auf der rechten Seite erhalten wir Informationen über das Paket Zuallererst erhalten wir oben den Installationsbefehl, den Sie in der nächsten Lektion sehen werden Als Nächstes haben wir einen Link zum Github-Repository, damit wir den Code sehen können und wir erhalten auch einen Link zu ihrer offiziellen Website. Hier können wir sehen, dass dies die monatlichen Downloads dieses Pakets sind. Daran können wir die Beliebtheit dieses Pakets erkennen. Außerdem erhalten wir Versionsinformationen und viele andere Dinge. Auf NPM erhalten wir also Pakete für fast alle Funktionen, die wir unserer Anwendung hinzufügen möchten Und das Tolle ist, dass wir alle Pakete kostenlos nutzen können Es gibt also Premium-Pakete, aber es kommt selten vor, dass wir Pakete kaufen. Eigentlich habe ich bis jetzt kein Paket gekauft. In diesem Abschnitt werden wir also Befehle zur Installation verschiedener Pakete sehen . Außerdem wurden Pakete deinstalliert, die Entwicklerabhängigkeit installiert , einige Pakete aktualisiert usw. In diesem einen kleinen Abschnitt werden Sie sich also mit NPM-Befehlen vertraut machen und Sie werden nicht verwirrt Sie sind extrem einfach und leicht. Beginnen wir also mit diesem Abschnitt. 18. Paket erstellen: Wie wir in der vorherigen Lektion gesehen haben, verwenden wir in unserem Projekt so viele Pakete, wie wir möchten. Wenn wir nun ein Paket installieren, enthält dieses Paket eine Reihe von Dateien und Ordnern, die wir in unser Projekt herunterladen und in einem Ordner namens Node Modules speichern. Stellen Sie sich jetzt vor, wir installieren zehn oder 20 Pakete in unserer Anwendung. All diese Dateien werden in diesem Knotenmodulordner gespeichert. Wenn wir unser Projekt teilen oder unser Projekt auf Github hochladen möchten, laden wir diesen Knotenmodulordner nicht hoch , da dies die Projektgröße und auch die Anzahl der Dateien erhöht. Wir laden also keinen Ordner mit Knotenmodulen hoch. Jetzt fragen Sie sich vielleicht, ob wir diesen Knotenmodul-Ordner nicht mit jemandem teilen, woher er weiß, welche Pakete er installieren muss. Um dieses Problem in unserem Node-Projekt zu lösen, werden wir eine Datei namens package dot JCN erstellen In dieser Datei speichern Knoten alle wichtigen Informationen über unser Projekt Wann immer wir anfangen, an einem Knotenprojekt zu arbeiten, wir in erster Linie erstellen wir in erster Linie verpackte Gs und Dateien für unser Projekt. Lassen Sie uns sehen, wie wir eine Paket-Gn-Datei erstellen können. Also hier erstelle ich einen neuen Ordner namens NPM Dash Commands und öffne diesen Ordner in Vis-Code Gut. Hier müssen wir zunächst eine Paket-GSN-Datei dafür erstellen, wir öffnen unser Terminal mit Control Plus Batak und hier schreiben wir NPM, und hier schreiben wir NPM, init Sehen Sie, dieses Hilfsprogramm führt Sie Schritt für Schritt durch die Erstellung einer Unten fragt es nach unserem Projektnamen. Wenn du es ändern möchtest, kannst du hier einen neuen Namen schreiben, aber achte darauf, dass du Kleinbuchstaben verwendest und auch kein Leerzeichen verwendest. Ich bin mit diesem aktuellen Namen zufrieden, also drücke ich einfach die Eingabetaste. Danach wird nach dem Versionsnamen gefragt. Auch hier möchten wir diesen Standardwert nicht ändern , also drücken wir die Eingabetaste. Jetzt können wir hier unsere Anwendungsbeschreibung schreiben. Im Moment überspringe ich das einfach. Als Nächstes haben wir den Einstiegspunkt , der der Standarddateiname unseres Projekts ist. Wenn wir also unsere Anwendung bereitstellen , weiß diese Plattform, welche die Hauptdatei unserer Anwendung ist. Danach haben wir den Testbefehl, Git-Repository, dann das Schlüsselwort, den Autor und die Lizenz. Drücken Sie die Eingabetaste für all das und sehen Sie hier, dass wir dieses Objekt erhalten, das dem Paket zu jcnFle hinzugefügt wird . Es fragt, ist das okay Wenn Sie mit diesen Angaben einverstanden sind, können wir hier einfach y oder ja schreiben . Und fertig. Siehst du, hier bekommen wir das Paket jsnFle in unserem Projektordner. Wenn Sie diese Datei öffnen, sehen Sie, hier bekommen wir dieses Objekt mit Anwendungsdetails und in Zukunft können wir diese Details auch ändern Nun, wenn Sie wenig aufpassen, als wir die GSN-Paketdatei beantworten , wir eigentlich nichts geändert und müssen trotzdem all diese Fragen durchgehen Gibt es dafür eine Abkürzung? Die Antwort lautet ja, wir haben die Abkürzung zum Erstellen von Paketen und Dateien. Lassen Sie uns hier das aktuelle Paket Gs und die Datei löschen. Im Terminal haben wir zuvor NPM hineingeschrieben Damit müssen wir all diese Fragen beantworten. Aber wenn wir diese Fragen überspringen wollen, dann schreiben wir hier NPM rein Y für alle, ja Und fertig. Siehst du, wir bekommen das Paket dsnFle in nur einer Sekunde wieder Und auch das Objekt ist dasselbe. Zusammenfassend lässt sich sagen, dass wir, wenn wir ein neues Nodejs-Projekt starten , zunächst die Paket-Gn-Datei mit dem Befehl NPM init erstellen müssen Paket-Gn-Datei mit dem Befehl NPM 19. Paket im Projekt installieren: In der vorherigen Lektion habe ich Ihnen gesagt, diese Paket-GSN-Datei Anwendungsinformationen mit der Paketliste enthält, aber wir können hier keinen Paketnamen sehen Das liegt daran, dass wir in unserer Anwendung noch keine Pakete installiert Lassen Sie uns also einige Pakete installieren. Dafür müssen wir einen Befehl im Terminal ausführen . Ist wirklich einfach. Wir müssen nur NPM install schreiben, oder wir können hier die Abkürzung verwenden, was nur I Space ist Hier schreiben wir unseren Paketnamen, sagen wir Express. Außerdem erhalten Sie diesen Befehl auf der Seite dieses Pakets auf der NPM-Website Sie können auch davon kopieren, und hier drücken wir die Eingabetaste In unserem Projektordner finden wir einen Ordner mit Knotenmodulen, in dem alle Pakete von Drittanbietern ihre Dateien und Ordner speichern. Und wenn wir das öffnen, sehen Sie, hier bekommen wir viele Ordner und viele Dateien. Sie sich darüber keine Sorgen, denn in der realen Welt öffnen wir diesen Ordner nie. Entweder wir erstellen diesen Ordner, wir löschen diesen Ordner, aber wir öffnen diesen Ordner nie, machen Sie sich keine Sorgen. Danach erhalten wir auch den Paketprotokollpunkt jsnFle. Packageog dot jsnFle wird verwendet, um Abhängigkeiten bis zu einer bestimmten Versionsnummer zu protokollieren Mit anderen Worten, der Paketprotokollpunkt jsnFle stellt sicher, dass alle Entwickler und auch das Bereitstellungssystem dieselbe Version des Pakets verwenden , um Probleme Machen Sie sich darüber auch keine Sorgen. Wir fassen diese Datei kaum an. Und wenn wir im Paketpunkt jcnFle hier unten sehen , erhalten wir eine neue Eigenschaft namens dependencies, und darin erhalten wir all unsere Abhängigkeiten mit ihrer Version Abhängigkeiten sind das, wovon unsere Projekte abhängen. Ohne diese Pakete kann unsere Anwendung nicht funktionieren, und deshalb haben wir sie Abhängigkeit genannt. Dies ist die Version unseres Express-Pakets. Wenn wir ein anderes Paket installieren, wird dieses Paket mit seiner Version in diese Abhängigkeitsliste aufgenommen Jetzt ist diese Version die neueste Version , die Entwickler auf der NPM-Website bereitstellen Aber manchmal führen Entwickler versehentlich eine fehlerhafte Version oder eine neue Version ein und führen eine neue Syntax ein In diesem Fall können wir auch eine ältere Version eines beliebigen NPM-Pakets installieren ältere Version eines beliebigen NPM-Pakets Also hier auf der rechten Seite haben wir Version Stab. Sehen Sie, hier können wir die vollständige Geschichte dieses Pakets sehen. Wir können jedes dieser Pakete installieren. Angenommen, wir möchten diese Version 4.18 0.1 installieren. Also klicken wir auf diese Version. Es wird seine Homepage für diese spezielle Version öffnen. Und wir können hier sehen, dass die Version geändert wurde und auch der Installationsbefehl geändert wurde. Sie fügen AdSign hinzu und danach schreiben sie eine Paketversion, so einfach ist das Also zurück zum VS-Code hier, unsere aktuelle Version ist diese Jetzt kopieren wir diesen Befehl von dieser Site und fügen ihn einfach in unser Projektterminal ein und drücken die Eingabetaste. Die C-Version wurde geändert. So installieren wir Pakete mit dem Befehl NPM I package name Außerdem können wir hier mehrere Paketnamen hinzufügen. Und wenn wir eine bestimmte Version installieren wollen , schreiben wir NPM, Paketname an die rote Versionsnummer, und das war's So einfach ist es, ein Paket im Knotenprojekt zu installieren. Und nach der Installation der Pakete können wir sie in allen JavaScript-Dateien dieses Projekts verwenden . 20. Pakete deinstallieren: Lassen Sie uns nun sehen, wie das Paket deinstalliert wird. Aber vorher installieren wir ein anderes Paket namens Mongo DB Sag mir, welchen Befehl wir verwenden. Wir verwenden NPM install oder I und schreiben dann unseren Paketnamen Mongo DB Du machst das wirklich großartig. In diesem Paketpunkt jcnFle können Sie ein anderes Paket in der Abhängigkeit sehen Lassen Sie uns versuchen, dieses Paket zu deinstallieren. Dafür müssen wir NPM schreiben, deinstallieren oder wir haben auch eine Abkürzung dafür, nämlich UN Dann schreiben wir unseren Paketnamen, der Mongo DV ist. Dieser Befehl macht zwei Dinge. Zunächst werden die jeweiligen Paketdateien und Ordner aus dem Knotenmodulordner entfernt die jeweiligen Paketdateien und . Zweitens werden die Konfigurationsdateien aktualisiert, das Paket JSN und das Packslogt Json Auf diese Weise installiert unsere Anwendung in Zukunft keine unnötigen Pakete 21. Paket als Entwicklerabhängigkeit installieren: Manchmal möchten wir in unserem Projekt ein Paket nur zur Verwendung in der Entwicklungsumgebung installieren , nicht in der Produktion. Zum Beispiel haben wir einige Testpakete, mit denen wir unsere Code-Implementierung getestet haben. benötigen wir keine Testpakete In unserer Produktionsumgebung benötigen wir keine Testpakete. Dadurch wird die Servergröße unnötig erhöht. Im Node Jazz können wir Pakete in der Entwicklerabhängigkeit oder kurz in der Dave-Abhängigkeit installieren , was bedeutet, dass das Paket nur in unserer Entwicklungsumgebung hinzugefügt wird , nicht in der Produktionsumgebung. Lassen Sie uns also in unserer Anwendung ein Testpaket als Do-Abhängigkeit installieren . Dafür schreiben wir NPM. Hier schreiben wir unseren Paketnamen, der Mocha ist. Dies ist der normale Befehl zur Installation des Pakets. Um das Paket als Do-Abhängigkeit zu installieren, müssen wir hier die Option d s Dev hinzufügen und die Eingabetaste drücken. Lassen Sie uns das jetzt überprüfen. Wenn Sie den Paketpunkt jcnFle unten eingeben, können wir die Abhängigkeiten der Entwickler sehen, und darin haben wir unser Paket mit Wir können alle Pakete als Dev-Abhängigkeiten installieren, wir müssen Dev am Ende des Installationsbefehls verwenden Denken Sie jedoch daran, dass dies nur zur Entwicklungsumgebung hinzugefügt wird. Wenn wir DV-Abhängigkeitspakete deinstallieren möchten, verwenden wir außerdem denselben Befehl , den wir in der vorherigen Lektion gesehen haben, NPM Uninstall oder UN-Paketname, nämlich Mocha . Und fertig. 22. Veraltete Pakete und deren Aktualisierung: Sehen wir uns einige nützliche Befehle von NPM an. Manchmal installieren wir in unserer Anwendung einige Pakete, die möglicherweise veraltet sind, und NPM hat eine neuere Version In diesem Abschnitt installieren wir beispielsweise eine frühere Version des Express-Pakets Wie können wir nun feststellen, für welche Pakete Updates verfügbar sind? Dafür haben wir einen Befehl in NPM, der veraltet ist. Wir schreiben NPM veraltet und drücken die Eingabetaste. Und sieh mal, hier bekommen wir die Liste. Wir haben den Paketnamen. Ist die aktuelle Version, gesucht bedeutet neueste Version des Pakets , die dem Versionsbereich entspricht. Aktuelle Version, das ist die neueste Tabellenversion dieses Pakets, Speicherort, was der Speicherort dieses Pakets ist, das sich im Express-Ordner befindet, der kein Modul ist. Schließlich hängt es davon ab, welches Projekt oder welche Abhängigkeit von diesem Paket abhängt. Auf diese Weise können wir schnell erkennen , welche Pakete in unserem Projekt veraltet sind. Derzeit erhalten wir nur ein Paket, aber stellen Sie sich vor, wir arbeiten an alten großen Projekt und hier bekommen wir viele veraltete Pakete. Lassen Sie mich nun, um das zu demonstrieren ein anderes Paket mit einer älteren Version installieren. Wir schreiben NPM install Mongo Debi mit der Rate 4.14 0.0. Gut. Jetzt führen wir wieder den veralteten Befehl NPM Siehst du, hier bekommen wir unsere beiden Pakete. Jetzt fragen Sie sich vielleicht, warum sich die gewünschte Version und die neueste Version unterscheiden? Was bedeutet das? Wie ich Ihnen bereits sagte, wollte ich Spaltenquellen, das ist die neueste Version des Pakets, die dem Versionsbereich entspricht. Derzeit haben wir Version 4.14 0.0 in unserem Projekt. Es bezieht sich nur auf Version vier auf den Versionsbereich. Zum Beispiel 4.15 0.1, 4.16 0.0, 4.17 0.1 usw. Dieser Versionstyp ist der Versionsbereich für 4.14 Aber Sie fragen sich vielleicht, was ist das Problem, unsere Version auf 6.15 0.0 Lets zu aktualisieren ? Das können wir machen Aber wenn Entwickler die Versionsnummer wie Version vier auf Version fünf oder Version sechs ändern , dann haben sie möglicherweise einige Updates vorgenommen, die zu Fehlern für alten Code gemäß Version 4.14 0.0 führen können zu Fehlern für alten Code gemäß Version 4.14 0.0 Aus diesem Grund aktualisieren wir unser Paket immer auf diese gewünschte Version, nicht auf die neueste Version Auf diese Weise werden wir unsere Anwendung nicht beschädigen. Jetzt wollen wir all diese veralteten Pakete in einem Rutsch aktualisieren . Wir haben einen weiteren Befehl zum Aktualisieren veralteter Pakete. Der Befehl lautet NPM Update. Das ist es Es wird alle Pakete innerhalb des angegebenen Bereichs auf die neueste Version aktualisieren , aber es werden keine Package Dot Json- und Packago Json-Dateien aktualisiert Package Dot Json- und Packago Json-Dateien Sehen Sie, im Paket GSN haben wir immer noch unsere alte Version namens Express-Paket Bis wir das Paket dot JSN oder das Packagelot jcnFle aktualisieren , macht es keinen Sinn Es ist notwendig, wir müssen das Paket Dogs und die Datei aktualisieren. Dafür verwenden wir ein anderes auf NPM hochgeladenes Paket, nämlich NPM Check Updates Wir schreiben NPM, I und hier fügen wir G hinzu, um dieses Paket global in unserem System zu installieren In den anderen Knotenanwendungen müssen wir dieses Paket nicht installieren Es wird weltweit in unserem System verfügbar sein. Hier schreiben wir unseren Paketnamen , der NPM Check Updates lautet Stellen Sie sicher, dass Sie denselben Namen mit einem Bindestrich und nicht mit einem Unterstrich schreiben denselben Namen mit einem Bindestrich und nicht mit einem Unterstrich Wenn Sie MG verwenden, müssen Sie außerdem zu Beginn dieses globalen Befehls ein Pseudo-Präfix hinzufügen Andernfalls erhalten Sie eine Fehlermeldung und geben anschließend Ihr Systemkennwort Jetzt können wir einfach NPM Check Updates ausführen. Siehst du, es überprüft den Paketpunkt jcnFle und sagt, dass unsere Express- und Mongo-DB Hier wird die neueste Version angezeigt , aber wir möchten unser Paket mit der gewünschten Version aktualisieren Also müssen wir hier NCU schreiben, was die Abkürzung für NPM Check Updates ist T für Target. Wir zielen auf kleinere Versionen ab, das sind die gewünschten Versionen. Dadurch werden nur Hauptversionen zurückgegeben. Siehst du, hier bekommen wir die gewünschte Version für beide Pakete. Ebenfalls unten wird vorgeschlagen, NCT minor auszuführen, um Paket J und Datei zu aktualisieren Wir führen NPM Check Updates aus, oder wir können NT, Minor schreiben und die Eingabetaste drücken C, es hat die Version in den Paketen und der Datei geändert. Auch hier wird vorgeschlagen, NPM install auszuführen , um neue Versionen zu installieren Wir schreiben NPM install oder NPM I und drücken Enter und fertig. Alle unsere Pakete sind aktualisiert diese Weise identifizieren wir veraltete Pakete und aktualisieren Pakete auf den neuesten Stand. Damit unsere Anwendung nicht durch eine neue Paketversion kaputt geht. 23. Entfernen Sie nicht verwendete Pakete aus dem Projekt: Manchmal installieren wir in unserer Anwendung zu Beginn unseres Projekts so viele Pakete , aber einige Pakete verwenden wir wirklich nicht, sodass wir diese unbenutzten Pakete entfernen können da dies unnötig Speicherplatz in der Produktion beansprucht. also die Liste der unbenutzten Pakete vergessen, benötigen wir ein weiteres Paket namens DP Check, das ist die Abhängigkeitsprüfung Also schreiben wir NPM IG Depth Check. Auch hier installieren wir dieses Paket für die globale Ebene. In allen Anwendungen können wir es verwenden. Wenn Sie Mcuser sind, stellen Sie außerdem sicher, dass Sie am Anfang des globalen Paketbefehls sudo hinzufügen und Ihr Systemkennwort eingeben Jetzt können Sie hier einfach dep check ausführen, und es gibt die Liste der ungenutzten Abhängigkeiten und auch der ungenutzten DAB-Abhängigkeiten zurück ungenutzten Abhängigkeiten und auch der ungenutzten DAB-Abhängigkeiten Derzeit haben wir keine Abhängigkeiten oder Pakete verwendet. Aus diesem Grund werden bei uns alle Pakete von Drittanbietern als unbenutzt eingestuft. Mit NPM uninstall oder UN Express Mongo DB können wir alle Pakete deinstallieren Großartig. Wenn wir jetzt nochmal Dap checken, dann kriegen wir hier nichts hin, herrlich. So können wir unbenutzte Pakete aus der Node-Anwendung entfernen . Hier dreht sich alles um den Node Package Manager oder NPM. Wenn Sie das, was Sie in diesem Abschnitt gelernt haben, schnell überarbeiten möchten , erhalten Sie am Ende jedes Abschnitts eine Zusammenfassung als PDF, sodass Sie sie herunterladen und das Gelernte zusammenfassen können Ab dem nächsten Abschnitt werden wir nun mit dem Aufbau unseres ersten echten No Js-Projekts beginnen 24. Abschnitt 04 - API im Vergleich zu REST-API: Willkommen im vierten Abschnitt des ultimativen Node-JS-Kurses. In diesem Abschnitt werden wir Arbeit an unserem ersten Projekt beginnen. Wir beginnen also mit den Grundlagen Was ist RS-API, richten unseren Server mit Express JS erstellen dann verschiedene Arten von STB-Anfragen, Abrufen , Posten, Put und Löschen Außerdem sehen wir Datenvalidierung und vieles mehr. Fangen wir also mit diesem Abschnitt an. Wie wir wissen, steht API für Application Programming Interface und ist die Art und Weise, und ist die Art und Weise zwei Programme miteinander kommunizieren. Erinnern Sie sich an unser Restaurantbeispiel Sehen wir uns ein anderes Beispiel aus der realen Welt an. Stellen Sie sich vor, ein Benutzer möchte sich auf unserer Website registrieren, also füllt er oder sie das Formular aus und sendet es dann ab. In dem Moment, in dem sie das Formular abschicken, rufen wir die API auf, um einen neuen Benutzer zu registrieren , und im Backend erstellen wir einen neuen Benutzer. Auf diese Weise können wir viele APIs erstellen, um den vorhandenen Benutzer zu protokollieren, alle Produktlisten abzurufen, Produkte in den Warenkorb zu legen, Produkte aus dem Warenkorb zu löschen usw. In einfachen Worten, die API wird verwendet, um Daten zwischen Frontend zu Backend und Backend zu Frontend zu übertragen zwischen Frontend zu Backend und Backend . Das wissen wir bereits Jetzt fragen Sie sich vielleicht, was eine Rest-API ist. Rest API steht für Representational State Transfer API. Die Rest-API ist eine spezielle Methode zum Erstellen unserer einfachen APIs. Mach dir keine Sorgen um den Namen. Es ist sehr einfach. Die Rest-API ist dieselbe API, aber wir müssen einige Regeln befolgen, um diese API zu erstellen. Wenn wir einige Regeln befolgen, wird aus dieser einfachen API eine Rest-API. Sehen wir uns nun einige Regeln an , denen wir folgen müssen. Machen Sie die Rest-API. Eine Regel besagt, dass wir für jedes Datenelement eine separate API-URL definieren müssen. Nehmen wir zum Beispiel an, wir erstellen API für benutzerbezogene Operationen wie das Registrieren von Benutzern, das Abrufen der Informationen eines einzelnen Benutzers usw. In diesem Fall sollte unsere API unser Domainname sein und dann der Schrägstrich „user“ für die Registrierung Und wenn wir Informationen über einzelne Benutzer erhalten möchten, erstellen wir eine API-URL wie den Schrägstrich 123 Hier ist 123 eine eindeutige Benutzer-ID. Genauso wie wenn wir eine API für Produkte erstellen würden, dann sollte unsere URL wie folgt lauten: Schrägstrich Produkte, Schrägstrich Produkte, Schrägstrich 123, Schrägstrich Produkte, Schrägstrich Zum Warenkorb hinzufügen usw. Wenn wir uns also einfach diese API-URL ansehen, erhalten wir die Grundidee zu unseren APIs können wir problemlos Änderungen vornehmen und Änderungen Eine weitere Regel sind verschiedene Arten von Aktionen wie das Lesen, Hinzufügen, Aktualisieren oder Löschen von Daten. Sollte spezifische SGDP-Methoden verwenden. Jetzt fragen Sie sich vielleicht, was SGDP-Methoden sind. Wie wir wissen, steht SDDP für Hypertext Transfer Protocol und ermöglicht es unserem Frontend, Webseiten und andere Ressourcen von Servern mithilfe von API anzufordern und zu empfangen Webseiten und andere Ressourcen von Servern mithilfe von API anzufordern und Nur aufgrund von SGDP können wir also Daten über die API vom Backend senden und empfangen Dieses SDDP hat nun fünf Hauptmethoden. Holen, posten, platzieren, patchen und löschen. Lass mich dir das eins nach dem anderen erklären. Die erste ist die Get-Methode. Wir verwenden die Get-Methode, wenn wir nur Daten vom Server abrufen möchten. Beispielsweise möchten wir alle Benutzerdetails abrufen, oder wir möchten alle Produktdetails abrufen oder wir möchten einzelne Produktdetails abrufen. In diesem Fall definieren wir unsere API mit der GT-Methode. Um diese Methoden zu verstehen, werden wir die Analogie der Bibliothek verwenden Die Methode Get ist so, als würde man einen Bibliothekar bitten , Ihnen ein oder mehrere Bücher zu zeigen Machen Sie sich keine Sorgen um die Implementierung. In diesem Abschnitt werden wir alle Methoden Schritt für Schritt sehen. Zweitens haben wir die Post-Methode. Wir verwenden die Post-Methode, wenn wir einige Daten vom Frontend posten oder senden möchten einige Daten vom Frontend , um neue Daten auf unserem Server zu erstellen. beispielsweise einen neuen Benutzer zu registrieren, müssen wir Benutzerdaten vom Frontend senden , wodurch neue Daten auf unserem Server erstellt werden . Ich denke, es ist so, als würden wir dem Bibliothekar ein neues Buch für das Buch in der Bibliothek geben Bibliothekar ein neues Buch für das Buch in der Bibliothek Als Nächstes haben wir Methode eingeführt. Wir verwenden die Put-Methode, wenn wir bestehende Daten auf dem Server mit neuen Daten aktualisieren möchten . Wenn Sie beispielsweise Ihre Profilinformationen auf einer Website ändern und speichern, wird eine Put-Anfrage gesendet, um Ihr Profil mit den neuen Details zu aktualisieren. Stellen Sie sich vor, das ist so, als würde man einem Bibliothekar eine aktualisierte Version eines Buches geben , um das alte zu ersetzen Als Nächstes haben wir die Seitenmethode. Wir verwenden die Seitenmethode, wenn wir kleine Daten aktualisieren möchten , nicht ganze Daten. Wenn wir beispielsweise nur unsere E-Mail-Adresse in unserem Profil aktualisieren möchten nur unsere E-Mail-Adresse in unserem , ohne etwas anderes zu ändern, kann eine Seitenanfrage verwendet werden. Ich denke, es ist so, als würden wir einem Bibliothekar nur die aktualisierten Seiten eines Buches zur Aktualisierung geben nur die aktualisierten Seiten eines Buches , anstatt das ganze Buch zu ersetzen Stellen Sie sich vor, hier haben wir ein Benutzerobjekt auf unserem Server. Möchten Sie dieses Benutzerobjekt aktualisieren, vervollständigen und dann, welche Methode wir verwenden werden, verwenden wir die Put-Methode. Und wenn wir nur das Passwort dieses Benutzers aktualisieren wollen, welche Methode wir dann verwenden werden, wir werden die Patch-Methode verwenden. Du machst das wirklich super. Put-Methode wird für die Aktualisierung ganzer Daten verwendet, und die Patch-Methode wird für kleine Aktualisierungen der vorhandenen Daten verwendet. Die letzte Methode ist Löschen. Und Sie raten richtig, wir werden die Löschmethode verwenden um Daten vom Server zu löschen. Wenn wir beispielsweise einen Beitrag oder einen Kommentar in sozialen Medien löschen, wird eine Löschanfrage gesendet, um ihn vom Server zu entfernen. Und dafür brauchen wir meiner Meinung nach keine Analogie zur Bibliothek, oder? Und es ist auch nicht praktikabel. Ich denke, es ist, als würde man Bibliotheken bitten , ein Buch aus der Bibliothek zu entfernen. Sie können sehen, dass die SGDB-Methoden sehr einfach sind. Wir werden diese fünf SGDP-Methoden verwenden , um unsere verschiedenen API-Typen zu definieren Dies sind nur einige Regeln, die wir derzeit sehen, aber keine Sorge, wir werden all diese Regeln lernen , wenn wir APIs erstellen Jetzt fragen Sie sich vielleicht, warum wir die Rest-API benötigen. Warum müssen wir Regeln für die API-Erstellung befolgen? Indem wir alle Regeln befolgen, können wir die Dinge organisieren, und das gilt auch für die RS-API. Regeln werden unsere API besser organisieren. Durch die Befolgung der REST-API-Regeln erstellen wir außerdem eine einfache und benutzerfreundliche API, da sie spezifische SDDP-Methoden für bestimmte Arten von Arbeit verwendet für bestimmte Arten von Arbeit Außerdem können wir mit Regeln eine saubere und wartbare API erstellen, die jeder Entwickler verstehen und mit der Arbeit daran beginnen kann verstehen und mit der Arbeit daran beginnen Machen Sie sich vorerst keine Gedanken über Regeln. Wie gesagt, Sie werden diese Regeln lernen , während Sie APIs erstellen. Celeste fängt an, unser erstes Node-JS-Projekt zu gewinnen. Ich freue mich sehr und ich weiß, dass du es auch bist. 25. Liste der Planungs-API für Project 01: Bevor wir mit einem Projekt beginnen, ist es besser, das Ted-Projekt grob zu planen. Wie wir wissen, geht es bei unserem ersten Projekt darum, die Aufgabe zu verwalten und herauszufinden, wie das Frontend aussieht. Außerdem ist dies das erste Projekt meines React-JS-Kurses, und wir werden dieses Projekt-Backend als unser erstes Backend-Projekt erstellen als unser erstes Backend-Projekt Keine Sorge, wir werden hier kein Frontend erstellen, da unser Hauptaugenmerk auf NodeJS und dem Aufbau des besten Backends für unsere Anwendungen liegt und dem Aufbau des besten Backends Vom Frontend aus müssen wir nur APIs aufrufen. Jetzt fragen Sie sich vielleicht, wie können wir das NodeJS-Projekt planen ? Es ist sehr einfach Diese Methode habe ich für die Planung meines Bend-Projekts verwendet , auch für große Projekte. Anstatt zuerst ein Projekt zu bauen und dann größere Änderungen vorzunehmen, ist es besser, ein wenig Zeit mit der Planung zu verbringen , bevor wir mit unserem Projekt beginnen. Für das Ben-Projekt ist es sehr nützlich, wenn wir die Liste der APIs erstellen, da es bei Bend fast nur um APIs geht. Für dieses Projekt benötigen wir zunächst die Liste aller Todos, eine API zum Abrufen aller Todos Danach müssen wir eine API zum Hinzufügen einer neuen Aufgabe erstellen , und danach können wir die einzelnen Aufgabendetails aktualisieren, eine API zum Aktualisieren der Aufgabe, und am Ende müssen wir eine einzelne Aufgabe löschen, eine weitere API zum Löschen einer bestimmten Derzeit wissen wir, dass wir diese vier APIs benötigen, und wir werden zwei, drei zusätzliche APIs für die Praxis erstellen. Wenn wir bei der Erstellung eines Projekts mehr APIs erstellen müssen, werden wir mehr APIs erstellen. Daran ist nichts falsch. Dies ist nur ein grober Plan, um die Verwirrung zu verringern. 26. Einrichten einer neuen Anwendung: Lassen Sie uns nun eine neue Anwendung für unser Projekt erstellen. Öffnen Sie also den Ordner, in dem Sie ein Projekt erstellen möchten, und ich nenne ihn als Task Track und öffne diesen Ordner einfach im VS-Code. Das ist der Name unseres Projekts. Klingt es gut? Ich hoffe es ist so. Wenn du einen besseren Namen hast, dann kannst du ihn auch benutzen. Es liegt ganz bei dir. Was müssen wir nun tun, um keine JS-Anwendungen zu erstellen? Erinnerst du dich, dass wir das gerade in unserem vorherigen Abschnitt gemacht haben ? Ja. Wir öffnen einfach unser Terminal und initialisieren unser Projekt mit NPM. Für As werden wir hier y verwenden Siehst du, wir bekommen PGSnfle mit einer Standardkonfiguration. Hier können wir sehen, dass unsere Hauptdatei index dot js ist, was bedeutet, dass die Datei ausgeführt wird, wenn wir unsere Anwendung starten Lassen Sie uns eine Index Dot JS-Datei erstellen, und das war's. Hier in dieser Datei werden wir Code für unser Backend schreiben. 27. Erstellen eines Servers mit Express: Im vorherigen Abschnitt haben wir unseren Server mit dem STTP-Modul erstellt Das Problem mit dem STTP-Modul besteht darin, dass wir unsere verschiedenen API-Endpunkte in diesen I- und LSI-Anweisungen definieren unsere verschiedenen API-Endpunkte in müssen, was nicht sehr klar und auch für große Projekte nicht einfach zu verwalten ist auch für große Projekte nicht einfach zu verwalten Deshalb verwenden wir sehr beliebtes Paket oder Modul namens Express Express Dogs ist minimal und flexibel, um bessere Node-Anwendungen zu erstellen. In einfachen Worten, mit Express Dot JS können wir unsere Routen vereinfachen. Wir können STIP-Anfragen und -Antworten, Middlewares und vieles mehr problemlos bearbeiten Middlewares und Lass mich dir etwas zeigen. Hier ist das Express-Paket auf der NPMJS-Website. Sie können sehen, dass die wöchentlichen Downloads fast 37,2 Millionen betragen, was verrückt ist, und fast 90% der Entwickler von NoDJS-Projekten Es ist sehr wichtig , Master Express. Lassen Sie uns zunächst dieses Modul in unserem Projekt installieren. Öffne das Terminal und schreibe und drücke Install Express. Zu dem Zeitpunkt, an dem ich diesen Kurs aufnehme, ist die neueste Version 5.1 0.0. Wenn Sie die gleiche Erfahrung machen möchten wie ich, können Sie hier NPM install Express aerate 5.1 0.0 schreiben und die Eingabetaste drücken Mach dir keine Sorgen um Express. Es ist ein wirklich einfaches Paket. D. Jetzt wollen wir dieses Express-Modul in dieser Index-JS-Datei verwenden . Kannst du mir sagen , was wir tun müssen? Richtig, wir werden das Express-Modul mit der Funktion require, express, eingeben das Express-Modul mit der Funktion require, express, , und diese erforderliche Funktion gibt eine Funktion zurück. Wir speichern es einfach in einer Variablen namens express. Um nun eine Express-Anwendung zu erstellen, rufen wir hier diese Express-Funktion auf, die ein Objekt zurückgibt, und wir speichern es in einer Variablen namens application oder app. Sie können ihr einen beliebigen anderen Namen geben, aber wahrscheinlich haben es alle Entwickler App genannt. Lass uns mit der App weitermachen. In diesem App-Objekt erhalten wir jetzt viele nützliche Methoden. Zum Beispiel haben wir hier App Dot Get App Dot Post, App Dot Pot. App Dot Patch, App Dot DLD usw. Erinnerst du dich, wo wir diese fünf Methoden sehen? Es handelt sich um SDDP-Methoden zum Erstellen verschiedener API-Typen Wenn wir unsere API für die SDDPGT-Methode definieren möchten, verwenden wir App Dot möchten, verwenden wir Wenn wir die SDDP-Löschmethode definieren wollen, verwenden wir App Dot wir Genauso wie wir Post-, Put- und Patch-Anfragen erstellen können Put- und Die Art und Weise, all diese fünf Methoden zu definieren, ist dieselbe. Dennoch werden wir alle Methoden in diesem Abschnitt nacheinander sehen . Lassen Sie uns zunächst mit der GAD-Anfrage beginnen. In dieser GAT-Methode als ersten Parameter müssen wir als ersten Parameter unseren API-Endpunktnamen schreiben Angenommen, wir möchten die G-API für URL, SGDP, Column Double Slash, Local Host, Column 3.000 Slash Tudo definieren Column Double Slash, Local Host, Column 3.000 Slash Was ist nun unser Endpunkt in dieser URL? Tudos ist unser API-Endpunkt Das müssen wir hier beim ersten Parameter schreiben. Stellen Sie sicher, dass wir zuerst den HeWard-Schrägstrich hinzufügen. Andernfalls funktioniert das nicht richtig. Was ist nun, wenn wir Get API for URL, SDDP-Spalte, doppelter Schrägstrich, lokalisierte Spalte 3.000 definieren wollen , was die Stamm-URL unserer Website ist Zu diesem Zeitpunkt können wir nur einen Schrägstrich verwenden, darstellt Jetzt müssen wir definieren, was passiert, wenn unser Frontend Anfragen an den Endpunkt sendet Erinnerst du dich, lass es mich dir zeigen. Hier übergeben wir die Callback-Funktion und erhalten dabei zwei Objekte, Anfrage und Antwort Diese Anfrage enthält alle Details zur URL-Anfrage und mit diesem Antwortobjekt können wir Details zur Antwort senden Das haben wir bereits in der STP-Modulstunde gesehen. Nun, was wir senden möchten, wenn jemand eine Anfrage über diese API sendet Im Moment geben wir einfach eine Textantwort mit dem Punkt SEND Task Track-Projekt zurück . Wenn jemand eine Get-Anfrage an diesen Endpunkt sendet, wird diese Funktion ausgeführt und dann wird Antwort einfach dieser Text zurückgegeben, so einfach wie eingestellt. Mit diesen beiden Zeilen wird unser Express-Server erstellt, aber wir müssen diesen Server auf einem Port ausführen oder abhören. Wenn wir unseren Server nicht abhören, funktioniert unsere API nicht. Hier am Ende schreiben wir App Dot L ISE und hier übergeben wir einfach unsere Portnummer an den zweiten Parameter, wir übergeben erneut die Callback-Funktion, die ausgeführt wird, wenn unser Server anfängt, diesen Port abzuhören Hier können wir einfach angeben, dass der Dot Log-Server auf diesem Port 3.000 läuft oder lauscht Speichern Sie die Änderungen und lassen Sie uns unsere Indexpunkt-JS-Datei ausführen. Schreiben Sie node, index dot js. C Server überwacht den Port 3.000. Nett. Kehren Sie jetzt zum Browser zurück und führen Sie Local Host Column 3.000 aus, was die Root-URL ist Hier sehen Sie, dass wir den Task-Track-Projekttext erhalten , den wir von unserem Server senden. Sie können sehen, dass Express unseren Code wirklich einfach macht. Wir können unseren aktuellen Code mit dem vorherigen SGDP-Modulcode vergleichen dem vorherigen SGDP-Modulcode Express macht es wirklich einfach. Außerdem ist dies unsere erste API. Deshalb haben wir als Antwort nur Text geschrieben. Jetzt, wo wir unser Projekt vorantreiben , wird der wahre Nervenkitzel beginnen 28. Übung zum Erstellen von Express Server: Es ist Zeit für wenig Bewegung. Ich möchte, dass Sie den gesamten Code aus der JS-Datei mit dem Indexpunkt entfernen und erneut einen Express-Server und eine API für Root und Point erstellen. In dieser Übung werden Sie sich der Erstellung von Express-Servern vertraut machen. Im wahrsten Sinne des Wortes dauert es nur 1 Minute. Versuchen Sie, diese Übung abzuschließen und schauen Sie sich dann die Lösung an. Okay. Ich hoffe, du löst die Aufgabe oder du hast versucht, sie zu lösen. Sehen wir uns nun die Lösung an. Zuallererst benötigen wir das Express-Modul in unserer Datei. Benötige Express und speichere es in einer Variablen namens Express. Dieser Express ist eine Funktion, also rufen wir ihn hier auf und er gibt unser Serverobjekt oder Anwendungsobjekt zurück. Speichern wir es also in einer Variablen namens app. Hier erstellen wir unseren Express-Server mit diesen beiden Zeilen, aber wir müssen unseren Server erst abhören , dann können wir unsere API ausführen. Am Ende fügen wir einfach App Dot Lisen hinzu und als ersten Parameter, was werden wir übergeben Richtig, wir passieren den Port , der 3.000 ist. Und beim zweiten Parameter übergeben wir die Callback-Funktion und darin läuft einfach der Konsolen-Protokollserver auf Port 3.000 Eine Sache ist, ich höre den Server ab, bevor ich die API hinzufüge , weil ich oft vergessen habe, den Server abzuhören, und das wird viel Zeit verschwenden Ich höre den Server immer sobald ich den Server erstelle. Jetzt, dazwischen, können wir unsere API beliebig definieren. Für Get request fügen wir also App Dot GAT hinzu. Zuerst fügen wir unsere API und unseren Point hinzu, und dann fügen wir beim zweiten Parameter eine Callback-Funktion hinzu, die zwei Parameter hat, Anfrage und Antwort In diesem Callback senden wir einfach Text mit dem Antwortpunkt Das ist ein Task-Track-Projekt. Speichern Sie die Änderungen, und hier müssen wir unsere Anwendung vom Terminal aus beenden unsere Anwendung vom Terminal aus , da sie immer noch alten Code ausführt. Wir führen erneut die Datei Node Index Dot JS aus. Siehst du, der Server hört und in unserem Browser bekommen wir den aktualisierten Text, ganz einfach. 29. API erstellen für die Liste aller todos erstellen: Lassen Sie uns nun eine API zum Abrufen aller Todos-Listen erstellen. Kannst du mir sagen, welche SDP-Methode wir verwenden müssen? Richtig, um die Daten vom Server abzurufen, verwenden wir die Get DP-Methode Also hier schreiben wir App Dot GT. Und nehmen wir an, wir wollen dieser API den Namen todos geben. Also übergeben wir hier den Schrägstrich Todos und danach, beim zweiten Parameter, übergeben wir die Callback-Funktion, übergeben wir die Callback-Funktion, die zwei Parameter Anfrage und Antwort hat Sehen Sie, für alle APIs diese Struktur gleich bleiben Nur diese Änderung der SDP-Methode, diese Änderung des Endpunkts und Logik innerhalb dieser Aufruf-Webfunktion werden sich ändern So macht Express JS unser Projekt einfach und übersichtlich. Derzeit werden wir nicht mit einer Datenbank arbeiten, da wir unserem ersten Projekt keine zusätzliche Komplexität hinzufügen möchten . Wir werden all diese Dinge Schritt für Schritt lernen. Machen Sie sich also keine Sorgen um die Datenbank. Jetzt müssen wir hier alle Todos-Arrays senden. Oben definiere ich ein Dummidata namens Todos-Array und füge diesem einfach einige Todos hinzu Hier ist jedes Todo ein Objekt mit vier Eigenschaften. ID, lass es uns zu einer Aufgabe zitieren, die ein Aufgabentext ist Lassen Sie uns alle APIs für das erste Projekt erstellen. Tags, das sind die Tags, die sich auf eine Aufgabe beziehen , bei der es sich um ein Array handelt, nicht nur um Komma-JavaScript. Und Status, der erledigt werden muss. Diese Eigenschaften, die ID, die Aufgaben , die Tags und der Status werden von Noches Developer definiert, was bedeutet, wie Sie es nennen möchten , wie viele Eigenschaften Sie benötigen, diese Dinge müssen Sie entscheiden, basierend darauf welche Daten wir speichern möchten und welche nicht Lassen Sie uns dieses Objekt nun noch zweimal duplizieren , indem wir Sift plus Alter plus Abwärtspfeil oder Sift plus Option plus Wir ändern diese ID in zwei Aufgaben, um EPI für eine Liste aller To-Do-Tags ohne Js und den Status auf Doing zu erstellen ohne Js und den Status Zum Schluss ändern wir einfach die ID auf drei Aufgaben, um das erste Projekt zu planen, geben JavaScript als Text und den Status auf Fertig Ich möchte dieses Array einfach als Antwort zurückgeben, wenn jemand Gut-Anfrage an die API sendet, was Todos und Point als Schrägstrich Was wir hier schreiben, wir, wir schreiben den Antwortpunkt SN und übergeben einfach unser Todos-Array Speichern Sie die Änderungen und lassen Sie uns überprüfen, ob diese API funktioniert oder nicht Öffnen Sie das Terminal, schließen Sie den aktuell laufenden Server mit Strg und C und führen Sie diese Datei erneut aus. Jetzt rufen wir im Browser an der Stelle der Root-Website einfach den Schrägstrich Todos and Siehst du, hier bekommen wir unser Array. So einfach ist es, Daten vom Backend mithilfe der G-API zu senden . 30. Automatischer Neustart von Nodämon einrichten: Wenn wir derzeit Änderungen an unserem Projekt vornehmen, müssen wir unseren zuvor laufenden Server schließen und unsere Anwendung neu starten, was wirklich nervig ist Für den automatischen Neustart unserer Anwendung haben wir ein Paket namens nodemon Es ist wirklich nützlich. Öffne das Terminal und schreibe NPM install oder IG Nodemon. Hier verwenden wir DSG, um dieses Norman-Paket weltweit zu installieren Andernfalls müssen wir Nor Moon in jedem Node-Projekt installieren Nor Moon in jedem Node-Projekt Wenn Sie einen Mac verwenden, müssen Sie für die Installation des globalen Pakets außerdem für die Installation des globalen Pakets am Anfang des Befehls sudo schreiben und dann wird nach dem Systemkennwort gefragt Wie können wir nun eine Datei mit Knoten eins ausführen? Lass es mich dir zeigen. Im Terminal haben wir bisher eine Datei mit Node, Index Dot JS ausgeführt. Jetzt schreiben wir für Node M Nodemon Index Dot JS. So einfach ist das. Siehst du, hier bekommen wir unsere Node M-Version. Oder wir starten neu, wir können RS eingeben. Außerdem sagt es uns, dass wir uns die Path-Periode ansehen, was bedeutet, dass wir dieses Projekt gestartet Danach werden Erweiterungen wie Js, MGs, Cgs, JSON usw. beobachtet . einer Datei mit dieser Art von Erweiterungen beobachtet Nod Moon diese Dateien ständig, und wenn sich etwas an diesen Dateien ändert, wird unsere Anwendung neu gestartet Am Ende, siehe, nodemon führt auch Command node index dot Durch die Verwendung von Nodemon müssen wir unsere Anwendung nicht neu starten Es wird automatisch neu gestartet, wenn wir etwas in diesen Dateien mit diesen Erweiterungen ändern etwas in diesen Dateien mit diesen Erweiterungen 31. Umgebungsvariablen: Derzeit stellen wir den Pod unseres Servers manuell ein. In der realen Welt wird dieser Pod jedoch von der Umgebung festgelegt , in der unsere Anwendung ausgeführt wird. Insbesondere wird er vom Hosting-Anbieter oder von Entwicklungsplattformen wie Render, Heroku, AWS usw. verwaltet Hosting-Anbieter oder Entwicklungsplattformen wie Render, . Wenn wir unsere Anwendung auf diesen Plattformen bereitstellen, unser 3.000-Port möglicherweise bereits von einem anderen Server verwendet Wenn wir unseren Port zu diesem Zeitpunkt fest codiert haben, läuft unser Server nicht auf diesem Port und wir erhalten einen Fehler bei der Bereitstellung. Also, was ist hier die Lösung? Es ist wirklich einfach. Wir werden eine Bedingung überprüfen. Wenn in unserer Anwendungsumgebung Portvariable definiert ist, verwenden wir diese Portvariable, andernfalls verwenden wir unseren fest codierten Port. Lass mich dir zeigen, dass es wirklich einfach ist. Also hier, bevor wir unseren Server abhören, erstellen wir hier eine Variable namens port equals to now. Wie können wir überprüfen, ob unser Server einen Port in seiner Umgebung hat oder nicht? Dafür haben wir also ein Objekt namens process dot ENV. Diese ENV steht für die Umwelt. In dieser Umgebung erhalten wir alle Variablen, die von den Hosting-Plattformen und von Port für Port gesetzt werden Hosting-Plattformen und von Port für Port Wenn also eine Hosting-Plattform einen anderen Port festlegen möchte, speichert sie diese Prozessvariable mit dem Punkt Env Punkt Port Das ist eine gängige Konvention. Außerdem bestehen alle Namen von Umgebungsvariablen Großbuchstaben, und aus diesem Grund geben wir diesen Variablennamen auch in Großbuchstaben an. wir es uns nur ansehen, wissen wir, dass es sich um eine Umgebungsvariable handeln kann. Wenn dieser Prozesspunkt ein Punkt-NW-Punkt-Port verfügbar ist, dann ist das kein Problem. Wenn es jedoch nicht verfügbar oder eingestellt ist, müssen wir unseren fest codierten Portwert übergeben. Wir fügen unseren Operator hinzu , der zweimal ein Par-Symbol ist Es ist die Taste über Enter oder Return Hier passieren wir unseren Hafen, der 3.000 ist. Lassen Sie uns nun diese Portvariable an die Stelle dieses hartcodierten Ports übergeben , und wir werden auch diese Konsolennachricht ändern. Lassen Sie uns diese Zeichenfolge mit Acti als Template-Zeichenfolge erstellen , weil wir in Template-Zeichenketten einfach auf Variablen zugreifen und diese 3.000 mit Dollar-Coli-Klammern ändern können , Topf Wenn dieser Umgebungsport verfügbar ist, verwenden wir ihn oder wenn er falsch oder Null ist, dann verwenden wir diesen 3.000-Port So einfach ist das. Derzeit ist in unserer Anwendung der Umgebungsport nicht festgelegt. Aus diesem Grund wird unsere Anwendung kontinuierlich auf Port 3.000 ausgeführt. Machen Sie sich keine Sorgen, wenn Sie über diesen Prozess etwas verwirrt sind , Punkt ENV Wir werden ihn in den kommenden Projekten im Detail Lassen Sie mich Ihnen eine Abkürzung für die Einrichtung der Node-Anwendung Zuerst ist Express erforderlich, eine Express-Anwendung erstellen, diese Port-Variable mit diesem Ausdruck erstellen und die Express-Anwendung auf dem Port abhören . Diese vier Dinge bleiben in allen Node-Anwendungen gleich. Ja, wir können weitere Funktionen in anderen Zeilen hinzufügen, aber in diesen vier Zeilen wird sich nichts ändern. 32. Routingparameter und Abfrageparameter: Zuvor haben wir eine API erstellt , um die Liste aller Aufgaben in unserer Anwendung abzurufen. Aber was ist, wenn wir die Informationen über nur eine einzige Aufgabe benötigen , z. B. mit ID eins oder ID drei. Dafür müssen wir die ID in der API-URL übergeben. Unsere API-URL sieht so aus. Todos ON, was bedeutet, dass wir eine zu erledigende Information abrufen wollen , deren ID eins Variablentyp , den wir in unserer URL übergeben , wird als Routenparameter bezeichnet Es ist sehr wichtig spezifische Informationen zur API-Anfrage wie ID, Status, Datum usw. bereitzustellen . Lassen Sie mich Ihnen zeigen, wie wir diese Art von API-URL festlegen und auf die Routenparameter zugreifen können. Wir fügen dem Schrägstrich Todo-Slash einen neuen GAT-API-Endpunkt hinzu. Hier verwenden wir zur Definition von Routenparametern einen Doppelpunkt und geben unserer Routenvariablen einen Namen Diese ID ist unser Routenparameter. Wir können es so etwas wie Todo ID nennen, aber ID ist kurz und bündig, also entscheiden wir uns für ID, und das war's So können wir den Routenparameter in unserer API-URL definieren. Lassen Sie uns in unserer API-Logik auf diesen Routenparameter zugreifen. Auch hier halten wir uns an die Callback-Funktion mit zwei Parametern, Anfrage und Antwort Nun, was denkst du über diese Funktion? In welchem Objekt erhalten wir Informationen über unseren Routenparameter, unsere Anfrage oder Antwort. Acht. Auf Anfrage erhalten wir Informationen über den Routenparameter. Also fordere Punkt-PAMs an. In diesem Perms-Objekt erhalten wir alle Routenparameter und können über die Punkt-ID darauf zugreifen Siehst du, hier bekommen wir auch automatische Vorschläge. Senden wir nun einfach diese ID in unseren Antwortpunkt, speichern die Änderungen und kehren zu unserem Browser zurück. Gehen Sie zum lokalen Host, Spalte 3.000, um Schrägstrich eins S zu machen, hier bekommen wir die ID Wir haben erfolgreich den Routenparameter abgerufen. Jetzt ist hier eine Sache. Wir können in unserer API auch mehrere Routenparameter übergeben. Zum Beispiel können wir den Aufgabenstatus todo übergeben. Jetzt fügen wir hier im Backend den Routenparameter hinzu . Wie können wir das machen? Richtig. Wir fügen den Slash-Clan-Status hinzu und wie können wir auf den Routenparameter zugreifen Richtig. Wir verwenden Request Dot Perms Dot Status Lassen Sie mich Ihnen die gesamte Route mit dem Perms-Objekt zeigen. Speichern Sie die Änderungen und kehren Sie zum Browser zurück Wir übergeben hier den Statuswert nach unserem ID-Wert Stellen Sie sicher, dass die Bestellung mit der Bestellung übereinstimmt, die wir in unserer API definiert haben, was zuerst die ID und dann den Status bedeutet. Sehen Sie hier, wir erhalten das Params-Objekt mit diesen beiden Eigenschaften , die wir in der API definieren Jetzt sind Sie vielleicht neugierig. Was ist, wenn wir den Status hier nicht weitergeben? Lassen Sie uns das auch sehen. Entferne den Statuswert und schau, hier können wir keinen machen, was bedeutet, dass unser Server ABI mit dieser URL nicht gefunden hat. Wenn wir Routenparameter in unserer API definieren, stellen Sie sicher, dass wir alle Routenparameter in der richtigen Reihenfolge übergeben . Es gibt eine andere Möglichkeit , Daten in einer URL zu übergeben, nämlich die Verwendung von Abfrageparametern. Wenn Sie Websites verwenden, sehen Sie in der URL möglicherweise ein Fragezeichen und übergeben dann einige Variablentypen wie shot entspricht dem Datum und order entspricht einem C für aufsteigend usw. Dies sind die Abfrageparameter, die für die Übergabe von Daten in URLs verwendet werden Jetzt fragen Sie sich vielleicht, was ist der Unterschied zwischen Routenparametern und Abfrageparametern? Diese werden verwendet, um Daten in URLs zu übergeben, aber Routenparameter werden verwendet, um Daten zu übergeben, was am meisten erforderlich ist , wenn Abfrageparameter verwendet werden, um Daten zu übergeben, die zusätzlich oder optional sind. In einfachen Worten, wenn das Frontend in unserer API keine Routenparameter übergeben hat , gibt uns unsere API einen Fehler. Wenn wir jedoch keine Abfrageparameter übergeben haben, gibt uns unsere API keinen Fehler. Es handelt sich um zusätzliche Details. Wenn wir beispielsweise die Todo-ID oder den Status nicht übergeben haben, erhalten wir die Fehlermeldung, dass die API nicht gefunden wurde Wenn wir diese Variablen jedoch nicht nach dem Fragezeichen übergeben , erhalten wir keine Fehlermeldung Lassen Sie mich Ihnen nun zeigen, wie wir auf die Abfrageparameter in unserer API zugreifen können . Dafür müssen wir an der API-URL nichts ändern. Und greifen Sie direkt in unserer Rückruffunktion darauf zu. Für den Abfrageparameter haben wir ein anderes Objekt angefordert, nämlich Request Dot Query, und das war's Wir müssen an unserem Endpunkt nichts tun. Speichern Sie die Änderungen und schauen Sie sich das an. Siehst du, hier bekommen wir das Abfrageobjekt. Request Dot Params wird für Routenparameter verwendet, und Request Dot Query wird für Abfrageparameter verwendet Wir werden sie häufig verwenden, wenn wir komplexe APIs erstellen. Sie sind sehr nützlich. 33. Single Todo nach ID abrufen: Sehen wir uns nun an, wie wir single to do anhand seiner ID zurückgeben können. Für das, was wir den Routenparameter oder den Abfrageparameter verwenden, werden wir den Routenparameter verwenden , da diese Informationen am dringendsten benötigt werden. Also entfernen wir diesen Klassenstatus von unserem Endpunkt, wir brauchen ihn nicht. In der Colvey-Funktion müssen wir die einzige Aufgabe zurückgeben, deren ID mit unserer Routenparameter-ID identisch ist Lassen Sie uns zunächst den Routenparameter in einer separaten Variablen speichern den Routenparameter in einer separaten Variablen Also ist Cs zu do ID gleich, wie können wir auf Routenparameter zugreifen Wir fordern die ID der Punktparameter an. Jetzt müssen wir aus unserem Todos-Array eine einzige Aufgabe finden , deren ID mit dieser Todo-ID identisch ist Dass wir eine JavaScript-Array-Methode verwenden, nämlich find. Todos array dot find, und innerhalb dieser feinen Methode übergeben wir die Callback-Funktion, und hier im Parameter erhalten wir das Single to do Objekt a Also dieses T ist dieses einzelne Objekt im Tds-Array Und wir geben hier eine Bedingung zurück, wenn t ID unserer Todo-ID entspricht Wenn Sie diese gute Methode nicht kennen, lassen Sie mich es Ihnen kurz erklären, da es sich um ein reines JavaScript-Konzept handelt Diese gute Methode überprüft also unser Tudos-Array und wählt zuerst das erste Objekt des Arrays in dieser T-Variablen aus, dann überprüfen wir die Bedingung Die T-Punkt-ID entspricht der Angabe , wo die ID zu tun ist. Wenn es wahr ist, diese gute Methode dieses einzelne Objekt zurück. Also speichern wir unveränderliche Nachteile zu erledigen. A, wenn diese Bedingung nicht erfüllt ist, wird T als nächstes Objekt gesetzt und die Bedingung dann erneut überprüft Und so können wir mit dieser guten Methode etwas finden , das wir tun können. Lassen Sie uns das als Antwort auf die Punkt-SN-Methode tun. Speichern Sie die Änderungen und schauen Sie sich das an. Lassen Sie uns diese Abfrageparameter und damit den Statuswert entfernen, und hier erhalten wir nichts. Warum? Wir übergeben ID eins, und in unserem Todo-Array haben wir es auch mit ID eins zu tun. Was ist dann falsch? Versuchen wir, das einzelne Todo zu trösten. Hat die Änderungen vorgenommen und die Seite im Browser aktualisiert. Jetzt bekommen wir in unserem VSCO-Terminal, wo wir unseren Server betreiben, wo wir unseren Server betreiben, unsere Konsolen Siehst du, hier werden wir undefiniert. Wir können Todo also nicht in unserem Todos-Array finden , und das ist der Fehler Kann dieser Fehler auftreten, weil wir die IDs nicht richtig vergleichen Versuchen wir auch, diesen Todo-ID-Typ mithilfe des Typs der Do-ID zu konsolieren diesen Todo-ID-Typ mithilfe des Typs der Do-ID zu konsolieren Dadurch wird der Typ der To-do-ID zurückgegeben, die Änderungen gespeichert und die Seite aktualisiert Zurück zum VS-Code und sehen Sie, hier erhalten wir undefined für single to do und wir erhalten die Typ-Zeichenketten-ID, was zu tun Das ist der Grund, warum wir nicht einfach zu tun bekommen, denn hier ist unsere Todo-ID eine Ganzzahl und wir vergleichen sie mit der Zeichenfolge Also müssen wir diese Td-ID-String in eine Ganzzahl umwandeln. Also können wir diese Anfrage mit Punkt-Perms Punkt-ID und Parse-Integer umschließen mit Punkt-Perms Punkt-ID und Parse-Integer Funktion „Integer übergeben konvertiert unsere Zeichenfolge in eine Speichere die Ringe und sieh sie dir an. Aktualisiere die Seite und schau, hier bekommen wir das Single-to-Do-Objekt mit der ID eins. Wenn wir hier ID drei übergeben, dann haben wir es mit ID drei zu tun, also funktioniert es. Gut. Jetzt könnten Sie im Routenparameter fragen, wir übergeben eins als Ganzzahl. Aber warum im Hintergrund das als Zeichenfolge bekommen? Die Wahrheit ist also, was auch immer wir in der URL übergeben, es wird als Zeichenfolge übergeben. Wenn wir also etwas als Ganzzahl übergeben wollen, müssen wir es im Backend konvertieren. Wir können keinen Integer-Wert mit dem Routenparameter übergeben, und das gilt auch für Abfrageparameter. Denken Sie also immer daran, wenn Sie Routenparameter oder Abfrageparameter definieren , deren Wert dann mit der Parse-Integer- oder Parse-Float-Methode konvertieren müssen mit der Parse-Integer- oder Parse-Float-Methode Ich habe diesen Fehler absichtlich erstellt, um Ihnen zu zeigen, was passieren könnte . Wir erstellen API und Xs-ID im Routenparameter 34. POST-API zum Hinzufügen neuer Todo: Lassen Sie uns nun eine Post-API zum Hinzufügen eines neuen To-Do-Objekts erstellen. Wie wir wissen, verwenden wir für die Erstellung neuer Daten auf dem Server die Post-API. Auch nach der Anfrage sendet das Frontend Daten an den Server. Zum Beispiel erstellen wir hier eine Post-API zum Hinzufügen einer neuen Aufgabe Unser Frontend sendet also Details zu den Todos wie Aufgabe, Tags und Status im Hauptteil dieser Anfrage Wie können wir anhand dieser Informationen neue Aufgaben zu unserem Todos-Array hinzufügen Keine Sorge, lass mich dir das praktisch zeigen. Also hier definieren wir die Post-API mit App Dot Post, und beim ersten Argument übergeben wir unseren Endpunkt. Lassen Sie uns beim zweiten Argument den Schrägstrich Todos übergeben, wir übergeben die Callback-Funktion mit zwei Parametern, Anfrage und Antwort Jetzt fragen Sie sich vielleicht, dass diese beiden Endpunkte identisch sind. Wie können wir diese APIs einzeln verwenden? Hier können wir also sehen, dass diese API die Get-Methode verwendet und die zweite API die Post-Methode verwendet. Wenn das Frontend eine API-Anfrage auf diesem Endpunkt mit der G-Methode sendet, wird diese Funktion ausgeführt. Wenn das Frontend wird diese Funktion ausgeführt. Wenn das Frontend eine API-Anfrage auf demselben Endpunkt mit der Post-Methode sendet, wird diese Funktion ausgeführt Wir werden in nur einer Minute sehen, wie eine Post-Anfrage gesendet wird. Wie wir vom Frontend wissen, senden wir nun Daten im Anfragetext. Wie können wir in dieser Funktion Informationen zur Anfrage abrufen? Wir können diesen Anforderungsparameter verwenden. In dieser Anfrage erhalten wir alle Informationen zu dieser speziellen Anfrage. Hier haben wir eine Anfrage, und in dieser Anfrage haben wir eine Immobilie namens Body. Dieser Text enthält alle Daten , die das Frontend mit der Anfrage sendet, was unser Todo-Objekt ist Wir speichern sie in einer Variablen namens todo Danach protokollieren Sie diese Aufgabe einfach mit einem Punkt und antworten Sie anschließend mit dem Punkt, an den Sie uns senden Lassen Sie uns nun probieren, ob wir Daten in unserer todo-Variablen erhalten Daten in unserer todo-Variablen Bisher haben wir einfache Get-Anfragen von der Browser-URL gesendet, weil der Browser standardmäßig eine Get-Anfrage an die URL sendet, wir aber keine anderen SDDPRQuest-Anfragen über die Browser-URL senden können Dafür benötigen wir Frontend-Code, wir können API-Tasting-Software wie Postman verwenden, oder wir können auch eine VS-Code-Erweiterung namens Thunder Client verwenden eine VS-Code-Erweiterung Mit diesen drei Optionen Installation der VSCode-Erweiterung viel einfacher In diesem Kurs werden wir wahrscheinlich sowohl den Tender-Client als auch Postman verwenden , weil wir Advanced API probieren, wir brauchen Aber keine Sorge, beide Schnittstellen sind identisch. Die Hauptsache ist, dass wir in der Lage sein sollten , unsere API auszuprobieren, so einfach ist das. Gehen Sie von hier aus zu Extension Final und suchen Sie nach dem Thunder-Client und installieren Sie ihn Jetzt wurde in unserer Panel-Liste dieses Tender-Client-Symbol hinzugefügt. Also lass es uns öffnen. Und hier können wir unsere APIs für unser Projekt probieren. Also geben wir zunächst unsere API-URL ein, die SDDP lautet , Spalte doppelter Schrägstrich Lokaler Host, Spalte 3.000 Schrägstrich Spalte 3.000 Schrägstrich Und welche Methode wir brauchen, wir brauchen die Post-Methode. Also wählen wir hier post aus, und jetzt müssen wir das Todo-Objekt in unseren Anfragetext übergeben Dafür wählen wir hier Body und in der JSON-Option übergeben wir hier unsere Daten als Objekt Das erste Feld, das wir brauchen, ist Aufgabe. Wir müssen den Feldnamen in Doppelcodes übergeben und wir müssen auch den Wert in Doppelcodes übergeben. Das ist eine neue Aufgabe. falls Sie diese Füllungen nicht richtig sehen können, Und falls Sie diese Füllungen nicht richtig sehen können, schließen Sie dieses Gefängnis, indem Sie Strg plus B oder Befehl plus B verwenden . Danach benötigen wir ein weiteres Feld, das Tags ist, und wir übergeben hier ein Array, in dem wir zwei Werte übergeben, SGML und CSS Status und Wert, sagen wir, der letzte Füllvorgang . Nun, hier ist eine Sache. Dieser vollständige Name , also diese Aufgabe, Steuerstatus, diese Namen werden vom Backend-Entwickler festgelegt Welchen Namen auch immer der Bend-Entwickler definiert hat, Frontend-Entwickler sollte Daten mit demselben Feldnamen senden Andernfalls, wie wir im Backend Daten aus dem Hauptteil der Anfrage abrufen Um diese Postanfrage zu senden, klicken wir auf die Schaltfläche Senden Siehst du, wir haben nichts bekommen, und wenn wir unser Terminal checken, dann werden wir auch undefiniert Warum wir die Daten in unserem Anforderungspunkt-Body-Objekt nicht erhalten , was wir falsch machen Wenn das Frontend eine Post-Anfrage sendet, sendet es Daten im Hauptteil der Anfrage im JCN-Format, und genau das haben wir auch in unserer Testanfrage getan Standardmäßig weiß der Express-Server nicht, wie JSN-Daten automatisch liest und versteht Für Express benötigen wir einen Übersetzer, der diese JSN-Daten in ein einfaches Javascript-Objekt konvertiert ein einfaches Javascript-Objekt da wir nicht direkt mit JSN-Daten arbeiten Wir müssen es in ein Objekt oder ein Array konvertieren, was unser Javascript verstehen kann. Dafür haben wir eine Middleware in Express, die als Übersetzer fungiert Nach der Todos-Variablen fügen wir den App-Punkt U hinzu, und darin nennen wir unsere Middleware Express Dot JSN Stellen Sie sicher, dass Sie diese Middleware vor unseren APIs hinzufügen Außerdem müssen Sie sie Express Dot JS und Middleware nennen nennen Andernfalls wird es nicht funktionieren. Derzeit wird ohne diese Express-Dot-GSN-Middleware Request Dot Body als Lassen Sie uns nun die Änderungen speichern und erneut eine Post-Anfrage senden. Siehst du, jetzt bekommen wir den Hauptteil unserer Anfrage, genauso wie wir dieses Objekt senden. Das ist also die Bedeutung der Express Dot JSN-Middleware. Jetzt müssen wir nur noch dieses neue Todo zu unserem Todos-Array hinzufügen. Also verwenden wir hier die einfache Array-Methode, Todos Array Dot Push Dadurch werden neue Daten an der letzten Position des Arrays hinzugefügt. Und hier in der Push-Methode übergeben wir das Objekt, weil sich all unsere Todos im Objekt und wir für das Neue der gleichen Objektstruktur folgen müssen Zuallererst brauchen wir eine ID und wie können wir die bekommen, die wir nicht vom Frontend übergeben Also für die ID können wir so etwas tun. Wir werden die letzte Person dazu bringen, die ID zu machen und sie um eins erhöhen. Um den letzten Punkt in der Liste zu erledigen, schreiben wir ein Todos-Array in quadratische Paket-Todos-Array-Punktlänge, die derzeit drei ist Aber wir wissen, dass der Array-Index mit Null beginnt. Also müssen wir hier Länge minus eins angeben. Also dieses Tds-Array in eckigen Klammern, Tds-Array-Punktlänge minus eins, ist unser letztes Objekt, das wir ausführen, und wir wollen auf seine ID zugreifen Also fügen wir hier ID hinzu und erhöhen sie einfach um eins. Also, wenn unsere Pfeillänge drei ist, dann drei minus eins, was zwei ist, was der Index des letzten Elements ist. Und dann greifen wir auf seine ID zu und erhöhen sie um eins, was vier ist, so einfach ist das. Als Nächstes haben wir die Aufgabe erfüllt und wir übergeben den Wert, den wir aus dem Hauptteil der Anfrage erhalten, und für den Zugriff auf die Aufgabe und die Punktaufgabe. Als Nächstes haben wir Text, und wir übergeben den Wert an den Punkttext Zuletzt haben wir den Status, welcher ist was? Wir machen den Punktstatus. Ich glaube, das könnte dich verwirren. Wir definieren dieses Nut-Objekt separat. C Nu todo entspricht hier der Vergangenheit. Und bei der Push-Methode fügen wir das einfach neu hinzu Ich denke, das sieht klarer aus. Außerdem möchte ich Ihnen in jeder API am Ende der Callback-Funktion eine Sache sagen , wir müssen bei der Antwort Punkt sg Andernfalls läuft unsere Anfrage an unserem Frontend weiter, was unsere Gesamtgeschwindigkeit verringert Stellen Sie also sicher, dass wir in jeder API etwas zurückgeben. Sie fragen sich vielleicht, was wir von der Post-Anfrage zurückgeben sollen ? Aus der Post-Anfrage können wir kürzlich hinzugefügte Daten auf unserem Server in der Datenbank zurückgeben . Unser Frontend erhält also alle Informationen wie die ID und verwendet sie nach Belieben. Also hier geben wir einfach diese neue Aufgabe zurück , speichern die Änderungen und schauen uns das an, senden die Anfrage erneut und sehen, dass wir jetzt Daten mit der ID vier erhalten. Wenn wir all to do aus der Get-Anfrage C abrufen, erhalten wir vier Tu Dos Also erstellen wir erfolgreich eine Post-Anfrage und fügen unserem Tudos-Array ein neues Tudo Lassen Sie uns kurz zusammenfassen, was wir in dieser Lektion gelernt haben. Wir verwenden also die Post-Anfrage, um neue Daten auf dem Server zu erstellen, und wir erhalten diese neuen Daten aus dem Hauptteil der Post-Anfrage, die vom Frontend gesendet wird das zu testen, verwenden wir diese Tender-Client-Erweiterung und senden unsere Daten in jcnfMat , dem gängigen Format für das Jetzt müssen wir im Backend diese Daten in ein einfaches Javascript-Format konvertieren diese Daten in ein einfaches Javascript-Format Deshalb verwenden wir Express D JCNMddleware und Express D JCNMddleware Ohne diese Express Dot JcnMddleware erhalten wir den Text der Anfrage als undefiniert. Danach fügen wir die neuen Daten in ein separates Objekt ein, wobei alles gefüllt ist, und übertragen sie dann einfach in das Tudou-Array und geben am Ende die neu hinzugefügten Daten aus dem Antwortpunkt SN zurück So einfach ist das. In der nächsten Lektion werden wir diese Post-Anfrage verbessern. 35. Validierung von Benutzerdaten: Derzeit sendet unser Frontend alle Daten, die sie senden möchten Aber was ist, wenn jemand die erforderlichen Daten wie Tas-Text oder Textarray oder Status nicht sendet die erforderlichen Daten wie Tas-Text oder Textarray oder Status Ohne sie können wir unserem Speicher keine unvollständigen Daten hinzufügen . Das ist schlecht für unsere Anwendung. In diesem Fall müssen wir also eine Datenvalidierung in unserer API hinzufügen. Zu Beginn unserer API werden wir also überprüfen, ob das Frontend alle erforderlichen Daten weitergibt oder nicht. Wenn es nicht die richtigen Daten weitergibt, beenden wir die Anfrage sofort mit der richtigen Fehlermeldung. Lass mich dir zeigen, was ich meine. Hier, nachdem wir die Daten aus dem Hauptteil der Anfrage erhalten haben, fügen wir eine einfache Bedingung hinzu. Wenn Todo Dot Task nicht verfügbar ist, geben wir von hier aus einen Fehler zurück In den Cali-Klammern schreiben wir also Antwort, Punkt, Aufgabe zum Senden ist erforderlich Jetzt ist hier eine Sache. Selbst wenn wir hier response dot send schreiben, funktioniert unser restlicher Code auch. Um die Ausführung des Codes von hier aus zu beenden, müssen wir hier return hinzufügen. Ohne diese Rückgabe wird unser verbleibender Code trotzdem ausgeführt. Vergiss nicht, Return hinzuzufügen. Lassen Sie uns das jetzt duplizieren, ich blockiere noch zweimal mit Sift plus Alter plus Abwärtspfeil oder Sift plus Option plus Abwärtspfeil Jetzt ändern wir einfach die Bedingung für Text in Punkttext und ändern die Fehlermeldung Texte sind erforderlich. Und um den Punktstatus zu erreichen, ist schließlich ein Status erforderlich. Außerdem können wir hier weitere Bedingungen überprüfen, z. B. sollte Text ein Array sein oder der Aufgabenwert sollte mehr als drei Zeichen enthalten usw. Im Moment wollen wir diese Komplexität nicht, also lassen Sie uns diese Implementierung probieren Speichern Sie die Änderungen, öffnen Sie den Beitragsgeschmack und wir entfernen diese Aufgabe einfach. Senden Sie die Anfrage und sehen Sie, hier bekommen wir diese Nachricht. Aufgabe ist erforderlich. Wunderschön. Jetzt Frontend, müssen Sie nur diese Fehlermeldung auf dem Formular oder an einer beliebigen Stelle anzeigen. Auf diese Weise können wir die Daten unserer Eingabefelder manuell validieren. Dies sind jedoch nur drei Füllungen. Stellen Sie sich vor, wir haben sieben bis acht Felder und für jedes Feld möchten wir Daten validieren. Dann müssen wir diese Bedingung sieben- bis achtmal schreiben . Gibt es eine andere Möglichkeit, das zu tun? Ja. Haben Sie eine spezielle Bibliothek zur Validierung der Benutzerdaten Die erste ist Freude. Dies ist eine der beliebtesten und robustesten Datenvalidierungsbibliotheken in Node JS, und wir werden Joy in diesem Kurs auch für die Datenvalidierung verwenden . Außerdem gibt es noch andere Bibliotheken wie Yap und Validator Dot JS Sie können jede dieser Bibliotheken verwenden. Ich persönlich mag Freude, und wir werden Freude beim nächsten Projekt nutzen. Derzeit liegt unser Hauptaugenmerk auf der Erstellung von Crowd-APIs, was bedeutet, APIs zu erstellen, zu lesen, zu aktualisieren und zu löschen. 36. Statuscode übergeben: Wenn wir jetzt einen Fehler vom Server zurückgeben, ist es besser, den Fehlercode auch mit dieser Fehlermeldung zu übergeben . Durch diesen Fehler- oder Statuscode erhält unser Frontend Informationen über den Erfolg oder Misserfolg der SddprQuest Möglicherweise wissen Sie bereits davon, oder Sie haben diesen Fehler gesehen Wenn wir beispielsweise eine Webseite nicht gefunden haben, wissen Sie, dass auf einigen Websites die Seite 404 „Nicht gefunden“ angezeigt wird. Dieser 404 ist der Fehler- oder Statuscode für „Nicht gefunden“. Sehen Sie sich den häufigsten Fehler- oder Statuscode für SddprQuest an. Der erste ist 200, was alles „o“ bedeutet. Dies ist der Standardstatuscode , der von unserer Express-Anwendung gesendet wurde In unserer Anfrage können Sie auch sehen, dass wir den Status 2000 erhalten. Als Nächstes haben wir den Code 201, was bedeutet, dass er erfolgreich erstellt wurde. Wenn wir neue Daten auf unserem Server erstellen, können wir diese Daten mit dem Statuscode 201 zurückgeben. Sie sagen, in welcher HTTP-Methode wir den Statuscode auf 01 zurücksetzen können, schreiben? In der Post-Anfrage, ob unsere Daten erfolgreich erstellt wurden. Als Nächstes haben wir den Status 400, was bedeutet, dass die Anfrage besser vom Frontend ausgeführt wird. Dazu gehören einige fehlende oder ungültige oder nicht autorisierte Zugriffsanfragen. Und ja, zur Datenvalidierung geben wir eine Fehlermeldung mit diesem 400-Statuscode zurück. Als nächstes haben wir 404, was bedeutet, dass wir nicht gefunden wurden. Nehmen wir an, wir senden eine Get-Anfrage, um die Single mit der ID zehn zu tun zu bekommen. Nun, das ist in unseren Daten nicht verfügbar. Zu diesem Zeitpunkt können wir also eine Antwort mit dem 404-Statuscode senden . Ein weiterer wichtiger Statuscode ist 500, was einen internen Serverfehler bedeutet. Angenommen, wir erhalten einen Fehler beim Erstellen der neuen Aufgabe auf diesem Server. Zu diesem Zeitpunkt werden wir dann eine Antwort mit dem Statuscode 500 zurückgeben . Es gibt viele Statuscodes, aber im Moment sind diese am nützlichsten. Sie sich mit der Übung keine Sorgen, Sie werden sich all diese Statuscodes merken. Um den Statuscode mit unserer Antwort zu übergeben, können wir hier mehrere Cursor hinzufügen. Drücken Sie also Alt oder Option und klicken Sie einfach auf die Stelle, an der wir mehrere Cursor haben möchten. Und hier fügen wir den Punktstatus hinzu, und in diesem Statuscode wollen wir ungültige Daten übergeben. Wir haben 400 überschritten und das war's. Drücken Sie SCAP, um mehrere Cursor zu entfernen und damit wir den Datencode mit unserer Anfrage übergeben können Wenn wir erfolgreich Daten erstellt haben, geben wir außerdem die Antwort mit Stas 201 zurück Bewahren Sie den Chan-Käse auf und sehen Sie sich das an. Senden Sie die Anfrage erneut und sehen Sie, hier erhalten wir den Fehlerstatuscode 400 Bad Request. Wunderbar. 37. res.send und res.json: Bis jetzt senden wir die der Methode response dot send Diese Antwortpunkt-Sen-Methode wird jedoch für allgemeine Zwecke verwendet, was bedeutet, dass wir mit dieser Antwortpunkt-SN-Methode jede Art von Inhalt wie Klartext, SDML oder auch JSON-Daten senden können SDML oder auch JSON-Daten senden können Wenn wir jetzt eine API im Knoten erstellen, möchten wir meistens Daten in der JsnfMat zurückgeben, weil sie viel einfacher zu handhaben sind Hier in der Antwort haben wir eine weitere Methode namens Response Dadurch werden unsere Daten automatisch in den jcnfMat konvertiert und gesetzt Header-Inhaltstyp auf Anwendungs-Slash-JSON Machen Sie sich keine Sorgen, wenn Sie den Header-Inhaltstyp nicht kennen Das werden wir im nächsten Abschnitt sehen Wir werden Response Dot Send für einfache Antworten verwenden, unabhängig davon, ob es sich um Text, SDML oder Objekte handelt, und wir werden Response Dot JSN verwenden wenn wir sicherstellen möchten, dass die Antwort im JSN-Format vorliegt und für JSN-Clients richtig formatiert ist und für JSN-Clients richtig formatiert Beide funktionieren fast gleich. Für JSN-Daten ist der Antwortpunkt GSN jedoch praktischer In der ersten GAD-Anfrage möchten wir einen Klartext senden Wir verwenden hier den Antwortpunkt SN. Danach wollen wir ein Array an ein Do-Array senden, sodass wir als Nächstes den Antwortpunkt JSN verwenden können. Außerdem wollen wir ein Objekt senden und dann, was wir verwenden werden Wir verwenden Response Dot JSN, lassen Sie uns auch diese Konsole entfernen. Wir benötigen keine Konsolen auf unserem Server. Es ist nur zum Testen. Als Nächstes geben wir hier einen Fehler zurück. Zuerst ändern wir das Senden mit JSN JSON und JSN. Es ist besser, diesen Fehler im Objekt zu übergeben Wickeln Sie diese Zeichenfolge in ein Objekt ein und fügen Sie einfach die Nachrichteneigenschaft und den Doppelpunkt hinzu Das Gleiche tun wir für diesen Fehler und auch für diesen letzten Fehler. Und wenn wir erfolgreich ein neues To-do-Objekt erstellt haben, geben wir das neue To-do-Objekt zurück. Also ändern wir auch den Sand mit JSON. Stellen Sie sicher, dass Sie in der Antwort-JN-Methode keinen Klartext übergeben . Es wird Ihnen einen Fehler geben. Speichern Sie die Änderungen und gehen Sie in den vorherigen Tests zum Header-Bereich. Hier erhalten wir eine Reihe von Details, aber im Moment benötigen wir diesen Inhaltstyp. Siehst du, es ist auf Text STML eingestellt. Lassen Sie uns nun eine weitere ungültige Post-Anfrage senden. Sehen Sie, hier erhalten wir ein Objekt das wir mit der Nachrichteneigenschaft senden, und wenn wir jetzt unseren Inhaltstyp überprüfen, sehen wir, dass er auf JSON gesetzt ist. Verwenden Sie Response Dot Send für Klartext oder DML und Response Dot JSN für das Senden von GSN-Daten 38. Einzelnes Todo mit PUT-Request aktualisieren: Lassen Sie uns nun eine API für die Aktualisierung unseres einzelnen Todo erstellen. Angenommen, wir möchten den Text der Aufgabe aktualisieren oder wir möchten den Status aktualisieren Hier möchten wir also kleine Details zu unseren aktuellen Daten aktualisieren, oder wir können auch alle Informationen aktualisieren. Es ist also besser, hier eine Anfrage stellen zu verwenden. Sie können auch Ihre Seitenmethode verwenden. Es ist völlig in Ordnung. Also die App nicht den 0,2-Schrägstrich Todos eintragen. Jetzt brauchen wir hier die Todo-ID, die wir aktualisieren wollen. Wir fügen hier den Routenparameter Calm ID hinzu. Danach fügen wir Callback-Funktion mit Anfrage und Antwort Lassen Sie uns nun zunächst den ID-Parameter abrufen. cSID entspricht der ID der Anfrage mit den Punktparametern. Wir wissen, dass es sich bei dieser ID um eine Zeichenfolge handelt, also umschließen wir sie mit der Parse-Integer-Funktion Unsere erste Aufgabe besteht darin, herauszufinden , welches Element des Arrays diese ID hat Und dann können wir anhand dieses Elementindex andere Werte sehr einfach ändern. den Index zu finden, verwenden wir also die Todos Array Dot Find Index-Methode Hier erhalten wir ein einzelnes Objekt, das zu tun ist, und dann übergeben wir Bedingung T, dass ID unserem ID-Parameter entsprechen sollte Dieser Ausdruck gibt den Index des Elements zurück, also speichern wir ihn in einer Variablen namens to do index Was ist, wenn der Benutzer die ID weitergibt, die in unserem Array nicht verfügbar ist? Zu diesem Zeitpunkt wird dieser Todo-Indexwert minus eins, weil diese gute Indexmethode minus eins zurückgibt , wenn Sie den Todo-Index nicht gefunden haben Hier übergeben wir, ob die Bedingung für die Indexerstellung gleich minus eins ist Dann geben wir den Antwortstatus 404 zurück, nicht gefunden wurde , und dann den Punkt Json und wir senden das Objekt mit der Eigenschaftsnachricht und geben hier einfach die Nachricht zurück, dass nicht gefunden wurde Stellen Sie sicher, dass Sie hier diese Rückgabe hinzufügen. Großartig. Angenommen, wir haben einen Todo-Index gefunden, dann müssen wir die Felder dieses Elements mit unseren neuen Daten aktualisieren, die mit der API-Anfrage übergeben wurden Am Anfang holen wir uns also zuerst Daten aus dem Hauptteil der Anfrage und speichern dieses Objekt in der Todo-Variablen Anstatt drei verschiedene Variablen zu definieren, können wir hier die Objektdestrukturierung verwenden An der Stelle des Variablennamens können wir einfach CLI-Klammern hinzufügen und unsere Eigenschaftsnamen schreiben, die im Hauptteil der Anfrage übergeben wurden Zuerst erhalten wir die Aufgabe, dann den Text und dann den Status. Und das ist alles. Diese einzelne Codezeile funktioniert genauso wie diese drei Codezeilen. Jetzt im Update, nicht jedes Mal, wenn wir Aufgabe ändern oder wir ändern nur Daten Wir können jede dieser drei Eigenschaften ändern, und unser Frontend sollte nur die Eigenschaften im Hauptteil der Anfrage übergeben nur die Eigenschaften im Hauptteil der , die sie ändern möchten Also hier können wir so etwas machen. Wenn die Aufgabe verfügbar ist, haben wir das Array so aktualisiert, Indexpunktaufgabe der Aufgabe entspricht. Wenn diese Aufgabe also in der Hauptanforderung verfügbar ist, aktualisiert Line die Aufgabeneigenschaft nur dann. Lassen Sie uns das, was ich konditioniere, noch zweimal duplizieren. Lassen Sie uns diese Aufgabe durch Tags, Tags und Tags ersetzen. Außerdem dieser eine Status, Status, hier ist der Status, und das war's. Außerdem fehlt uns hier eine Sache. Können Sie mir sagen, dass wir am Ende dieser Funktion eine Antwort zurückgeben müssen. Antwortpunkt Json und hier senden wir unser aktualisiertes To-Do-Objekt. Todos-Array im quadratischen Paket, Todo-Index. Speichern Sie die Änderungen und lassen Sie uns diese Implementierung probieren. Gehen Sie also zum Thunder Client und erstellen Sie eine neue Anfrage Schreiben Sie unseren Endpunkt, also SDDP Local Host, Spalte 3.000, Spalte 3.000 Hier übergeben wir die Todo-ID. Sagen wir eins Ändern Sie diese Get-Methode in die Put-Methode und lassen Sie uns Daten in den Anforderungstext übergeben. Das Objekt mit der Eigenschaft task und dem entsprechenden Wert ist die aktualisierte Aufgabe. Und senden Sie einfach die Anfrage. Siehst du, hier bekommen wir die aktualisierten Daten. Und wenn wir hier die ID Ten weitergeben und die Anfrage abschicken, dann bekommen wir hier die Fehlermeldung Not Found. Sie können sehen, wie einfach es ist, eine PI zu erstellen. Wenn Sie also Ihren Test speichern möchten, drücken Sie Control plus oder Command plus. Von hier aus können wir auch unsere Testanfrage Update todo umbenennen 39. Übung Bestimmtes Todo löschen: Jetzt ist es Zeit für eine interessante Übung. Sie müssen eine API erstellen, um die spezifische Aufgabe anhand ihrer ID zu löschen. Das ist eine sehr einfache Übung. Bewegung hilft Ihnen, schnell zu lernen und Ihr Selbstvertrauen zu stärken. Auch wenn Sie nicht die gesamte Übung abschließen können, versuchen Sie zumindest, sie zu lösen, denn so wissen Sie, an welchem Teil Sie mehr arbeiten müssen. Probiere es aus und was ist dann die Lösung. Ich hoffe also, dass Sie diese Übung lösen oder zumindest versuchen, sie zu lösen. Lassen Sie uns jetzt schnell die Lösung sehen. Hier definieren wir also eine neue API mit App Dot Tilt, weil wir hier Daten löschen, Endpunkte für Slash-Callan-ID, Rückrufanfrage, Antwort Zunächst erhalten wir die ID aus dem Routenparameter. Const ID entspricht also der Anforderung von Punktparametern und Punkt-ID und umschließt es einfach mit der Parse-Integer-Funktion Dieses Parse-Integer-Verfahren ist sehr nützlich, denn wenn ich Node Jaz lerne, wiederhole ich diesen einen Fehler oft Achte darauf, dass du diesen Fehler nicht wiederholst. Auch hier müssen wir zuerst den Index des Todo-Objekts finden, das diese ID hat Aus der Put-Methode kopieren wir also diese Variablenzeile, und wir kopieren auch diese Bedingung für nicht gefunden und fügen sie in unsere Methode delete Danach müssen wir diese spezifische Aufgabe einfach aus unserem Todos-Array entfernen spezifische Aufgabe einfach aus unserem Todos-Array Dafür verwenden wir die Todos-Array-Punktsplice-Methode. Dabei müssen wir zwei Argumente übergeben. Erstens, welchen Index wir entfernen wollen, welcher ist dieser Index. Das zweite Argument ist, wie viele Elemente wir aus diesem Index entfernen wollen. Nehmen wir an, wir haben den Indexwert zwei und hier übergeben wir drei. Diese Spleißmethode entfernt drei Elemente mit dem Index zwei und auch das Element mit den Indizes drei und vier In unserem Fall wollen wir nur dieses einzelne Element entfernen, wir übergeben hier eines und am Ende geben wir einfach den Antwortpunkt Json zurück und hier übergeben wir die Erfolgsmeldung, das Objekt mit der Nachrichteneigenschaft und Wert zwei wurden erfolgreich gelöscht Speichern Sie die Änderungen und lassen Sie uns auch diese Löschanfrage probieren. Erstellen Sie eine neue Anfrage, ändern Sie die URL in STP, Spalte mit doppeltem Schrägstrich, lokaler Host, Spalte 3.000 Schrägstrich Studo Lassen Sie uns die Aufgabe mit der ID eins löschen Wählen Sie die Methode zum Löschen aus. Hier möchten wir nichts in unseren Anfragetext weiterleiten . Senden Sie diese Anfrage. Siehst du, hier erhalten wir eine Erfolgsmeldung, was bedeutet, dass unsere erste Aufgabe aus unserem To-DOS-Array entfernt wurde. Wenn wir nun erneut die Anfrage mit derselben ID senden, sehen Sie, hier werden wir nicht gefunden. Y. Sie können sehen, dass das Erstellen von APIs nicht so schwierig ist Und in diesem Abschnitt haben wir Get-, Post-, Put-, Delete- und All-Crud-APIs erstellt Post-, Put-, Delete- und All-Crud-APIs Ich hoffe also, Sie verstehen, wie man Express verwendet und Raised APIs mit Express erstellt Im nächsten Abschnitt werden wir nun einige fortgeschrittene Konzepte von Express kennenlernen einige fortgeschrittene Konzepte von Express sehen uns im nächsten Abschnitt. 40. Abschnitt 05 - Einführung von Middleware: Willkommen zum fünften Abschnitt des ultimativen NodeJS-Kurses In diesem Abschnitt dreht sich alles um fortgeschrittene Express - und Node-Konzepte Wir beginnen mit Middleware, verschiedenen Arten von Middleware, Arbeit mit unterschiedlichen Umgebungen wie Entwicklung oder Produktion, Template-Engines und der professionellen, umfassenderen Struktur der Node-Anwendung Fangen wir mit Middleware an. Was ist Middleware? In Express ist Middleware eine Funktion, die entweder die nächste Middleware-Funktion aufruft oder eine Antwort sendet eine Antwort In einfachen Worten, unabhängig davon, welche Funktion die nächste Middleware-Funktion aufruft oder eine Antwort sendet, um die Anfrage zu beenden, wird diese Funktion eine Antwort sendet, um die Anfrage zu beenden, als Middleware bezeichnet. Lassen Sie mich Ihnen jetzt eine Frage stellen. Denken Sie an diese Callback-Funktion, die wir hier übergeben. Können wir diese Funktion als Middleware bezeichnen? Ja, weil diese Funktion eine Antwort sendet, um diese Gad-Anforderung zu beenden Wenn unser Frontend Anfragen an einen beliebigen API-Endpunkt sendet, durchläuft diese Anfrage einen Tunnel oder Pipeline, in der alle unsere Middleware-Funktionen angeordnet sind Diese Pipeline wird als Pipeline zur Anforderungsverarbeitung bezeichnet. Nehmen wir an, wir definieren Middleware eins, Middleware zwei und letzte Middleware drei sendet eine Antwort, um die Anfrage zu beenden und letzte Middleware drei sendet sendet Wenn das Frontend nun eine API-Anfrage sendet, zuerst diese Middleware-One-Funktion Danach leitet Middleware 2 unsere Anfrage an NST-Middleware 2 weiter, und nach Abschluss der Ausführung leitet Middleware 2 diese Anfrage an Middleware 3 weiter, Middleware 2 diese Anfrage an Middleware 3 weiter die die Antwort sendet und nach Abschluss der Ausführung leitet Middleware 2 diese Anfrage an Middleware 3 weiter, die die Antwort sendet. Unser Server wird diese Reihenfolge beibehalten. Wenn wir in Middleware eins einen Fehler erhalten, anderen beiden Middlewares So einfach ist das. Hier sind einige allgemeine Aufgaben für Middleware Erstens wird es verwendet, um die Anforderungsdetails zu protokollieren. Es wird auch verwendet, um zu überprüfen, ob der Benutzer , der die Anfrage gesendet hat, angemeldet ist oder nicht. Dies ist der häufigste und beste Anwendungsfall für Middleware. Keine Sorge, das werden wir im Abschnitt Benutzerauthentifizierung sehen Benutzerauthentifizierung letzte häufige Aufgabe für Middleware ist nun die Weitergabe der eingehenden Daten. Wir haben es schon getan Denken Sie daran, dass es sich bei diesem Pressepunkt JCN um eine Middleware-Funktion handelt, die die eingehenden Daten in das JSON-Format übergibt und dann unsere Anfrage an die nächste Middleware-Funktion weiterleitet, bei der es sich um diese Hauptfunktion handelt Jetzt fragen Sie sich vielleicht, warum wir diese Middleware brauchen? Können wir den gesamten Code in einer einzigen Funktion schreiben? Stellen Sie sich dafür vor, wir erstellen Bend für Social-Media-Anwendungen. Habe eine API, die verwendet wird , um einen neuen Beitrag zu erstellen. Jetzt wollen wir eine Bedingung für diese Anfrage festlegen. Nur angemeldete Benutzer können einen neuen Beitrag erstellen. Wenn der Benutzer nicht angemeldet ist, geben wir eine Fehlermeldung zurück Bitte melden Sie sich mit Ihrem Konto an. Jetzt haben wir eine weitere API, Likes zum einzelnen Beitrag hinzugefügt werden können. In dieser API möchten wir auch die gleiche Bedingung haben, dass sich der Benutzer anmelden muss. Hier müssen wir denselben Code erneut hinzufügen. Anstatt diesen gesperrten Bestätigungscode zu wiederholen, können wir ihn jetzt diesen gesperrten Bestätigungscode zu wiederholen, in einer Middleware-Funktion definieren und diese Middleware einfach für alle gesicherten APIs hinzufügen Auf diese Weise müssen wir unseren Code nicht wiederholen. Da wir Middleware verwenden, teilen wir unseren Code in kleine Teile auf, wodurch unser Code sauber und lesbarer wird Außerdem können wir mithilfe von Middleware verhindern, dass unerwünschte Benutzer Zugriff auf geschützte Routen Um es kurz zusammenzufassen: Middleware ist eine Funktion, die entweder die nächste Middleware-Funktion aufruft und eine Antwort auf die aktuelle Anfrage sendet Wir können sehen, dass Middleware für jede Node-Anwendung sehr nützlich ist . In der nächsten Lektion werden wir also sehen, wie man Middlewares erstellt 41. Erstellen benutzerdefinierter Middleware: Lassen Sie uns nun unsere eigene benutzerdefinierte Middleware erstellen. Es ist wirklich aufregend und einfach. Hier in unserer Anwendung haben wir also bereits Express Dot Json Middleware mit App Punkt U hinzugefügt mit App Punkt U Danach fügen wir eine weitere AbdtuUse-Methode hinzu, und darin werden wir unsere Middleware-Funktion Diese abdTUSE-Methode wird also verwendet, um Middleware global zu unserer Pipeline für die Bearbeitung von Anfragen hinzuzufügen . In dieser Use-Methode übergeben wir nun die Callback-Funktion wir Diese Colbec-Funktion hat drei Parameter Request Response und Next Jetzt fragen Sie vielleicht, wir kennen Anfrage und Antwort. Aber was ist der nächste Parameter? Dieser nächste Parameter wird verwendet, um die nächste Middleware-Funktion aufzurufen In dieser Callback-Funktion schreiben wir nun unsere Logik. Nehmen wir an, wir möchten unsere Anforderungsmethoden und Endpunkte in der Konsole protokollieren In der Vorlagenzeichenfolge fügen wir Dollar-C-Klammern, Anforderungspunktmethode und Dollar-Klammern die Anforderungspunkt-URL Jetzt ist hier eine Sache. In jeder benutzerdefinierten Middleware, die wir im letzten Teil definieren, müssen wir diese nächste Funktion aufrufen Andernfalls bleibt unsere Anfrage in dieser Middleware hängen und der Benutzer erhält keine Antwort Lassen Sie mich Ihnen das praktisch zeigen. Speichern Sie die Änderungen und kehren Sie zu unserem Tunder-Client zurück. Lassen Sie mich diese Anfrage öffnen und die Anfrage senden. Oh, tut mir leid, ich habe vergessen, diese Anwendung mit Nodemon auszuführen Stellen Sie sicher, dass Ihre Anwendung auch im Terminal läuft Nodemon Index Dot js, gut. Jetzt senden wir diese Anfrage. Sehen Sie, dass sie bearbeitet wird. Und wenn wir unser Terminal C öffnen, erhalten wir hier die Konsole dieser Anfrage, was beweist, dass unsere Middleware-Funktion aufgerufen wird Unsere aktuelle Pipeline zur Bearbeitung von Anfragen sieht also so aus. Zuerst haben wir benachbarte Middleware ausgedrückt, dann haben wir benutzerdefinierte Middleware und dann haben wir die letzte Middleware-Funktion, die die Antwort zurückgibt dann haben wir benutzerdefinierte Middleware und dann haben wir die letzte Middleware-Funktion, die die Antwort zurückgibt. Wenn wir hier nicht die nächste Middleware-Funktion aufrufen, stecken wir unsere Anfrage hier in dieser Middleware fest und sie zeigt uns den Verarbeitungsstatus, wodurch unsere gesamte Anwendung langsam wird stecken wir unsere Anfrage hier in dieser Middleware fest und sie zeigt uns den Verarbeitungsstatus, wodurch unsere gesamte Anwendung langsam wird. Denken Sie deshalb bei jeder benutzerdefinierten Middleware immer daran, dass es notwendig ist, die nächste Middleware-Funktion aufzurufen , sonst geben wir die Antwort Hier rufen wir die nächste Middleware-Funktion auf, speichern die Änderungen und schauen uns das an Wenn wir die Anfrage nun erneut senden, sehen Sie, hier erhalten wir die Antwort und in der Konsole erhalten wir auch das Anforderungsprotokoll So einfach ist es, unsere benutzerdefinierte Middleware-Funktion zu definieren Ich weiß, dass dies eine sehr einfache Middleware-Funktion ist, aber in Zukunft werden wir eine benutzerdefinierte Middleware erstellen, die überprüft, ob unser Benutzer Wenn wir unsere Middleware mithilfe der App Dot Use-Methode definieren, gilt diese Middleware außerdem für alle API-Aufrufe , genau wie diese Express-Dot-JSON-Middleware . 42. Integriert in Middleware: Express, wir haben nur sehr wenige integrierte Middlewares. Wir verwenden bereits eine der integrierten Middlewares, nämlich Express Dot JSON Diese Middleware leitet unsere Anforderungstextdaten in das JSN-Format Ohne diese Middleware können wir keine Daten in den Hauptteil der Anfrage übertragen Erinnerst du dich, dass wir nichts im Request Dot Body haben? Jetzt ist eine weitere nützliche integrierte Middleware URL-kodiert. Dies ist eine ähnliche integrierte Middleware wie Express Middleware Express Dot JSN Middleware wird verwendet, um JSNData zu übergeben, und Press Dot URL-codierte Middleware, die verwendet wird, um URL-kodierte Daten zu übergeben. Dieses URL-kodierte Datenformat wird normalerweise verwendet, wenn Daten mithilfe Daten der POST-Methode über einfache SML-Formulare gesendet werden. In einfachen Worten, diese beiden Middlewares werden verwendet, um Daten aus der Anfrage zu extrahieren Wenn Erquest über JCNData verfügt, verwendet Express JCN-Middleware , und wenn unsere Anfrage Daten im URL-codierten Format enthält, verwendet Express diese URL-kodierte Daten im URL-codierten Format enthält, verwendet Express diese URL-kodierte Middleware. Middleware-Funktionen vereinfachen den Zugriff auf Anforderungsdaten, sodass wir sie nicht manuell analysieren müssen, Zugriff auf Anforderungsdaten, sodass wir sie nicht manuell analysieren müssen, so einfach ist das. Lassen Sie uns nun sehen, wie Sie unserer Anwendung URL-kodierte Middleware hinzufügen URL-kodierte Middleware . Es ist wirklich einfach Wir fügen hier app.us hinzu und rufen darin die Express-Punkt-URL-kodierte Funktion Speichern Sie die Änderungen und lassen Sie uns sehen, ob diese Middleware Wir gehen zur Post-Anfrage. Bisher haben wir Daten in diesem JSON-Format gesendet. Jetzt haben wir hier eine weitere Option, die formularcodiert ist. Hier übergeben wir Daten in einem Schlüssel-Wert-Paar wie bei einer Aufgabe und hier fügen wir unseren Text Das ist eine neue kodierte Aufgabe. Danach wollen wir Text übergeben, der ein Array ist , und darin übergeben wir SDML und CSS Und zu guter Letzt wollen wir den Status übergeben, was auch getan werden muss. Lassen Sie uns jetzt einfach diese Anfrage senden. Siehst du, hier bekommen wir neue Daten, die mit dem Status 201 erstellt wurden, unsere URL-Kodierung funktioniert. Aber warte eine Minute. Hier bekommen wir diese seltsame Syntax dieses Arrays. Eigentlich ist es kein Array. Unser Server speichert dieses Array als Zeichenfolge. Siehst du, es ist in Doppelcodes codiert, was bedeutet, dass es eine Zeichenfolge ist. Warum das passiert. Wenn wir ein Array oder ein Objekt in einem formcodierten Format übergeben wollen, müssen wir zusätzliche Einstellungen in unserer Middleware hinzufügen Sie hier in der URL-codierten Middleware ein Objekt mit einer einzelnen Eigenschaft hinzu, Objekt mit einer einzelnen Eigenschaft hinzu Fügen Sie hier in der URL-codierten Middleware ein Objekt mit einer einzelnen Eigenschaft hinzu, die auf true erweitert wurde. Speichern Sie das. Und in der Post-Anfrage müssen wir dieses Array, anstatt es in einem einzigen Feld zu übergeben, in verschiedenen Füllungen übergeben. wie unser Array-Name tags ist, So wie unser Array-Name tags ist, schreiben wir Tags und fügen hier eckige Klammern hinzu, die darauf hinweisen, dass es sich um ein Array handelt, und dann übergeben wir Werte in mehreren Füllungen. Zuerst schreiben wir DML. Danach fügen wir ein weiteres Schlüssel-Wert-Paar hinzu, wiederum Tags, Square Packet, und wir schreiben einen weiteren Wert-CSS Endlich übergeben wir Tags, Square Packet und JavaScript. Jetzt verstehen Sie, warum Entwickler dieses formularkodierte Format nicht mehr verwenden JsnfMat ist viel einfacher weiterzugeben und zu probieren. Siehst du, jetzt bekommen wir unser Text-Array. Lassen Sie uns auch sehen, ob wir die erweiterte Eigenschaft aus der Middleware entfernen , obwohl sie noch funktioniert oder nicht. Ich will es nur sehen. Oh, es funktioniert nicht. Siehst du, hier bekommen wir Texte, die benötigt werden, was bedeutet, dass wir keine Texte bekommen. In früheren Node-Versionen könnte das funktionieren. Aber da wir ihre neueste Node-Version verwenden, funktioniert sie nicht, also ist es besser, sie auf True zu erweitern, so einfach ist das. Sie haben vielleicht Fragen , welche Middleware wir zu unserem Node-JS-Projekt hinzufügen sollen Express-Punkt-JCN oder Express-URL-codiert. In der modernen Welt verwenden 90% der Entwickler JsnfMat JSNMDdleware ist weit verbreitet. Wenn Sie jedoch nicht wissen, in welchem Format Ihr Frontend Anforderungsdaten sendet, JSN- oder formularcodiert, dann ist es für Sie von Vorteil, beide Middlewares hinzuzufügen 43. Freigeben statischer Dateien vom Server: Sehen wir uns eine weitere integrierte Middleware an, die zum Senden statischer Dateien vom Server verwendet wird Wenn Sie statische Dateien nicht kennen, dann sind statische Dateien einfach Assets die Frontend-Anforderungen erfüllen, wie SDML-Dateien, CSS-Dateien, JavaScript-Dateien, Textdateien, Bilder, Pfoten, PDF usw. Sie werden als statisch bezeichnet , weil unser Server diese Dateien nicht ändert oder verarbeitet, bevor er sie an den Client sendet Beispiel: Wir haben das Logo unseres Unternehmens auf dem Server. Wir senden diese Logodatei an unser Frontend und das Frontend wird auf der Website angezeigt. Jetzt denken Sie vielleicht, dass wir eine statische Datei auf dem Server haben . Wie können wir sie teilen? Keine Sorge, es ist wirklich einfach. Lass mich dir das zeigen. Hier verwenden wir App Dot UG. nun die statischen Dateien vom Server aus zu teilen, müssen wir eine weitere integrierte Middleware namens Press Dot Static verwenden Middleware namens Press Dot In dieser Funktion müssen wir den Ordnernamen übergeben , den wir teilen möchten Am häufigsten nannten Entwickler es öffentlich. Sie können es nennen, wie Sie wollen, aber öffentlich ist eine gängige Konvention. Sie fragen sich vielleicht, wir haben diesen öffentlichen Ordner nicht in unserem Projekt, also müssen wir ihn mit dem Namen public erstellen. Stellen Sie sicher den gleichen Namen eingeben, den Sie Ihrem Ordner geben, und stellen Sie außerdem sicher, dass dieser Ordner im Stammverzeichnis des Projekts verfügbar ist, nicht in einem anderen Ordner. Zur Demo werden wir hier jede Art von Datei oder Bild hinzufügen. Also hier habe ich dieses Bild. Ich lade das herunter und füge es meinem öffentlichen Ordner hinzu. Und lassen Sie uns diese Datei in Fire Watch oder wie auch immer Sie sie nennen möchten umbenennen . Gut. Jetzt, da wir unseren öffentlichen Ordner als statisch festlegen, können wir auf alle Dateien zugreifen , die in diesem Ordner verfügbar sind. Öffnen Sie also einen Browser, und hier schreiben wir unsere Basis-URL, die Spalte für den lokalen Host, einen Schrägstrich mit 3.000 Schrägstrich Und danach können wir unseren Dateinamen schreiben, auf den wir zugreifen möchten, Firewach Punkt P. Wenn Ihre Bilddateierweiterung PNG oder JPG ist, müssen Sie dieselbe Dateierweiterung schreiben Hier, ich verstehe die Datei nicht. Was ist falsch? Oh, wir haben vergessen, diese Änderungen zu speichern. Versuchen Sie jetzt erneut, auf diese Datei zuzugreifen. Siehst du, hier bekommen wir unser Bild. Also werden wir alle unsere statischen Dateien in den öffentlichen Ordner legen und wir können hier direkt darauf zugreifen. Unser Frontend verwendet diese URL um Bilder, Figuren oder ähnliches anzuzeigen Außerdem können wir in unserer Anwendung einen oder mehrere statische Ordner definieren Wie einige Entwickler gerne den Assets-Ordner hinzufügen, damit wir diese Middleware duplizieren und den Ordnernamen einfach durch Assets ersetzen können ersetzen Stellen Sie einfach sicher, dass der Ordner im Stammverzeichnis verfügbar ist. Jetzt fügen viele Entwickler gerne ein Präfix für den statischen Dateipfad hinzu. Derzeit greifen wir direkt nach der lokalen Host-Spalte 3.000 auf unsere statischen Dateien zu. Wenn Sie ein Präfix hinzufügen, wird es so aussehen. Lokale Host-Spalte 3.000, Schrägstrich Statischer Schrägstrich Firewatch Web P oder lokale Host-Spalte 3.000 OTRs Firewatch Lassen Sie mich Ihnen zeigen, wie wir das machen können. Dafür fügen wir einfach unser Präfix vor unserer statischen Express-Middleware Wenn sich das ändert, wenn wir unsere Seite aktualisieren, sehen Sie, wir bekommen hier keine statische Datei. Wir müssen Autar zur URL hinzufügen, und jetzt erhalten wir unsere statischen Dateien So können wir statische Dateien vom Server teilen. Lass mich dir jetzt ein wenig Übung geben. Fügen Sie dem Ordner Assets eine statische Datei hinzu und greifen Sie einfach im Browser mit dem Präfixprofil auf diese Datei zu. Ich weiß, dass du das kannst, also zeige ich dir nicht die Lösung. Es ist wirklich einfach. 44. Nützliche Middleware von Drittanbietern: Sehen wir uns einige nützliche Middleware von Drittanbietern an. Wir nennen sie Middleware von Drittanbietern weil sie von Drittanbietern erstellt wurde Der erste ist Morgan. Diese Middleware ist die beliebteste Middleware von Drittanbietern für die Protokollierung der SDDPR-Anfrage für Jetzt, als ich Node Has gelernt habe, habe ich diese Frage. Warum wollen Entwickler die SDP-Anfrage protokollieren? Was erhalten sie, wenn sie einfach die SDP-Anfrage protokollieren? Ich weiß, dass Sie dieselbe Frage haben. Wenn wir die SDP-Anfrage mit Morgan protokollieren, können wir weiterhin verfolgen, welche API länger aufruft Welche API benötigt mehr Zeit, um zu antworten, wie viele API-Aufrufe werden ausgeführt, die schwache API debuggen und viele weitere Vorteile In der Regel können Entwickler ihre APIs überwachen, debuggen und verbessern, indem sie die SDP-Anfrage protokollieren können Entwickler ihre APIs überwachen, debuggen und verbessern Sehen wir uns nun an, wie wir die SDP-Anfrage mit Morgan protokollieren können die SDP-Anfrage mit Morgan Hier ist ein Morgan-Paket. C, es hat 4 Millionen monatliche Downloads, was verrückt ist. Und wie wir wissen, verwenden wir diesen Befehl für die Installation des Morgan-Pakets Kopieren Sie das einfach und beenden unsere Anwendung mit Control plus C und fügen Sie sie in unser Terminal ein. Gut. Lassen Sie uns jetzt unsere Anwendung erneut ausführen. Jetzt haben wir in unserer Anwendung diese benutzerdefinierte Protokoll-Middleware erstellt Wir brauchen es nicht, also können wir diesen Code auskommentieren. Um Morgan jetzt verwenden zu können, müssen wir ihn zuerst in unsere Anwendung importieren. An oberster Stelle steht also, dass man Morgan braucht. Und unten fügen wir den App-Punkt U hinzu, und darin nennen wir diese Morgan-Funktion In dieser Morgan-Funktion können wir ein vordefiniertes Format der Protokollierungsanfrage übergeben. Zum Beispiel haben wir Dev für die Entwicklung kombiniert, um mehr Details Common, Tiny usw. Wenn Sie alle Details sehen möchten, können Sie sich diese Paketseite ansehen Hier erhalten Sie alle Informationen zu den Formaten. Jetzt fügen wir in unserem Code hier einfach Doppelcodes hinzu. Siehst du, hier bekommen wir Vorschläge. Kombiniert, geläufiges Dov kurz, vorerst winzig, lassen Sie uns für Dev gehen . Speichern Sie die Änderungen und schauen Sie sich Klicken Sie nun auf eine beliebige API im Terminal. C, hier bekommen wir die Details der Anfrage. Zuerst erhalten wir die SDDP-Methode, dann den Endpunkt, dann den Status, Antwortzeit und die Größe der Anhand dieser Daten können wir unsere APIs verbessern. Wenn wir die Anfrage erneut senden, sehen Sie, wir erhalten ein neues Protokoll. So wird Morgan uns also helfen. Jetzt ist Helmet die nächste Middleware von Drittanbietern. Ist eine weitere beliebte Middleware, und wir alle wissen, was Helme in unserem normalen Leben bewirken Es schützt unseren Kopf vor Unfällen, und genau das tut Helm-Middleware Dies ist eine hervorragende Option, um die Sicherheit unserer App mit minimaler Konfiguration zu verbessern die Sicherheit unserer App mit minimaler Außerdem wird es häufig in Produktionsumgebungen verwendet. Viele Knotenanwendungen verwenden diese Middleware. Also suchen wir hier Helm. Hier bekommen wir dieses Paket. Lassen Sie uns dieses Paket installieren. Öffnen Sie das Terminal, beenden Sie die Anwendung und fügen Sie den Befehl hier ein. Und wenn Sie dieselbe Version installieren möchten, die ich verwende, können Sie hier auch die Version hinzufügen und die Eingabetaste drücken. Kapuze. Lassen Sie uns unsere Anwendung erneut ausführen. Um dieses Paket nun zu verwenden , importieren wir es zunächst oben. Also Const-Helm, gleich zwei benötigen Helm. Und ganz unten, vor unserer anderen Middleware, fügen wir App Dot G hinzu und nennen hier einfach Helmet Middleware. Dadurch werden automatisch sichere Header hinzugefügt , die unsere Express-Anwendung sichern Außerdem möchte ich eines klarstellen. Wenn wir Middleware zu unserer Anwendung hinzufügen, fügt Express sie in derselben Reihenfolge hinzu, in der wir sie in unserem Code hinzufügen Zum Beispiel fügt Express derzeit Helme-Middleware zuerst in die Pipeline zur Anforderungsverarbeitung ein, dann JSON, dann URA-kodiert, dann statisch und dann Morgan Die Reihenfolge ist auch für Middleware wichtig. 45. Programmierung entsprechend der Umgebung: Lassen Sie uns nun sehen, wie wir entsprechend unserer Anwendungsumgebung codieren können . Zum Beispiel befindet sich unsere Anwendung derzeit im Entwicklungsprozess, und wenn wir unsere Anwendung bereitstellen, wird sie sich in der Produktionsumgebung befinden. Jetzt, wenn sich unsere Anwendung in der Entwicklungsphase befindet, möchten wir Morgan-Middleware erst dann für unsere Anwendung aktivieren Morgan-Middleware erst dann für unsere Zuallererst müssen wir also die aktuelle Umgebung kennen. Und ja, das wissen wir genauso, wie wir versuchen, den Hafen zu kennen. Wir können also einfach den Dot Log Process ENV konsultieren und hier auf Dollar Cully Brackets, Progress Dot Env Dot Node Underscore ENV zugreifen Progress Dot Env Dot Node Underscore ENV Dieser Node-Underscore ENV ist der Variablenname , genau wie dieser Port. Mal sehen, was wir hier bekommen. Speichern Sie die Änderungen, und hier werden wir undefiniert. Warum? Weil unsere Umgebung zunächst keine STS-Entwicklung ist. In Express haben wir jetzt eine andere Möglichkeit, die aktuelle Umgebung zu ermitteln, nämlich die Verwendung von App Dot Gat. Und in diesem Bauchgefühl müssen wir ENV für Umwelt bestehen. Diese App dot gt ENV wird das gleiche Ergebnis zurückgeben wie dieser Prozess, Punkt, Punkt, Knoten, Unterstrich Aber wenn wir zu diesem Zeitpunkt keine Node-Underscore-Umgebung einrichten , diese App Dot GT ENV standardmäßig zur Entwicklung zurück, was großartig ist, was großartig ist Lass es mich dir zeigen. Also Konsolen-Dot-Log-App ENV Geschweifte Dollarklammern, App Dot Holen Sie sich ENV. Rette die Gengs und sieh mal, hier kommen wir Aber unser Prozesspunkt ENV ist immer noch undefiniert. Jetzt wollen wir diese Morgan-Middleware nur hinzufügen , wenn wir uns in der Entwicklungsumgebung befinden Wir können also so programmieren. Hier fügen wir I condition, app dot Get ENV Sie können auch Process Dot NV verwenden, müssen dann aber die Bedingung entsprechend ändern Das entspricht jetzt der Entwicklung. Es ist wahr, erst dann fügen wir diese Middleware hinzu. Wir verschieben diese in diesen IF-Blog. Um das zu verdeutlichen, fügen wir hier ein weiteres Punktprotokoll für die Konsole hinzu, fügte Morgan hinzu. Gut. Speichert die Gene und im Terminal, seht ihr, hier wird Morgan hinzugefügt. Lassen Sie uns nun unsere Umgebung auf Produktion umstellen , um zu sehen, ob Morgan etwas hinzufügt oder nicht. Zuallererst beenden wir die Ausführung unserer Anwendung. die Umgebungsvariable zu setzen, schreiben wir, Dollar ENV, Spalte, Knoten, Unterstrich ENV entspricht in Codes, wir übergeben die Wenn Sie ein Mac- oder Linux-Benutzer sind, müssen Sie hier schreiben: Export, Leerzeichen, Knoten, Unterstrich ENV Stellen Sie sicher, dass Sie den richtigen Namen und Wert der Umgebungsvariablen schreiben den richtigen Namen und Wert der Umgebungsvariablen . Drücken Sie die Eingabetaste. Lassen Sie uns jetzt unsere Anwendung erneut ausführen nodemon index dot js. Siehst du, hier wird Morgan nicht hinzugefügt. So ändern wir unsere Anwendungsumgebung und unseren Code entsprechend. Lassen Sie uns die Umgebung wieder auf Entwicklung umstellen. Dollar ENV, Doppelpunkt, Unterstrich EN V entspricht also Unterstrich EN V entspricht Oder für Mac oder Linux ist Export, Node, Underscore ENV Und wenn wir unsere Anwendung noch einmal überprüfen, sehen Sie, hier wird Morgan hinzugefügt 46. env-Datei und dotenv-Paket: Bis jetzt setzen wir Umgebungsvariablen mit Dollar ENV oder dem Exportbefehl Es gibt jedoch noch eine andere einfache Möglichkeit, diese Variablen mithilfe der Punkt-ENV-Datei zu definieren diese Variablen mithilfe der Punkt-ENV-Datei In dieser NV-Datei können wir einfach alle Umgebungsvariablen hinzufügen, können wir einfach alle Umgebungsvariablen hinzufügen z. B. Port entspricht 3.000 oder Node Underscore ENV zur Oder wir können hier auch die URL unserer Datenbank definieren. Und viele Entwickler verwenden diesen Ansatz, um Variablen zu definieren , anstatt sie im Terminal zu definieren. Diese ENV-Datei hält sensible Informationen unserer Anwendungen wie Anmeldeinformationen von unserem Code fern, was eine gute Sicherheitsmaßnahme ist. Diese ENV-Datei ist nun eine einfache Textdatei. Können wir ihre Variable in unsere Node-Anwendung laden, damit wir sie verwenden und entsprechend codieren können Um diese Umgebungsvariablen in einer Node-Anwendung zu verwenden, haben wir ein Paket namens dot ENV Sie sich keine Sorgen um nur eine Codezeile, wir können diese Umgebungsvariablen verwenden Lassen Sie uns dieses Paket installieren. NPM installiere Punkt ENV. Gut. Jetzt müssen wir in unserem Indexpunkt oben nur eine Zeile require dot NV hinzufügen, und dann rufen wir hier die Methode dot config auf, und das war's Wir müssen nichts anderes tun. Und das Gute an diesem Ansatz ist auch, dass wir mit process dot nw dot poRd und process dot nw dot node underscore ENV auf dieselbe Weise auf sie zugreifen können mit process dot nw dot poRd und process dot nw dot node underscore ENV auf dieselbe poRd und process dot nw dot node underscore Lassen Sie uns diese Anwendung ausführen. Gut. Siehst du, derzeit befinden wir uns in der Entwicklungsumgebung, und deshalb haben wir Morgan hinzugefügt. Um es Ihnen zu zeigen, ändere ich den Port auf 8.000. Verwenden Sie nicht den Port 5.000 in MAG, weil er bereits in Ihrem System läuft und wir ENV auf Produktion umstellen Speichern Sie das, und jetzt müssen wir manuell neu starten, da Norman unsere Anwendung nur dann neu startet , wenn sich Dateien mit diesen Erweiterungen ändern Siehst du, unser Port wurde auf 8.000 geändert, aber was ist das? Unsere Umgebung ist dieselbe wie zuvor, das heißt Entwicklung. Aber in der ENV-Datei haben wir es auf die Produktion eingestellt. Kannst du es erraten? liegt daran, dass wir in der letzten Lektion unseren Node-Underscore-ENV-Wert mit Dollar ENV oder dem Schlüsselwort export fest codiert Node-Underscore-ENV-Wert mit Dollar ENV oder Also unsere Anwendung, erinnere dich an diese Einstellungen. Denken Sie also immer daran, dass unsere Node-Anwendung dem Terminalwert mehr Priorität einräumt, wenn wir eine Punkt-ENV-Datei haben und auch unsere Umgebungsvariable mit Terminal festlegen und auch unsere Umgebungsvariable mit Terminal und auch unsere Umgebungsvariable mit Terminal Um dieses Problem zu lösen, können wir den ENV-Wert des Node-Unterstrichs einfach entfernen Also schreibe, entferne es, Pfad, ENV, Doppelpunkt, Knoten, Unterstrich Oder wenn Sie ein Mac- oder Linux-Benutzer sind, schreiben Sie unset, space, node, underscore ENV Starten Sie jetzt die Anwendung neu. Siehst du, hier bekommen wir die Produktion. Und wenn wir in der ENV-Datei ENV auf Entwicklung ändern, speichern wir die Änderungen und starten unsere Anwendung mit Nod Siehst du, hier bekommen wir die Entwicklung, weil wir Morgan hinzugefügt bekommen 47. Unterschiedliche Einstellungen für unterschiedliche ENV: Derzeit ändern wir unsere Umgebungsvariablen manuell , da es sich nur um zwei handelt In der realen Welt haben wir jedoch möglicherweise mehr als zwei Umgebungsvariablen. Zum Beispiel haben wir unterschiedliche Datenbank-URLs in der Entwicklung und unterschiedliche URLs in der Produktion. In ähnlicher Weise haben wir möglicherweise einen geheimen Schlüssel für die Authentifizierung usw. Jetzt, wo wir so viele Umgebungsvariablen haben, ist es schwierig, die Variablen manuell zu ändern Nun, wie können wir das lösen? Um dieses Problem zu lösen, können wir zwei separate ENV-Dateien „ dot nw dot development“ und „dot nw dot Production“ erstellen zwei separate ENV-Dateien „ dot nw dot development“ und „dot nw dot Production Sie können sogar Dot Nw Dot Testing erstellen. In diesen beiden Dateien werden wir unsere verschiedenen Umgebungsvariablen definieren. Danach können wir in unseren Index Dot JS einfach eine Bedingung eingeben, können wir in unseren Index Dot JS einfach eine Bedingung eingeben wenn es sich bei unserer Knotenumgebung um eine Entwicklung handelt, dann die Dot NW Dot-Entwicklungsdatei laden. Und wenn unsere Umgebung schmeckt, dann laden wir diese Punkt-NV-Verkostungsdatei. So einfach ist das. Lass mich dir das praktisch zeigen. Hier erstellen wir eine neue Datei namens dot nw dot Development. In dieser Datei definieren wir verschiedene Umgebungsvariablen. Die erste ist, dass der Port 3.000 entspricht. K ist gleich zehn Unterstriche, die geheim sind. Wir können auch einen Node-Unterstrich hinzufügen. ENV ist gleichbedeutend mit Entwicklung, und das war's Lassen Sie uns nun eine weitere Datei mit dem Namen dot nw dot production erstellen dem Namen dot nw dot production Und darin fügen wir hinzu, dass Pd 8.000 K entspricht pro Qi und am letzten Knoten ein Quadrat E und V der Produktion entspricht Speichern Sie das, und jetzt müssen wir im Indexpunkt s nur noch eine Bedingung hinzufügen Also oben, hier, erstellen wir zuerst eine Variable namens ENV file equals, und hier, um ternäre Operatoren zu verwenden, übergeben wir die Bedingung, wenn Prozess Punkt nw Punkt Punkt Node Underscore NV gleich Produktion ist Wenn das stimmt, sollte unsere ENV-Datei sollte Wir haben die Dot Nw Dot-Entwicklungsdatei als unsere Umgebungsdatei festgelegt als unsere Umgebungsdatei In dieser Konfigurationsmethode müssen wir nun einfach das Objekt mit dem Eigenschaftspfad an die ENV-Datei übergeben Sehr einfacher Zustand. Und hier, um eine weitere NV-Variable zu zeigen, verwenden wir hier Consol Dot Log, Process Dot Nw Dot Lassen Sie uns überprüfen, ob es funktioniert oder nicht. Derzeit wird Morgan hinzugefügt. Lassen Sie uns jetzt unsere Bewerbung beenden. Dollar ENV, Doppelpunkt, Knoten, Unterstrich ENV entspricht Wenn Sie Mac- oder Linux-Benutzer sind, müssen Sie Export, Node, Underscore verwenden . EN V entspricht Produktion Lassen Sie uns jetzt unsere Anwendung starten. Sehen Sie, hier sind wir in der Produktionsumgebung, weil Morgan nicht hinzugefügt wurde, und hier bekommen wir Pro Key und unser Port ist auch auf 8.000 geändert, sodass wir durch die Verwendung verschiedener ENV-Dateien verschiedene Umgebungsvariablen definieren können 48. Vorlagen-Engines in Knotenanwendung: Sehen wir uns die Template-Engine im Knoten an. Dieses Thema ist etwas alt und wird in der modernen Welt nicht häufig verwendet. Lassen Sie uns einfach verstehen, was eine Template-Engine ist. Grundsätzlich ist die Template Engine ein Tool , mit dem wir dynamische SDML-Seiten erstellen Anstatt STML für jede Seite manuell zu schreiben, können wir eine Vorlage erstellen und mithilfe der Engine automatisch Daten in diese Vorlage einfügen Senden Sie dann die generierte SGML-Datei an den Client-Browser. Angenommen, wir möchten eine Blog-Website im alten Stil erstellen eine Blog-Website im alten Stil , auf der alle Blogs dasselbe Layout haben, aber nur ihr Inhalt unterschiedlich ist Jetzt möchten wir nicht für jeden Blogbeitrag manuell eine SGML-Datei erstellen für jeden Blogbeitrag manuell eine SGML-Datei Das wäre zeitaufwändig und ineffizient. Stattdessen können wir eine Template-Engine verwenden um eine einzelne Vorlage für unser Blog-Layout zu erstellen, und die Template-Engine zeigt den Blog-Inhalt dynamisch auf der Grundlage der von uns bereitgestellten Daten an, ganz einfach In No Jaz gibt es viele Template-Engines, aber die beliebteste ist PUG und eine andere ist Beides funktioniert gleich. Nur ihre Syntax ist unterschiedlich. Lass mich dir etwas über PUG zeigen. Also schreiben wir in unserem Terminal NPM install PUGor, wenn du dieselbe Version installieren möchtest, dann schreib auf den roten Dreipunkt Null Punkt drei Gut. Jetzt müssen wir in unserer Indexpunkt-JS-Datei die View-Engine, also die Template-Engine, auf PUG setzen die Template-Engine, auf PUG Also schreiben wir hier App Dot Set. Hier wollen wir Engine einstellen, also schreiben wir View Engine. Und beim zweiten Parameter übergeben wir einfach PUG In dieser Zeile haben wir also PRG als unsere View- oder Template-Engine festgelegt. Jetzt müssen wir eine Vorlage für unsere SDML-Seite in POG erstellen. In unserer Anwendung erstellen wir also einen Ordner namens Views. Stellen Sie sicher, dass Sie denselben Namen wie Views schreiben. Und in diesen können wir eine Datei namens Template Dot POG erstellen eine Datei namens Template Dot POG Sie können einen beliebigen Dateinamen verwenden. Es ist wirklich egal. Hier müssen wir Code in der Perg-Syntax schreiben, die unserer SDML sehr ähnlich ist Hier beginnen wir mit HTML. Beachten Sie, dass ich hier keine spitzen Klammern für Tags verwende. Innerhalb der SDML können wir Kopf haben, also schreiben wir es wie diese Baumstruktur Innerhalb des Kopfes können wir hier einen Titel hinzufügen . Wir möchten den Wert des Titels dynamisch ermitteln Wir schreiben unseren Tagnamen equals, und hier schreiben wir unseren Variablennamen , den wir zur Laufzeit übergeben Titel. Keine Sorge, ich zeige dir alles. Jetzt, nach dem Kopf, wissen wir, dass wir das Body-Tag hinzufügen können, also bewegen wir uns in derselben parallelen Linie wie der Kopf und fügen den Körper hinzu In PRG müssen wir das Tag nicht schließen. Jetzt können wir im Hauptteil H hinzufügen, ein Tag entspricht der Überschrift und danach fügen wir einen Absatz hinzu, der dem Inhalt entspricht Einfache Vorlage für einen Blog. Sie können sehen, dass dies eine sehr saubere Syntax ist als normales SDML. Viele Entwickler mögen es, aber viele mögen es nicht Speichern Sie diese Datei und lassen Sie uns sehen, wie wir die SDML-Seite rendern und diese Variablen dynamisch übergeben können SDML-Seite rendern und diese Variablen dynamisch übergeben Bisher haben wir eine API für eine einfache Root-Route definiert , bei der wir einfach den Antwortpunkt Senden zurückgeben Dies ist ein Task-Track-Projekt. Sie uns nun anstelle von einfachem Text Lassen Sie uns nun anstelle von einfachem Text unsere Perg-Vorlage rendern Hier an der Stelle des Antwortpunkts Senden schreiben wir den Antwortpunkt Render Und diese Funktion benötigt zwei Argumente. erste ist der Datei - oder Vorlagenname , den wir rendern möchten. In diesem Fall ist es eine Vorlage, und das zweite Argument ist das Objekt mit den Variablen und ihrem Wert , das wir in dieser Vorlage definieren. Also zuerst der Titel für, sagen wir, den ersten Blog. Danach gehen wir zur Template-Engine über, und Content to Ease Pug ist wirklich gut, ich weiß es nicht Speichern Sie die Änderungen, und im Browser wechseln wir zur Spalte 3.000 des lokalen Hosts Verbindungsfehler: Möglicherweise haben wir vergessen, die Anwendung zu starten, Node One, Index Dot, JS. Oh, derzeit befindet es sich in der Produktionsumgebung. Stellen wir es in die Entwicklungsumgebung ein. Also Dollar ENV kann Node unterstreichen ENV ist gleichbedeutend mit Encoding Oder wenn Sie ein Mac- oder Linux-Benutzer sind, können Sie Export verwenden Node Underscore ENV Stellen Sie sicher, dass Sie hier keine Codes weitergeben, und dann starten wir die Anwendung Siehst du, es hört 3.000 ab und wenn wir unsere Seite aktualisieren, siehst du, hier bekommen wir die Perg-Vorlage Der Titel ist der erste Blog. Überschrift und Inhalt sind auch gleich, wenn wir weitermachen. So können wir also eine SDML-Datei auf dem Server rendern und sie dann an den Client-Browser senden Ich glaube nicht, dass moderne Unternehmen diese Methode verwenden , da die meisten Unternehmen Rag, Angular oder View für das Frontend verwenden Angular oder View für das Frontend 49. Bereinigen der Codeanwendungsstruktur: Wenn wir derzeit unsere Indexpunkt-JS-Datei sehen, haben wir das Gefühl, dass wir unseren Code wirklich durcheinander gebracht Alles sieht sehr überladen und nicht wartbar aus. Lassen Sie uns also unsere Node-Anwendung strukturieren, die in der realen Welt verwendet wird Derzeit haben wir also der JS-Datei mit einem einzigen Indexpunkt die zugehörigen APIs hinzugefügt . Stellen Sie sich vor, wir haben in einer anderen E-Commerce-Anwendung eine weitere Reihe von APIs für Benutzer. Wir haben einen weiteren Satz von APIs für kartenbezogene Funktionen. Derzeit können wir nicht alle diese APIs in derselben JS-Datei mit Indexpunkt hinzufügen . Die Lösung besteht darin, dass wir einen separaten Ordner namens routes erstellen können einen separaten Ordner namens routes , in dem wir Dateien für jeden API-Satz hinzufügen. Wir erstellen einen neuen Ordner namens routes. Dies ist gängige Praxis für die Anwendungsstruktur. Jetzt erstellen wir hier eine neue Datei namens todos dot js, in der wir alle API-Routen definieren, die sich auf Todos beziehen Lassen Sie uns zunächst alle Routen aus der Indexpunkt-JS-Datei herausschneiden alle Routen aus der Indexpunkt-JS-Datei Und fügen Sie es in die Todos Dot JS-Datei ein. Jetzt könnten Sie in der JS-Datei mit dem Indexpunkt oben fragen, wir haben eine App-Instanz und mit dieser definieren wir verschiedene API-Routen Aber hier, in der Todos Dot JS-Datei, haben wir diese App-Instanz nicht Wie können wir hier also Routen definieren? Sie könnten sagen, wir können die App-Instanz neu erstellen, aber das ist nicht möglich. Es wird nicht funktionieren. Im Express haben wir also eine weitere Instanz namens Router, mit der wir API und Punkte definieren können , genau wie APIs, die die App-Instanz verwenden. Hier geben wir zuerst express const Express entspricht require Express In diesem Express haben wir nun eine weitere Methode namens Router, die die Router-Instanz zurückgibt, und deshalb speichern wir sie in einer Variablen namens Router Lassen Sie uns nun einfach diese App-Instanz durch diese Router-Instanz ersetzen . Wählen Sie also diese App aus und drücken Sie Strg plus D oder Befehl plus D, wodurch alle App-Instanzen ausgewählt und durch Router ersetzt werden . Gut. Jetzt haben wir unsere Routen in der anderen Datei definiert. Aber wie unsere Indexpunkt-JS-Datei wissen wird, welche Routen wir unserer Anwendung hinzufügen möchten. Dazu müssen wir diese Router-Instanz aus dieser Datei exportieren und sie der Indexpunkt-JS-Datei hinzufügen . So einfach ist das. Erinnerst du dich, wie wir Variablen aus der Node-Datei exportieren können ? Richtig, wir verwenden das Modul Dot Exports, das dem Router entspricht. Speichern Sie diese Datei und entfernen wir diese Blöcke in der Indexpunkt-JS-Datei . Wir benötigen sie nicht und fügen hier App Dot G hinzu, um diese Routen zu unserer Anwendung hinzuzufügen. Hier an der ersten Position fügen wir das Router-Präfix hinzu, genau wie in dieser statischen Datei. In den meisten Fällen fügen Entwickler hier gerne die Slash-API hinzu. Danach übergeben wir beim zweiten Argument unsere Router-Instanz aus der Todos Dot JS-Datei Also oben importieren wir diesen Router mit der Funktion require Und hier übergeben wir unseren Dateipfad , der aus Todos besteht Wie wir wissen, gibt diese Reque-Funktion nun die Router-Instanz zurück, sodass wir sie in einer Variablen namens Todos Routes speichern können Und unten, hier, passieren wir Tudous-Routen. Außerdem habe ich festgestellt, dass wir dieses Tudous-Array in der Tudos-Datei benötigen dieses Tudous-Array in der Tudos-Datei Also schneiden wir es von hier aus und fügen es in unsere Tudous-Datei ein. Speichern Sie die Änderungen und lassen Sie uns überprüfen, ob unsere Anwendung gut funktioniert oder Denken Sie daran, dass wir für alle To-Do-Routen das Präfix API vor den Endpunkten hinzufügen müssen . Senden Sie die Anfrage Siehst du, es funktioniert. Nun, eine letzte Änderung, die ich vornehmen möchte, betrifft unsere TudsRoute. Wir können sehen, dass wir Tudos vor jedem Routenendpunkt hinzufügen Tudos vor jedem Daher können wir diesen Schrägstrich in der Regel Todos an das Präfix in der Index-Dogs-Datei übergeben an das Präfix in der Index-Dogs-Datei Speichern Sie diese. Jetzt können wir in der Datei Todos Dot JS den Schrägstrich Todos vom Endpunkt entfernen Außerdem entfernen wir Todos für alle API-Endpunkte. Speichern Sie das und wir können loslegen. Wir können diese unerwünschten Zeilen auch entfernen. Wir brauchen sie nicht. Sehen Sie, jetzt sieht unsere Indexpunkt-JS-Datei sauber und wartungsfreundlicher Wir werden dieser Anwendungsstruktur für den Rest unseres Kurses folgen für den Rest unseres Kurses Also hier ist unser fünfter Abschnitt vorbei. Sie können sich schnell das zusammenfassende PDF ansehen und den gesamten Abschnitt in zwei bis drei Minuten zusammenfassen den gesamten Abschnitt in . Wir sehen uns im nächsten Abschnitt 50. Abschnitt 06 - Asynchron und synchron: Willkommen zu den sechs Abschnitten des ultimativen Nicht-JS-Kurses. Dies ist der Repressor-Abschnitt für einige AdvanceJavaScript-Themen wie synchron versus asynchron, Callback-Funktionen, Callback-Hell-Promises Callback-Funktionen, Callback-Hell-Promises einige AdvanceJavaScript-Themen wie synchron versus asynchron, Callback-Funktionen, Callback-Hell-Promises und Async Await. Viele Entwickler sind bei diesen Themen verwirrt, daher ist es besser, wenn wir sie verstehen. Wenn Sie also in diesen Themen bereits verwirrt sind und Node JS beherrschen möchten, werden Sie in den kommenden Abschnitten mit vielen Problemen konfrontiert sein. Es ist besser, sich mit diesen Themen vertraut zu machen, die wir als asynchrones JavaScript bezeichnen können bevor wir uns wirklich eingehend mit Node-Anwendungen befassen In allen Node-Anwendungen verwenden wir diese Themen häufig Lassen Sie uns diese Themen lernen. Sind einfach und leicht zu erlernen. Wenn Sie sich in diesen Themen bereits sicher sind, können Sie diesen Abschnitt auch überspringen. Es liegt ganz bei dir. Bevor wir nun anfangen, Konzepte von asynchronem JavaScript zu erlernen , wollen wir den Unterschied zwischen asynchronem und synchronem JavaScript verstehen den Unterschied zwischen asynchronem und synchronem Es wird uns helfen, es besser zu verstehen. Was ist synchron? Synchrone Programmierung bedeutet, dass unser Code Zeile für Zeile ausgeführt wird Jede Zeile muss abgeschlossen sein , bevor wir mit der nächsten Zeile fortfahren In einfachen Worten ist synchrone Programmierung so, als würde man Schritt für Schritt einem Rezept folgen Jeder Schritt muss abgeschlossen sein , bevor mit dem nächsten Schritt fortgefahren Wenn ein Schritt lange dauert, müssen wir warten, bis die Ausführung abgeschlossen ist, und dann können wir fortfahren. Zum Beispiel bereiten wir einen Kuchen für die Geburtstagsfeier vor. Jetzt gibt es einen schrittweisen Prozess, sagen wir, zuerst mischen wir die Zutaten, dann legen wir sie zum Backen in den Ofen und schließlich dekorieren wir den Kuchen. Hier müssen wir die Schritte Zeile für Zeile befolgen. Wir können nicht direkt mit dem Dekorieren des Kuchens beginnen , ohne zu backen. Wir müssen mit Schritt eins, Schritt zwei und Schritt drei fortfahren. Das ist das synchrone Beispiel. Synchroner Code wird auch als Blockcode bezeichnet. Lassen Sie mich Ihnen das Blockierungsverhalten oder das Beispiel für den Blockierungscode in JavaScript zeigen Beispiel für den Blockierungscode in JavaScript Um diese Themen zu üben, erstellen wir im Projektordner einen neuen Ordner namens asynchrones JavaScript und öffnen diesen Ordner im VS-Code In diesem Ordner erstellen wir nun eine einfache JavaScript-Datei namens index dot js Gut. Jetzt schreiben wir hier drei Konsolenzeilen. Also Konsole Dot Log. Schritt eins, fang an. Noch ein Punktprotokoll für die Konsole. Schritt zwei und zuletzt, Konsolen-Punktprotokoll. Schritt drei, und lassen Sie uns diesen Code ausführen. Also schreiben wir im Terminal Node, Index Dogs. Siehst du, wir bekommen die Ausgabe Zeile für Zeile. Zuerst bekommen wir Schritt eins, dann Schritt zwei und dann Schritt drei. Jetzt könnten Sie sagen, dass wir das Blockierungsverhalten dieses Codes nicht erkennen können . Wie können wir das praktisch sehen? Derzeit erhalten wir diese Ausgabe ohne Blockierung, da keine einzige Zeile mehr Zeit für die Ausführung benötigt, jede Zeile sofort ausgeführt wird. Fügen wir diesem Code einen kleinen Block hinzu. Hier, nach der ersten Konsole, erstellen wir eine Funktion namens fetch data In dieser Funktion tun wir so, als würden wir Daten aus der Datenbank abrufen Wie wir vielleicht wissen, kann das Abrufen von Daten aus der Datenbank etwa zwei bis 3 Sekunden oder länger dauern Im Moment fügen wir nur eine gewisse Verzögerung hinzu, indem wir eine leere Vierer-Schleife verwenden, deren Ausführung einige Zeit in Anspruch nehmen kann Hier sei I gleich Null, I kleiner als eins und neun mal Null und I plus plus. Wir wollen einfach nichts in dieser Herbstschleife machen, also öffne und schließe die geschweiften Klammern Nun, die Ausführung dieser Zeile kann ein oder zwei Sekunden dauern . Danach verschieben wir den zweiten Schritt unserer Konsole oben und hier werden die Daten abgerufen Hier vor unserem dritten Schritt nennen wir diese Fan-Datenfunktion Kannst du dir vorstellen, was wir in der Ausgabe bekommen? Lass uns sehen. Speichern Sie die Änderungen und lassen Sie uns diese Datei ausführen. Sehen Sie, nach Schritt eins wird unser Code kurz angehalten, unser Code kurz angehalten damit unsere Funktion ausgeführt werden kann. Danach werden die Daten abgerufen und dann Schritt drei. Hier können wir für eine Weile das Blockierungsverhalten unseres JavaScript-Codes sehen , der als synchroner JavaScript-Code bezeichnet wird Jetzt erraten Sie vielleicht, was asynchron ist. Auch im asynchronen Modus läuft unser Code Zeile für Zeile. Aber um voranzukommen, müssen wir nicht warten , bis wir diese Aufgabe abgeschlossen Wir können eine Aufgabe beginnen, und wenn sie länger dauert, können wir zur nächsten Zeile übergehen. In einfachen Worten, asynchrone Programmierung ist so, als würde man mehrere Dinge gleichzeitig tun und nicht warten, bis jede Zeile abgeschlossen ist, bevor die nächste Zeile gestartet wird Sie können eine Aufgabe starten und während Sie darauf warten, dass sie abgeschlossen ist, können Sie etwas anderes tun Sie bereiten beispielsweise ein Fass vor und schauen sich auch diesen Kurs Sie stellen den Kuchen also zum Backen in den Ofen, aber das Backen kann zehn bis 15 Minuten dauern Zu diesem Zeitpunkt können Sie also andere Dinge tun, anstatt nur darauf zu warten, dass der Kuchen gebacken ist. Also fängst du an, dir diesen Kurs anzusehen. Und wenn dir dieser Kurs gefällt, kannst du ihn zu diesem Zeitpunkt mit deinen Freunden teilen. Ähnlich verhält es sich, wenn wir unseren Summencode mit asynchronem JavaScript definieren unseren Summencode mit asynchronem JavaScript die Ausführung dieser Zeile länger dauert, dann wartet unser JavaScript-Code nicht dort Es wird im Code vorwärts ausgeführt, und wenn diese Zeile ihre Ausführung beendet hat, wird sie diese Zeile ausführen Wir können in asynchronem JavaScript mehrere Dinge tun ohne nur darauf zu warten, dass eine Zeile ihre Aufgabe beendet Dies ist der grundlegende Unterschied zwischen synchronem und asynchronem JavaScript Standardmäßig ist unser JavaScript-Code synchron, aber Javascript bietet einige Methoden, mit denen wir unseren Code für bestimmte Arten von Arbeit asynchron machen können unseren Code für bestimmte Arten von Arbeit asynchron machen für bestimmte Arten von Arbeit asynchron machen Wie wir wissen, ist Node auch deshalb beliebt, weil er asynchrone Natur anwenden kann Lassen Sie mich Ihnen nun zeigen, wie wir unseren synchronen oder blockierenden Code in asynchronen oder nicht blockierenden Code umwandeln können blockierenden Code in asynchronen oder nicht blockierenden Code umwandeln Hier, an der Stelle dieser Vierschleife, die unseren Code beschäftigt, kann ich eine weitere Methode hinzufügen, um Verzögerungen hinzuzufügen Wir fügen ein festgelegtes Timeout hinzu. Diese Methode benötigt zwei Argumente. Die erste ist die Funktion und die zweite ist eine Verzögerungszeit. Zum Beispiel übergeben wir hier 10.000 Millisekunden, was 10 Sekunden entspricht Zunächst übergeben wir einfach die Funktion und innerhalb dieser übergeben wir diesen Schritt zur Konsole mit abgerufenen Daten Nach 10 Sekunden testet diese Funktion die Konsolendaten. Können Sie nun die Ausgabe dieses Codes erraten? Lass uns sehen. Siehst du, zuerst machen wir Schritt eins. Danach läuft im Hintergrund oder die Funktion, aber das hat unseren Code dort nicht gestoppt. Unser Code führt weiterhin Schritt drei aus, und wenn diese 10 Sekunden vorbei sind, erhalten wir Schritt zwei Daten ft. Das ist also der nicht blockierende oder asynchrone Code. Synchroner Code, warten Sie, bis eine Zeile die Ausführung abgeschlossen hat, und asynchroner Code, warten Sie auf diese Zeile im Hintergrund und arbeiten Sie weiter Sie fragen sich vielleicht, was am besten synchron oder asynchron ist . Meiner Meinung nach sind beide nützlich. Niemand ist besser. Sie dienen beide unterschiedlichen Zwecken. Synchron eignet sich hervorragend , wenn Aufgaben in einer bestimmten Reihenfolge ausgeführt werden müssen oder wenn die Aufgabe schnell und nicht blockierend ist Bietet Einfachheit und Vorhersehbarkeit. Asynchron ist wichtig für zeitaufwändige Aufgaben wie Dateiverwaltung, Datenbankzugriff oder Netzwerkanfragen, bei denen wir den Hauptthread unseres Servers nicht blockieren möchten In der Node-Anwendung verwenden wir asynchrones JavaScript Wir möchten nicht blockierende Operationen wie Datenbankabfragen, API-Aufrufe, Lesen und Schreiben von Dateien ausführen blockierende Operationen wie Datenbankabfragen, API-Aufrufe, , ohne den Haupt-Thread einzufrieren Die Hauptsache ist, dass unsere Anwendung nicht blockierend funktionieren sollte, was unseren Benutzern eine schnelle und hervorragende Erfahrung bietet Wie wir wissen, ist unser JavaScript-Code standardmäßig synchron. JavaScript bietet jedoch einige Methoden, mit denen wir unseren Code asynchron machen können unseren Code asynchron machen um bestimmte Arten von Die erste Möglichkeit besteht darin, die Callback-Funktion zu verwenden. Eine andere Methode ist die Verwendung von Versprechen. In diesem Abschnitt werden wir uns eingehend mit diesen Methoden befassen. 51. Callbacks in JavaScript: Lassen Sie uns nun den Rückruf in JavaScript verstehen. Also, was ist eine Callback-Funktion? Eine Callback-Funktion ist eine Funktion, die als Argument an eine andere Funktion übergeben und ausgeführt wird , nachdem eine bestimmte Aufgabe abgeschlossen ist Lassen Sie mich Ihren Rückruf anhand eines realen Szenarios erklären. Angenommen, Sie bestellen mit Ihrem Telefon ein Sandwich im Sandwichladen, rufen also den Sandwichladen an und geben Ihre Bestellung auf Sie sagen Ihnen, dass die Zubereitung und Lieferung 20 Minuten dauern wird . Also hast du den Anruf unterbrochen und andere Dinge erledigt , anstatt nur auf das Sandwich zu warten. Jetzt, wenn das Sandwich fertig ist, klingelt der Zusteller Ihrer Tür und gibt Ihnen das Sandwich einfach In diesem Fall rufen Sie also den Sandwichladen an und geben Ihre Bestellung auf, als würden Sie eine asynchrone Aufgabe starten Danach sagen sie dir, dass es 20 Minuten dauern wird. Dies ist die Verzögerung bei der asynchronen Aufgabe. Dann hast du aufgelegt und andere Dinge getan , anstatt nur auf das Sandwich zu warten Dies ist das nicht blockierende Verhalten, was bedeutet, dass unser Code weiterhin vorwärts läuft. Wenn Sandwich fertig ist, was bedeutet, dass unsere asynchrone Aufgabe abgeschlossen ist, klingelt der Zusteller Ihrer Tür und gibt Ihnen das Dies ist die Callback-Funktion, die ausgeführt wird, wenn die asynchrone Eine Callback-Funktion wird also als Argument an eine andere Funktion übergeben und sie wird auch ausgeführt, nachdem eine bestimmte Aufgabe abgeschlossen ist nachdem eine bestimmte Aufgabe In einfachen Worten, was auch immer wir tun wollen , nachdem die asynchrone Aufgabe abgeschlossen ist, das werden wir in der Callback-Funktion übergeben Wenn Sie also schon lange arbeiten oder Javascript lernen, dann wetten Sie mit mir, Sie haben die Callback-Funktion bereits in Ihrem Code verwendet Sie wissen nur nicht, dass diese Funktion ColWcFunction bezeichnet wird Erinnern Sie sich zum Beispiel, dass wir in der Funktion set timeout an erster Stelle eine Funktion übergeben, die der Funktion set timeout an erster Stelle eine Funktion übergeben, die nach einer gewissen Verzögerung ausgeführt wurde Und Sie haben Recht, diese Funktion, die wir als Argument übergeben haben , wird Callback-Funktion genannt Genauso wie wir die Callback-Funktion in der Funktion set interval übergeben Callback-Funktion in der Funktion set interval Lassen Sie mich Ihnen ein anderes Beispiel geben. In fast allen Array-Methoden übergeben wir Callback-Funktionen Wie bei der Futtermethode, der Kartenmethode, der Filtermethode Bei all diesen Methoden übergeben wir die Callback-Funktion Außerdem haben wir in unserem vorherigen Projekt die Callback-Funktion in der App dot get app dot post, app dot pot, delete und in allen Methoden übergeben der App dot get app dot post, app dot pot, delete und in allen Denken Sie daran, dass diese auch als Callback-Funktionen bezeichnet werden. nun zum grundlegenden Verständnis Lassen Sie uns nun zum grundlegenden Verständnis eine Funktion erstellen und sie als Callback-Funktion übergeben , da wir in Node häufig Callback-Funktionen übergeben müssen Also lasst uns diesen Code entfernen. Wenn Sie sich den vorherigen Code am Ende dieser Lektion ansehen möchten , erhalten Sie den Ressourcenordner Zip. Laden Sie ihn herunter und entpacken Sie ihn. Im Ressourcenordner erhalten Sie Abschnitt für Abschnitt Gita-Links für den gesamten Code Sie können sich also darauf beziehen. Also schreiben wir zunächst das Punktprotokoll für die Konsole. Fangen Sie an. Jetzt erstellen wir hier eine Funktion namens fetch student, in der wir so tun, als würden wir Daten aus der Datenbank abrufen Um die Verzögerung beim Abrufen von Daten zu simulieren, fügen wir hier erneut die Funktion set timeout hinzu Und was bestehen wir an erster Stelle? Richtig, nicht nur die Funktion, wir übergeben die Callback-Funktion Also übergeben wir hier die Funktion unter Verwendung der Pfeilfunktionssyntax Pfeilfunktion ist eine weitere Möglichkeit, Funktionen zu definieren, und sie ist für Callback-Funktionen viel übersichtlicher Beim zweiten Argument vergehen wir Millisekunden, sagen wir 3.000 Und hier im eingestellten Timeout konsultieren wir das Punktprotokoll, um Schülerdaten aus der Datenbank abzurufen Schülerdaten Lassen Sie uns nun diese Funktion zum Abrufen von Studenten hier nach der Um es realistischer zu machen, geben wir hier auch den Studentenausweis weiter, das ist die ID des Studenten, den wir abrufen möchten. Sagen wir eins Wenn wir nun den Datenabruf abgeschlossen haben, möchten wir nach 3 Sekunden die Schülerdaten zurückgeben Also geben wir das Studentenobjekt mit der ID zurück. Hier erhalten wir ID als Parameter und übergeben hier einfach dieselbe ID. Außerdem hat unser Student den Namen Harley, und nehmen wir an, wir wollen seine Einschreibenummer, nehmen wir an, 500. Wir tun so, als würden wir dieses Studentenobjekt aus der Datenbank bekommen dieses Studentenobjekt Wenn wir nun diese Funktion aufrufen, erhalten wir hier die Schülerdaten, sodass wir sie einfach in der Variablen Student speichern können Um das zu verifizieren, geben wir einfach den Punkt log, Student ein und geben diesen Schüler an dieser Stelle weiter Am Ende schauen wir uns einfach das Punktprotokoll an, und können Sie sich jetzt vorstellen, was wir in der Ausgabe bekommen werden Bekommen wir die Schülerdaten oder nicht? Lass uns sehen. Knotenindex Punkt js. Siehst du, hier fangen wir an, Student undefined, und dann holen wir uns Daten aus der Datenbank. Lassen Sie mich Ihnen erklären, warum Wenn wir diese Well-Stud-Funktion mit der ID eins aufrufen , wird zunächst der eingestellte Timeout ausgeführt , der diesen Code nach 3 Sekunden ausführt Derzeit bekommen wir nichts von der Deshalb hatte sie in der Variablen Student einen undefinierten Wert Unser JavaScript-Code lief weiter. diesem Grund bringen wir den Schüler dazu, die Definition dann aufzuheben und dann, nach 3 Sekunden, die eingestellte Timeout-Funktion wird die eingestellte Timeout-Funktion diese abrufende Datenleitung trösten Die Sache ist nun, wie können wir diesen Code ausführen und die Schülerdaten abrufen? Was ist hier die Lösung? Um dieses Problem zu lösen, verwenden wir Callback-Funktion und das werden wir in der nächsten Lektion tun 52. Problemlösung mit Callback: In der vorherigen Lektion erhalten wir also die Fehlermeldung Undefined Student Lassen Sie uns dieses Problem nun mithilfe der Callback-Funktion lösen. Zuallererst müssen wir das Ergebnis nicht in der Studentenvariablen speichern Um dieses Problem zu lösen, werden wir an der Studentenfunktion der Fed kaum etwas ändern. Nach der ID übergeben wir also ihre Callback-Funktion als Parameter Und an der Stelle, an der das Studentenobjekt aus der Funktion zurückgegeben wird, rufen wir diese Funktion auf oder rufen diese Funktion zurück und übergeben einfach das Studentenobjekt Ich weiß, dass es ein bisschen verwirrend ist. sich diese Lektion ansehen, werden Sie Rückrufe sehr gut verstehen Da wir nun auf die Callback-Funktion als Parameter zugreifen, müssen wir diese Funktion als zweites Argument übergeben, wenn wir die Fair-Student-Funktion aufrufen Hier übergeben wir also die Funktion, und innerhalb dieser Funktion können wir diesen Konsolenschüler einfach verschieben Woher haben wir nun dieses Studentenobjekt? Richtig, hier erhalten wir das Studentenobjekt im Parameter, denn wenn wir diese Callback-Funktion in der schnellen Student-Funktion aufrufen , übergeben wir hier das Student-Objekt, und auf dieses Studentenobjekt greifen wir hier in diesem Callback-Parameter direkt Mal sehen, ob das funktioniert oder nicht. Also Knotenindexpunkt Js. Sehen Sie, zuerst starten wir und dann, nach 3 Sekunden, holen wir Daten aus der Datenbank ab und drucken dann mit der Callback-Funktion dieses Studentenobjekt, und das ist genau das, was wir wollen Hier ist unser bisheriger und aktueller Code. An der Stelle, an der die Daten aus der Fat Student-Funktion zurückgegeben werden, rufen wir eine weitere Funktion für Punktprotokoll der Konsole auf, die Studentendaten. Diese Konsolenzeile wird nur ausgeführt, wenn diese Callback-Funktion aufgerufen wird Durch diese Technik der Callback-Funktion machen wir unseren Code asynchron oder Um dies an der Stelle dieser Funktion zu verdeutlichen, verwenden wir die Pfeilfunktionssyntax Wir entfernen das Funktionsschlüsselwort und fügen zwischen den Klammern und den GLY-Klammern einen Pfeil hinzu Sehen Sie, jetzt sieht unser Code einfach aus und dieser Weg ist in Node sehr nützlich, da wir, wie Sie feststellen, immer eine solche Callback-Funktion übergeben Anstatt es separat zu deklarieren, definieren wir es direkt hier Sie können sehen, dass wir mithilfe der Callback-Funktionsmethode asynchrone Aufgaben bewältigen können Bisher haben wir diese Colbec-Notation für die Definition von API-Routen verwendet für die Definition von Das ist also die Callback-Funktion. Callback-Funktion ist nur ein Name der Funktion, den wir als Argument an eine andere Funktion übergeben als Argument an eine andere Funktion Sie wird nach Abschluss der Aufgabe ausgeführt , insbesondere der asynchronen Aufgabe So einfach ist das. Lassen Sie uns das Ganze nun etwas schwieriger machen. Nehmen wir an, wir möchten anhand dieser Einschreibenummer des Studenten seine Ergebnisdetails abrufen Nach dieser Funktion zum Abrufen von Studenten erstellen wir eine neue Funktion Parameter, wir fügen die Anmeldenummer hinzu, weil wir damit das Ergebnis aus der Datenbank abrufen In dieser Funktion geben wir nun einfach das Objekt mit den Eigenschaften zurück, Ergebnis-ID zur Registrierungsnummer, die wir im Parameter erhalten, und danach den Prozentsatz auf, sagen wir, 70. Wie wir jetzt wissen, holen wir uns das Ergebnis wieder aus der Datenbank, was bedeutet, dass es wieder einige Zeit dauern wird, und deshalb ist diese Funktion ein echter Hit bei uns. Um die Verzögerung zu simulieren, fügen wir hier die Funktion set timeout und darin die Callback-Funktion und warten erneut 3.000 Millisekunden In dieser Funktion mit festgelegtem Timeout verschieben wir diese Rückgabe, und wie wir wissen, hat diese Rückgabe wie wir wissen Wir müssen dieses Ergebnis an die Callback-Funktion übergeben . So wie wir es hier getan haben. Also Callback-Funktion und umschließen Sie dieses Ergebnisobjekt einfach mit der Callback-Funktion Zuvor können wir auch das Punktprotokoll abrufen, um das Ergebnis aus der Datenbank abzurufen Gut. Nun, wo wir diese Gad-Ergebnisfunktion nennen, denken Sie darüber nach Ja, wir können die Gad-Ergebnisfunktion in dieser Callback-Funktion aufrufen , weil wir Registrierung im Studentenobjekt erhalten, und wir können sie auch hier in der Funktion zum Abrufen hier in Aber da es bei dieser Funktion nur darum geht, die Daten abzurufen, wollen wir die Dinge nicht vermischen Also rufen wir die Ga-Ergebnisfunktion in der Callback-Funktion Als erstes Argument übergeben wir die Einschreibenummer, die Studentenzahl E unter Scenum ist . Und was wir beim zweiten Argument übergeben, übergeben wir hier die Callback-Funktion Jetzt, hier im Parameter, erhalten wir das Ergebnisobjekt, das wir hier übergeben, und wir konsolen das Punktlog-Ergebnis einfach mit dem Ergebnis Außerdem müssen wir diesen Callback vom Parameter abrufen. Rette die Banden und lass uns das Ergebnis überprüfen. Hier bekommen wir zuerst die Schülerdaten und dann nach 3 Sekunden das Ergebnis dieses Schülers. Lassen Sie mich Ihnen schnell zeigen , was hier passiert. Also zuerst funktioniert die Startkonsole, und dann nennen wir das Herbst-Studenten-Funktion. Aufgrund dieser eingestellten Timeout-Funktion wird sie jedoch nicht sofort ausgeführt Also geht unser Code weiter und tröstet dieses Ende einfach. Jetzt, nach 3 Sekunden, wird der eingestellte Timeout den Code ausführen , der innerhalb von acht Sekunden verfügbar ist Also rufen wir die Callback-Funktion auf und übergeben einfach Object. Woher bekommen wir diese Callback-Funktion. Richtig, wir bekommen es aus dem Parameter, und wo wir diese Callback-Funktion definieren, ist sie hier in der Fat Student-Funktion, und deshalb bekommen wir zuerst die Studentendetails Nachdem wir die Schülerdetails erhalten haben, rufen wir eine weitere Funktion auf, nämlich G-Ergebnis Diese G-Ergebnisfunktion wird also ausgeführt, und aufgrund des festgelegten Timeouts dauert die Ausführung erneut 3 Sekunden Und darin rufen wir eine weitere Callback-Funktion auf, und wo wir diese Callback-Funktion definieren, ja, hier, und endlich, Callback-Funktion konsoliert dieses Ergebnis, und genau das und Wenn wir ohne Callback-Funktion unseren Code in derselben Reihenfolge ausführen wollen , dann können wir Wir bekommen einen undefinierten Schüler und aus diesem Grund können wir nicht einmal ein Ergebnis erzielen Jetzt verstehst du also, warum ich so viel Wert auf die Callback-Funktion lege Denn wenn Sie bei der Callback-Funktion verwirrt sind, wie können Sie sich dann auf den Lernknoten konzentrieren 53. Rückrufhölle: Derzeit fügen wir in diesem Code diese Callback-Funktion in eine andere Callback-Funktion eine andere Callback-Funktion Stellen Sie sich nun vor, wir haben eine weitere asynchrone Aufgabe, sagen wir, das Ergebnis aktualisieren Darin übergeben wir die Ergebnis-ID mit einem Punkt und die Callback-Funktion wird ausgeführt, und die Callback-Funktion wird ausgeführt nachdem unser Ergebnis aktualisiert wurde Wir erhalten hier ein aktualisiertes Ergebnis. Sie können sehen, dass unser Code unübersichtlich und schwer lesbar aussieht da wir hier viele verschachtelte Callback-Funktionen ineinander haben . Lassen Sie mich all diese Konsolen entfernen, damit wir deutlich sehen können, wir hier verschachtelte Rückrufe bekommen Diese Situation wird als Callback-Hölle bezeichnet, in der wir viele verschachtelte Callback-Funktionen ineinander haben und das macht es schwierig, den Code zu lesen und Wenn wir den gleichen Code synchron haben, dann sieht es so Zuerst rufen wir die Fair-Student-Funktion und speichern ihre Daten in der Studentenvariablen Genauso wie wir die Funktion „ Ergebnis abrufen“ aufrufen und die Anmeldenummer dieses Studenten weitergeben Schließlich rufen wir die Funktion „ Aktualisierte Schüler“ auf und übergeben die Ergebnis-ID, die wir aktualisieren möchten Sie können sehen, dass synchroner Code sehr einfach und leicht zu lesen und zu verwalten Jetzt fragst du dich vielleicht, was ist das Problem mit der Rückruf-Hölle Siehst du, auch wenn wir einen Rückruf haben, funktioniert unser Code. Das Problem ist nur, dass es schwer zu lesen und zu verwalten ist , weil wir in der realen Welt möglicherweise mehr als drei verschachtelte Rückrufe haben Dann wird es irgendwann wirklich schwierig sein, es zu lesen, zu verwalten und sogar zu skalieren Deshalb müssen wir dafür sorgen, dass unser Code leicht lesbar ist. Es ist wirklich einfach. Wir müssen nur unsere anonyme Funktion erstellen, das ist die Funktion , die keinen Namen hat. Wandle diese anonymen Callback-Funktionen in benannte Funktionen In einfachen Worten, an der Stelle, an der wir diese Callback-Funktion hier definieren, werden wir sie separat definieren und den Funktionsnamen hier übergeben Lassen Sie uns unsere Konsolen wieder gut hinzufügen und diese letzte Funktion entfernen Wir haben es gerade für den Demo-Rückruf hinzugefügt. Hier erstellen wir eine Funktion namens cost, print student. Wir können sie beliebig nennen, und ich verwende hier Pfeilfunktionen im Text, weil es für die Callback-Funktion einfach ist Jetzt können wir diese Callback-Funktion von hier aus ausschneiden und an der Stelle dieser Pfeilfunktion einfügen Gut und an der Stelle dieser Callback-Funktion übergeben wir einfach die Print-Studenten-Funktion Achten Sie darauf, dass Sie hier nicht die Funktion „Student drucken“ aufrufen. Wir müssen nur die Funktion als Parameter übergeben, und diese Print-Student-Funktion wird hier als Callback-Funktion ausgeführt Lassen Sie uns nun schnell diese anonyme Callback-Funktion in eine benannte Funktion umwandeln diese anonyme Callback-Funktion in eine benannte Funktion Das Druckergebnis von Cons ist also gleich, und hier fügen wir einfach diese Callback-Funktion Und an dieser Stelle übergeben wir das Druckergebnis Siehst du, jetzt sieht unser Code sauber und pflegeleicht aus. Um es kurz zusammenzufassen: Wenn wir verschachtelte Callback-Funktionen haben, erhalten wir ein Callback-Heal-Problem, das schwer zu lesen und zu verwalten ist Was ist die Lösung? Richtig, wir konvertieren unsere anonymen Callback-Funktionen in benannte Funktionen. So einfach ist das 54. Versprechen in JavaScript: In der vorherigen Lektion haben wir gesehen, wie asynchrone Aufgaben mithilfe von Callback-Funktionen behandelt Aber in dieser Implementierung bekommen wir dieses Problem mit der Callback-Hilfe, und wir lösen dieses Problem auch mit einer Jetzt ist meine Frage, wie viele neue Funktionen wir erstellen? Stellen Sie sich vor, wir haben zehn verschachtelte Callback-Funktionen, dann müssen wir zehn benannte Funktionen erstellen bevor wir unsere Hauptfunktion aufrufen Gibt es eine andere Möglichkeit, asynchrone Aufgaben zu handhaben? Ja, es gibt noch einen anderen Weg, nämlich die Verwendung von Promise. Was ist Promise? Ein Promise ist ein spezielles Objekt, das das Ergebnis einer asynchronen Operation speichern kann Mit anderen Worten, ein Versprechen ist ein Versprechen Ihnen das Ergebnis der asynchronen Operation zu geben, oder wenn die asynchrone Operation fehlschlägt, wird Moment lernen wir Versprechen in der neuen Datei namens promises dot js Und dann aktualisieren wir unseren vorherigen Code mit der Promises-Implementierung. Also erstellen wir zuerst Versprechen, und dann werden wir sehen, wie wir dieses Versprechen umsetzen können . Es ist wirklich einfach. Um also ein Versprechen zu erstellen, schreiben wir ein neues Schlüsselwort und dann ein Versprechen. Nun, dieses Versprechen ist eine Klasse und benötigt ein Argument, das eine Funktion mit zwei Parametern ist. Hier ist also der erste Parameter die Auflösung und der zweite Parameter die Ablehnungsfunktion und die Pfeilfunktion. In dieser Funktion können wir jetzt unsere asynchrone Aufgabe ausführen Auch hier gehen wir davon aus, dass wir Daten aus der Datenbank erhalten Also schreiben wir hier, setzen die Timeout-Funktion und übergeben die Callback-Funktion und 3.000 Stellen Sie sich nun vor, wir beziehen hier unsere Daten aus der Datenbank. Also erstellen wir eine Variable namens Student entspricht Objekt, sagen wir, ID zu eins und Name zu Hurley Hier nennen wir Resolve, weil wir die Daten erfolgreich abgerufen haben und wir diesen Studenten hier übergeben haben Hier, unser Versprechen ist fertig. Lassen Sie uns nun dieses Versprechen einlösen , das immer PR für Versprechen heißt Gut. Lassen Sie uns nun sehen, wie wir dieses Versprechen einlösen können. Es ist wirklich einfach, PR zu schreiben, das ist dieses Versprechen, Punkt, und hier haben wir zwei Hauptmethoden, dann und catch. Wenn wir also Promise erstellen, befindet es sich standardmäßig im Status Ausstehend. Und wenn wir die asynchrone Aufgabe abschließen, befindet sich Promise im Status „ Gelöst“ oder „Erfüllt Und wenn es einen Fehler gibt, dann ist das Versprechen im Status Abgelehnt Dies wird als Lebenszyklus des Versprechens bezeichnet. Hier ist unser Versprechen erfüllt, weil wir hier Resolve-Funktion nennen. Wenn also das Versprechen erfüllt ist, dann erhalten wir unsere Daten nach dieser Methode. Jetzt speichern wir unsere Daten in diesem Ergebnisparameter und ziehen dann einfach das Punktprotokoll zu diesem Ergebnis heran. Lassen Sie uns also diese Datei ausführen. Node verspricht Punkt gs, sehen Sie, nach 3 Sekunden erhalten wir dieses Ergebnis. Stellen Sie sich vor, wir bekommen aus irgendeinem Grund keine Daten aus der Datenbank. Hier erstellen wir eine Variable namens status und machen sie falsch. Hier fügen wir eine Bedingung hinzu. Wenn der Status und mein System automatisch heruntergefahren werden, lassen Sie mich es erneut starten. Ja, ich bin zurück, also lass uns weitermachen. Wenn der Status wahr ist, dann führen wir diese Auflösungsfunktion aus, andernfalls nennen wir hier einfach die Ablehnungsfunktion. Um das besser zu machen, erstellen wir jedes Mal, wenn wir einen Fehler zurückgeben wollen, einen neuen Fehler und übergeben unsere Fehlermeldung hier. Das ist eine Fehlermeldung. Speichern Sie die Änderungen und lassen Sie uns diese Promises-Dot-JS-Datei ausführen. Siehst du, wir bekommen diesen Fehler hier. Lassen Sie uns nun diesen Fehler verarbeiten, genauso wie wir hier Daten in der Then-Methode erhalten. Nach dieser Then-Methode fügen wir eine weitere Methode namens Cache hinzu und darin übergeben wir auch die Callback-Funktion Hier erhalten wir einen Fehler im Parameter und konsultieren das Punktprotokoll für diesen Fehler Speichern Sie das und lassen Sie uns diese Datei erneut ausführen. Siehst du, wir bekommen diesen Fehler hier, und so können wir Promise mit der Methode then und catch konsumieren . Wir können sehen, anstatt die Callback-Funktion zu verwenden , um etwas nach einer asynchronen Aufgabe zu tun , können wir Promise verwenden, um diese asynchrone Aufgabe auszuführen und dann einfach dieses Versprechen zu konsumieren Kurz gesagt, wenn unser Versprechen aufgelöst wird, dann wird diese Then-Methode ausgeführt, und wenn unser Versprechen abgelehnt wird, dann wird diese Cache-Methode ausgeführt, so einfach ist Wenn du dir Sorgen um die Schöpfung des Versprechens machst, dann mach dir keine Gedanken über die Praxis, du wirst dich damit vertraut machen. Lass mich dir eins sagen. In der realen Welt konsumieren wir zu 99% nur Versprechen. Nur ein paar Mal müssen wir ein Versprechen abgeben. In der nächsten Lektion werden wir unseren Callback-Heal-Code mithilfe von Promises behandeln . Es wird Spaß machen 55. Rückrufe durch Versprechen ersetzen: Lassen Sie uns unseren Callback-L-Code mithilfe von Versprechen behandeln. Sie können den Code der Callback-Hilfe weiter unten in dieser Lektion herunterladen Callback-Hilfe weiter unten in dieser Lektion Diesen Code schreiben wir in der vierten Lektion. Kopieren Sie den Code und fügen Sie ihn in eine andere callbacltjs-Datei oder auch in den Ressourcenordner und in den asynchronen Ordner Sie erhalten diese Datei als Callback Sie können das auch zu Ihrem Projekt hinzufügen. Wie wir wissen, definieren wir nun vielversprechend unsere asynchrone Aufgabe Und hier haben wir die beiden asynchronen Aufgaben in zwei separaten Funktionen Anstatt diese Funktionen zu entfernen, können wir jetzt einfach ein neues Versprechen von dieser Funktion zurückgeben Lass dich nicht verwirren. Lass mich dir zeigen, was ich meine. Also hier, in der Filzstudentenfunktion, wir hier einfach ein neues Versprechen zurück. Nun, was wir in diesem Versprechen übergeben, übergeben wir hier eine Funktion, die zwei Parameter hat: Resolve und Reject. Nun, in dieser Funktion, was wir richtig machen, führen wir hier eine synchrone Aufgabe aus Also verschieben wir diese eingestellte Timeout-Funktion hierher indem wir die Tasten Alter oder Option und Aro Chies gedrückt halten Jetzt brauchen wir diesen Rückruf nicht. Am Ort des Rückrufs übergeben wir unsere Daten in der Resolve-Funktion, und wir benötigen auch keinen Callback im Parameter Machen wir jetzt dasselbe in dieser Gad-Ergebnisfunktion. Also geben wir Promise zurück und übergeben hier eine Funktion mit zwei Parametern, resolve und reject Wenn du nicht diese ganze Zeile schreiben willst, dann lass mich dir die Abkürzung dafür zeigen. Hier schreiben wir also ein neues Versprechen ohne Leerzeichen und wählen diesen Vorschlag aus. Siehst du, hier bekommen wir unser neues Versprechen. Ich zeige das vorher nicht, weil ich möchte, dass du dich mit Versprechen vertraut machst. Nun verschieben wir diesen asynchronen Code auch in die Funktion und an die Stelle von callba, wir geben die Daten in der Resolve-Methode zurück und entfernen von oben diesen Lassen Sie uns nun dieses Versprechen in Anspruch nehmen. Oben kommentieren wir diesen vorherigen Code, in dem wir die Callback-Hölle erleben Hier nennen wir zuerst Fair Student Function und Passie ID One Dieser Ausdruck gibt dieses Versprechen zurück. Lassen Sie uns dieses Versprechen in einer Variablen namens PR speichern. Hier haben wir unser Versprechen in dieser PR-Variablen. Jetzt müssen wir dieses Versprechen nur noch einlösen. Teil. Welche Methode wir hier verwenden, wir verwenden Punkt und dann Methode. Hier übergeben wir die Funktion. Hier erhalten wir Parameter, Daten, oder wir können es Student Anything nennen, Pfeilfunktion, und was wir tun wollen, wenn wir Schülerdaten haben. Wir wollen einfach die Funktion Get Result aufrufen und hier Student Dot Enrollment übergeben , weil wir hier die Immatrikulationseigenschaften haben Stellen Sie sicher, dass Sie dieselbe Eigenschaft schreiben wie Sie So konsumieren wir also First Promise. Anstatt dieses Versprechen in einer Variablen zu speichern, können wir diesen Ausdruck hier auch direkt schreiben. Das verwirrt Sie, dann machen Sie sich keine Sorgen, Sie können das Versprechen in einer Variablen speichern und es dann konsumieren. Das ist die gängige Praxis, und deshalb zeige ich es dir hier. Wie wir wissen, wird diese Gat-Ergebnisfunktion auch Promise zurückgeben. Wie können wir dieses Versprechen nutzen? Es ist wirklich einfach. Wo wir hier zehn Methoden schreiben, können wir sie nach unseren ersten zehn Methoden schreiben. Nun, was wir aus diesem Versprechen, dem Ergebnis, Pfeilfunktion und einfach dem Ergebnis des Punktprotokolls entnehmen können. Speichern Sie die Änderungen und lassen Sie uns unsere Callback-Hilfedatei ausführen. Node Callback Hell Punkt gs. Gut. Sehen Sie, zuerst werden Schülerdaten abgerufen Danach rufen wir das Ergebnis ab und drucken es dann aus. Wir können also sehen, dass unser Code, wenn wir diese Versprechen verwenden , sauberer und leichter lesbar aussieht Wenn wir nun eine andere Funktion in callBal haben , dann ähnlich dieser, kehren wir hierher zurück, diese neue Funktion und rufen sie Wenn wir nun diese Funktion aufrufen und zurückgeben, können wir hier eine weitere Than-Methode hinzufügen, so einfach ist das Einige Schüler könnten verwirrt sein diese Funktion zum Abrufen von Ergebnissen aufgerufen wird. Sie fragen, was hier passiert? Erklären Sie diesen Code im Detail. Also hier rufe ich wieder diese Funktion zum Abrufen von Studenten auf und übergebe sie einfach und akzeptiere das Versprechen mit der Methode Und hier bekommen wir Studentendaten. Wenn wir Schülerdaten erhalten, können wir die normale Pfeilfunktion mit C-Klammern übergeben. Jetzt haben wir innerhalb dieser CL-Klammern keinen Code mehr. Wir wollen nur die Funktion Get result mit Student Dot Enrollment zurückgeben Funktion Get result mit Student Dot Enrollment Da wir also nur diese eine Zeile zurückgeben wollen, können wir diese C-Klammern entfernen und wir können auch das Schlüsselwort return entfernen Dies ist der kurze Weg, um etwas von der Pfeilfunktion zurückzugeben. Wenn wir also eine Zeile von der Pfeilfunktion zurückgeben wollen , dann schreiben wir direkt nach Pfeil. Hier geben wir diese Funktion zurück. Dieser ganze Ausdruck gibt ein neues Versprechen zurück. Also können wir es in einer neuen Variablen namens new PR speichern. Lassen Sie uns dieses Versprechen nun auch in Anspruch nehmen. Wir schreiben newpar dot the und dann bekommen wir das Ergebnis, Pfeilfunktion und einfach die Konsole mit Punktprotokoll und Ergebnis und drucken das Ergebnis hier nun, an der Stelle dieser neuen PR, Können wir nun, an der Stelle dieser neuen PR, diesen ganzen Ausdruck schreiben Klar. An der Stelle der neuen PR fügen wir diesen Ausdruck ein. Und genau das haben wir hier gemacht. Als bewährte Methode haben wir nun versprochen, dass Promise mithilfe der Reject-Methode auch Fehler zurückgeben kann. Es ist also besser, diesen Fehler zu behandeln. Dafür haben wir eine andere Methode, nämlich Cache. Das haben wir auch in der vorherigen Lektion gesehen. Also fügen wir hier auch die Cache-Methode hinzu. Hier erhalten wir ein Fehlerobjekt und wir konsolidieren diesen Fehler einfach Zum Testen fügen wir einfach Reject in die Gat-Ergebnisfunktion vor der Resolve-Methode und übergeben hier einen neuen Fehler und die Fehlermeldung, Ergebnis nicht gefunden Speichern Sie die Änderungen und schauen Sie sich das an. Lassen Sie uns diese Anwendung erneut ausführen. Es patcht Daten. Siehst du, hier bekommen wir das Ergebnis nicht gefunden. Wenn bei einer dieser Zusagen ein Fehler auftritt, wird diese Sketch-Methode ausgeführt. So einfach ist das. Lassen Sie mich diese Ablehnungsmethode kommentieren. Sie dient nur zum Testen. Ich hoffe, dass alle Zweifel geklärt sind. In der nächsten Lektion werden wir nun eine andere einfachste Möglichkeit sehen , denselben Code zu schreiben. 56. Async:await in JavaScript: Wie wir nun in der Calbecl nach dieser Funktion zum Abrufen von Ergebnissen sehen können , verbrauchen wir Stellen Sie sich nun vor, dass wir in dieser Colbecl-Funktion nach dieser Funktion zum Abrufen des Ergebnisses ein weiteres wir Dafür müssen wir eine weitere Than-Methode hinzufügen, und das kann auch etwas verwirrend sein Lassen Sie uns diesen Code mit Async und Await einfacher machen. Was ist Async Awight? Async Awight ist eine Möglichkeit, asynchronen Code als synchronen Code zu schreiben synchronen Durch die Verwendung von Async Awight können wir Versprechen viel einfacher konsumieren Zuallererst nennen wir hier faire Studentenfunktion und geben hier einfach die erste ID Nun gibt diese Funktion ein Versprechen zurück, das sich zunächst im Status „Ausstehend“ befindet , da wir in diesem Promise eine asynchrone Aufgabe ausführen Wir können also hier warten , bis dieses Versprechen mit dem Schlüsselwort Awight aufgelöst Also pausiert awight die Ausführung des Codes, bis das Versprechen erfüllt Sobald das Versprechen erfüllt ist, werden die Daten zurückgegeben Wenn wir nun Daten erhalten, können wir sie in der Variablen const student speichern Jetzt haben wir das Studentenobjekt, also können wir Get Result aufrufen und hier Student Dot Enrollment weiterleiten Diese Funktion gibt auch Promise zurück, also verwenden wir wieder das Await-Schlüsselwort für dieses Versprechen, get resolve und das gibt auch Daten zurück Konstantes Ergebnis. schreiben wir einfach das CLO Parkansa-Protokoll mit dem Eigenschaftsnamen und dem Ergebnis und drücken Ascap Ergebnis Jetzt können Sie sehen, dass wir mithilfe eines Gewichtungsschlüsselworts asynchronen Code schreiben können, der wie synchroner Code aussieht . Lassen Sie mich diesen vorherigen Code kommentieren. Speichern Sie das und lassen Sie uns diesen Code erneut ausführen. Node, Callbull-Dots. Sehen Sie, hier fangen wir an, Daten aus der Datenbank abzurufen, und dann bekommen wir ein Ergebnis, und am Ende Unser Code funktioniert also synchron weil unser Code hier an diesem Ende blockiert. Als bewährte Methode und um diesen Code asynchron zu machen, müssen wir dieses Await immer innerhalb der asynchronen Funktion verwenden , da es in einer normalen Funktion nicht funktioniert Hier erstellen wir also eine Funktion namens print result. Und verschiebe diesen Code einfach in diese Funktion. Jetzt fragen Sie sich vielleicht, dass dies die einfache Funktion ist, aber eine Gewichtung ist nur in der ASN-Funktion gültig Wie können wir also aus unserer einfachen Funktion eine Acing-Funktion machen? Es ist wirklich einfach. Wir müssen nur das ASN-Schlüsselwort vor der Funktion hinzufügen. Und danach nennen wir diese Funktion einfach print result Ansonsten, wie es funktionieren wird. Nehmen Sie die Änderungen vor und lassen Sie uns das überprüfen. Führen Sie unsere Datei erneut aus. Gut. Es holt sich und sehen Sie hier, wir bekommen ein Ergebnis und es blockiert dieses Ende auch nicht Wir können sehen, dass wir mithilfe von Async und Await unseren asynchronen Code schreiben können, der wie synchroner Code aussieht Dies ist lesbarer und klarer als dieser vorherige Code. Was ist nun, wenn dieses Versprechen schriftlichen Fehler mit der Ablehnungsmethode enthält? Hier entfernen wir den Kommentar aus der Ablehnungsmethode. Mal sehen, wie wir mit Fehlern in der asynchronen AT-Methode umgehen können Fehlern in der asynchronen AT-Methode Fehler in asyncawt zu behandeln, müssen wir also Um Fehler in asyncawt zu behandeln, müssen wir also die Methode try and catch verwenden Es ist auch einfach. Lass es mich dir zeigen. Also fügen wir zuerst try hinzu und in die Gy-Klammern verschieben wir unseren Code. Wenn nun in diesem Triplog etwas schief geht , wird unser Code direkt in den Cache-Block verschoben Also fügen wir hier einen Cache-Block hinzu, und dieser Cache-Block hat einen Parameter namens Fehler Und ja, es ist derselbe Fehler , der in der Ablehnungsfunktion geschrieben wurde. In der CLI-Klammer können wir diesen Fehler einfach in Dot Log nachschlagen. Lassen Sie uns nun sehen, ob es funktioniert oder nicht. Speichern Sie das und lassen Sie uns diese Datei noch einmal ausführen. Siehst du, hier bekommen wir einen Fehler. Einfach ausgedrückt, wenn in diesem Triplog ein Fehler auftritt , dann wird dieser Catch-Block ausgeführt Nun könnten einige Schüler fragen. Es scheint, als ob dieser 08 unseren Code daran hindert, vorwärts zu laufen. Und ja, es ist wahr, aber das gilt nur für diese Funktion. Hier haben wir die Konsole und nach diesem Funktionsaufruf. In der Ausgabe bekommen wir also Start, dann wird unsere Funktion aufgerufen. In dieser Funktion wird zuerst die Funktion Fair Student aufgerufen, was Promise zurückgibt. Eine Gewichtung unterbricht also die Ausführung des Codes, bis das Versprechen erfüllt ist. Unser Code wird sich also nicht nur in dieser Funktion weiterentwickeln, sondern auch außerhalb der Funktion. Und das ist der Grund, warum wir nach dem Start N bekommen. Wenn wir dann andere Zeilen haben, dann werden sie auch ausgeführt. Keine Sorge, Asyncawd ist eine Möglichkeit, asynchronen Code zu schreiben, der wie synchroner Code aussieht, aber unser Code funktioniert Um es kurz zusammenzufassen: Wenn wir etwas versprechen, können wir das Schlüsselwort Weigh verwenden . Eine Gewichtung unterbricht die Ausführung, bis ein Versprechen erfüllt ist und wir nur eine Gewichtung in der asynchronen Funktion verwenden können nur eine Gewichtung in der asynchronen Funktion verwenden Für die Fehlerbehandlung in einer Syncowt-Methode verwenden wir den Blog try and catch Wir erhalten einen Fehler im trockenen Blog, dann läuft unsere Cache-Methode so einfach diese Weise können wir Versprechen viel einfacher verarbeiten als mit dieser T-and-Catch-Methode. Sie haben die Wahl, was Sie verwenden möchten. Sie funktionieren beide gleich. Es liegt ganz bei Ihnen, was Sie verwenden möchten. Wenn Sie in Async und AD einen TryCatch-Blog hinzufügen möchten, schreiben Sie einfach Tricach und wählen Siehst du, hier bekommen wir Tri Case Block. Ich hoffe, Sie lernen viel aus diesem Abschnitt oder diese Konzepte werden aufgefrischt. Ohne diese Konzepte zu klären, können wir uns nicht auf die BG-Anwendungen konzentrieren Wenn Sie sich diesen Kurs ständig ansehen, nehmen Sie sich fünf bis zehn Minuten Pause, schnappen Sie sich etwas frische Luft und wir sehen uns im nächsten Abschnitt. 57. Abschnitt 07 MongoDB-Grundlagen: Willkommen im siebten Abschnitt des ultimativen No-JS-Kurses Bisher definieren wir in unseren Projekten Daten in einem einfachen JavaScript-Array. Das Problem bei diesem Ansatz ist jedoch , dass beim Neustart unseres Servers oder unserer Anwendung unsere Daten auf den definierten Wert zurückgesetzt werden und wir unsere Änderungen an unseren Daten verlieren. Jetzt, zu diesem Zeitpunkt, kommt die Datenbank ins Spiel, also werden wir unsere Daten in der Datenbank speichern. Es gibt viele Arten von Datenbankoptionen wie MySQL, SQL Lite, Mongo Dib usw. Mongo DB ist die am häufigsten verwendete Datenbank mit Knotenanwendungen, und genau das werden wir in diesem Kurs lernen Nun, eine Sache, die ich klarstellen möchte , ist, dass Sie nach Abschluss dieses Kurses Mongo DB nicht vollständig beherrschen werden, da Mongo Di B selbst ein vier- bis fünfstündiger Kurs ist, aber ich werde versuchen, so viele Themen wie möglich zu behandeln In diesem Abschnitt werden wir also mit den Grundlagen der Datenbank beginnen mit den Grundlagen der Datenbank und dann mit Übung mit dem Erstellen, Lesen, Aktualisieren und Löschen der Daten fortfahren mit dem Erstellen, Lesen, Aktualisieren und Löschen der Daten Ich freue mich sehr und ich hoffe, Sie auch. Lassen Sie uns also in diesen Abschnitt eintauchen. 58. Einführung der Datenbank: Bevor wir anfangen, Mongo Deb zu lernen, ist es besser, einige grundlegende Datenbankbegriffe zu lernen Wie Sie vielleicht wissen, handelt es sich bei Datenbanken eine organisierte Sammlung strukturierter Informationen, die als Daten bezeichnet Sie werden auf dem Computer oder in der Cloud gespeichert In alten Schulen verwendete unser Lehrer ein Buch oder ein Register, um die Anwesenheit der Schüler zu verfolgen. Das ist eine Datenbank, aber sie ist auf festem Papier. In der heutigen Welt verwenden wir Computersysteme, um diese Daten zu speichern, sodass wir jederzeit und von überall darauf zugreifen können. Das wissen wir alle, oder? Jetzt gibt es zwei Arten von Datenbanken. erste ist eine SQL-Datenbank oder eine relationale Datenbank, und die zweite ist keine SQL-Datenbank oder eine nicht relationale Sie unterscheiden sich darin, wie sie Daten organisieren, speichern und verwalten Lassen Sie mich Ihnen das eins nach dem anderen erklären. SQL steht also für strukturierte Abfragesprache. Die SQL-Datenbank ist gut organisiert und füllt Schränke. Diese beiden Daten in Tabellen mehrere Spalten und Zeilen wie diese verwenden. Wir können sehen, dass dies eine sehr organisierte Struktur ist. Jede Spalte der Tabelle steht für unterschiedliche Datenmengen wie Name, E-Mail-Adresse, Telefonnummer und Passwort, und jede Zeile der Tabelle ist eine neue Gruppe von Benutzern. Wir müssen einzelne Benutzerdaten für all diese Spalten übergeben, und deshalb ist es eine organisierte Tabelle. Auf der anderen Seite ist keine SQL-Datenbank wie ein flexibles Board, auf dem wir Daten so organisieren können , wie wir wollen. In keiner SQL-Datenbank haben wir keine Tabellen, weil sie keiner strikten tabellenbasierten Struktur oder schemabasierten Struktur folgen . SQL-Datenbanken speichern Daten in flexibleren Formaten wie DSN-Dokumenten oder Schlüssel-Wert-Paaren Wenn wir beispielsweise dieselben Benutzerdaten haben , können wir sie wie folgt in einem Schlüssel-Wert-Paar speichern Wir müssen nicht alle Felder für jeden Benutzer angeben, und deshalb können wir es Schemas oder flexible Schemastruktur nennen Schemas oder flexible Schemastruktur Beliebte Optionen für SQL sind MesquleQtOracle usw. Wo in NoSQL haben wir Mongo DiBRDs et cetera . Könnte fragen, wann wir SQL wählen und wann wir uns für keine SQL-Datenbank entscheiden Es hängt also davon ab, mit welcher Art von Daten Sie es zu tun haben und was Ihre Anwendung benötigt. Wir verwenden SQL, wenn wir möchten, dass unsere Daten strukturiert und in Tabellen organisiert werden. Außerdem verwenden wir die SQL-Datenbank, wenn wir komplexe Abfragen für Analysen ausführen müssen oder wenn Datenkonsistenz verwendet wird . Auf der anderen Seite verwenden wir kein SQL, wenn wir wollen, dass unsere Daten unstrukturiert oder halbstrukturiert sind, mit Ausnahme des schnellen Datenwachstums, wir brauchen Flexibilität in unserem Datenmodell unsere Anwendung ist Echtzeit oder Big Data, dann verwenden wir keine SQUL-Datenbank Zum Beispiel entwickeln wir E-Commerce-Anwendungen, die viele Funktionen haben, wie z. B. das Hochladen von Bewertungen durch Benutzer, Produktvorschläge, bei denen unsere Daten unstrukturiert oder halbstrukturiert sind die viele Funktionen haben, wie z. B. das Hochladen von Bewertungen durch Benutzer, Produktvorschläge, bei denen , und die auch Benutzer in großer Anzahl Bewertungen abgeben können Welche Datenbank sollten wir zu diesem Zeitpunkt wählen? Richtig, wir verwenden hier keine SQL-Datenbank. Nehmen wir noch ein Beispiel. Nehmen wir an, wir bauen ein Bankensystem auf, in dem wir strenge Daten und genaue Finanztransaktionen benötigen . Welche Datenbank sollten wir wählen? Richtig, benutze hier SQL. Es hängt also wirklich davon ab, mit welcher Art von Daten wir es zu tun haben und welche Art von Anwendung wir erstellen möchten. In den meisten Fällen teilt Ihnen Ihr Team , welche Datenbank Sie Ihrer Anwendung hinzufügen sollten. Machen Sie sich darüber also keine Sorgen. Viele Entwickler kennen den Unterschied zwischen SQL und No-SQL wirklich nicht . Du weißt es, oder? In vielen Node-Anwendungen wählen Entwickler standardmäßig Mongo DB, also die Datenbank ohne Squal Und wenn Sie MSTech-Entwickler werden möchten, ist dies In diesem Kurs füge ich MongoDB als Datenbank hinzu. Keine Sorge, wir werden MongoDB Schritt für Schritt lernen. 59. Installieren von MongoDB unter Windows: Lassen Sie uns Mongo DV unter Windows installieren Wenn Sie MG haben, können Sie diese Lektion überspringen Gehen Sie zunächst zu mongodib.com. Gehen Sie jetzt zu diesen Produkten und wählen Sie Community Edition. Laden Sie Community herunter. Scrollen Sie nach unten. Und hier können wir die Mongo Di B-Version auswählen In meiner Empfehlung, ändern Sie es bitte nicht. Als Nächstes können wir unsere Plattform auswählen und dann können Sie das Paket auswählen. Machen Sie sich darüber keine Sorgen, klicken Sie auf Herunterladen. Siehst du, der Download wurde gestartet. Nachdem Sie den Download abgeschlossen haben, öffnen Sie das Setup und Sie werden nach der Installationsgenehmigung gefragt. Erlaube es. Klicken Sie auf Weiter. Akzeptiere die Vereinbarung. Klicken Sie auf Fertig stellen. Danach können wir von hier aus unseren Installationspfad ändern. Aber wenn Sie keinen Grund haben, ändern Sie ihn nicht. Klicken Sie einfach auf Weiter. Stellen Sie sicher, dass Sie diesen Mongo-DB-Kompass auswählen, die Anwendung für MongoDB, in der Sie alle Datenbanktabellen anzeigen und bearbeiten oder löschen können und bearbeiten oder löschen Klicken Sie auf Weiter und installieren Sie es. Dies wird einige Zeit in Anspruch nehmen, etwa fünf bis zehn Minuten, da wir auch Mongo DB Compass installieren nun nach Abschluss Lassen Sie uns dies nun nach Abschluss dieser Installation überprüfen Öffnen Sie die Befehlszeile, schreiben Sie Mongo D und drücken Sie die Eingabetaste. Wir erhalten diesen Fehler, Mongo D wird nicht als interner oder externer Befehl erkannt Um diesen Fehler zu beheben, müssen wir erneut zur Mongo Db-Website und hier zu den Top-Produkten gehen und alle Produkte in Tools anzeigen Scrollen Sie nun auf dieser Seite und hier erhalten wir die Zellenoption Wählen Sie diese jetzt aus, klicken Sie auf Herunterladen und scrollen Sie nach unten. Und hier laden wir dieses Setup wieder herunter. nun nach Abschluss des Downloads den Download-Ordner Öffnen Sie nun nach Abschluss des Downloads den Download-Ordner und extrahieren Sie die ZIP-Datei, die wir gerade heruntergeladen haben. Gut. Öffnen Sie jetzt diesen Ordner und im Bin-Ordner erhalten wir diese Mongos-Datei Kopieren Sie diese einfach und öffnen Sie Ihre C-Drive-Programmdateien. MongoDB-Server, 8.0 B, und hier fügen wir die eingestellte Anwendung Dieser Mongos ist unsere Mongo-DB-Zelle. Jetzt müssen wir einen letzten Schritt tun, nämlich diesen Pfad zum Umgebungspfad festzulegen Kopieren Sie also diesen Pfad zu Beginn, suchen Sie nach der Umgebungsvariablen und öffnen Sie die Bearbeitung der Systemumgebungsvariablen. Lassen Sie mich zur Sache schließen. Klicken Sie nun auf diese Umgebungsvariablen, wählen Sie unter Systemvariablen den Pfad aus und klicken Sie auf Bearbeiten. Jetzt müssen wir diesen Bin-Pfad hier hinzufügen, also klicken Sie auf Neu und geben Sie den Pfad ein. Klicken Sie auf Okay. Okay und okay. Öffnen Sie jetzt erneut die Befehlszeile. Wir schreiben Mangos und drücken Enter. Wir werden die Mongo-DB-Zelle bekommen, damit wir Mongo DB erfolgreich in unserem System installieren Lassen Sie mich Ihnen nun einen kurzen Überblick über diesen Mongo-DB-Kompass Wenn wir diesen Kompass zum ersten Mal öffnen, müssen wir unsere Verbindungszeichenfolge eingeben, sich um unseren lokalen Host handelt, Spalte 27017 Sie können diese Verbindungszeichenfolge schreiben, die ich hinzugefügt habe, und auf Speichern und verbinden klicken Siehst du, hier können wir unsere Datenbank sehen und wir können auch Tabellen sehen und A können wir Dokumente sehen. 60. Verbinden von MongoDB mit Node App: Also installieren wir Mongo Di B in unserem System. Lassen Sie uns nun diesen Mongo Di B mit der Node-Anwendung verbinden. Mongo Di B zu lernen, werden wir also ein neues Projekt erstellen, weil ich nicht möchte, dass Sie mit dem vorherigen Tastak-Projekt verwechselt werden Wir werden Mongo Di B als Übung zu diesem Projekt hinzufügen . Es wird Spaß machen Vorerst erstellen wir im Projektordner einen neuen Ordner, sagen wir Mongo-Demo, komischer Name, aber zum Lernen ist es okay Lassen Sie uns diesen Ordner im VS-Code öffnen. Um dieses Projekt zu initialisieren, öffnen wir nun unser Terminal und schreiben NPM hinein I. Gut. Und hier erstellen wir eine neue Datei, den Indexpunkt gs In Node-Anwendungen für die Verwaltung und Arbeit mit MongoDB werden wir jetzt Verwaltung und Arbeit mit MongoDB eine sehr beliebte Bibliothek verwenden, nämlich Mangos In einfachen Worten, mit der Mongoose-Bibliothek können wir problemlos mit Mongo DB arbeiten Lassen Sie uns diese Bibliothek mit NPM install Mongoose Wenn Sie das gleiche Ergebnis erzielen möchten wie ich in diesem Kurs, dann genau hier Gut. Um diese Bibliothek nun zu verwenden, importieren wir sie zunächst mit der erforderlichen Funktion. Hier übergeben wir mongoose und speichern es in der Variablen const Nun, dieses Mungo-Objekt hat viele Methoden. Eine davon ist Connect, also verwenden Mungos Hier müssen wir die URL der Mongo-DB-Datenbank übergeben, mit der wir eine Verbindung herstellen möchten Wir öffnen hier die MongoDB-Kompassanwendung. Hier können wir sehen, dass wir eine Verbindungszeichenfolge haben, bei der es sich um einen lokalen Host handelt, Spalte 27017 In unserem Code schreiben wir die Codes Mongo DB, column, double forward slash, local host, Column 27017, die die lokale Mongo Deb-Datenbank repräsentieren , Schrägstrich, und hier schreiben wir unseren spezifischen Datenbanksammlungsnamen, sagen wir Mongo Demo, das ist nicht der Anwendungsname, das ist der Datenbankname die die lokale Mongo Deb-Datenbank repräsentieren, Schrägstrich, und hier schreiben wir unseren spezifischen Datenbanksammlungsnamen, sagen wir Mongo Demo, das ist nicht der Anwendungsname, das ist der Datenbankname. Keine Sorge, wir werden das in den nächsten Abschnitten sehen. Nun, dieser Ausdruck gibt ein Versprechen zurück, und Sie erinnern sich, wie wir mit Versprechen umgehen können? Wir können die Methode then und catch verwenden, oder wir können async await verwenden Derzeit haben wir keine verschachtelten Versprechen, daher können wir der Einfachheit halber die Methode here, then verwenden Wenn Sie ASN und Aviate verwenden möchten, müssen Sie eine neue ASN-Funktion erstellen Hier fügen wir also diese zehn Methoden hinzu, was bedeutet, dass wir sie erfolgreich verbinden (Pfeilfunktion und wir einfach die Konsole mit Punktprotokoll und Mongo Es kann also passieren, dass etwas schief geht , z. B. die Internetverbindung verloren gegangen oder die Datenbank nicht gefunden wurde oder irgendwelche Fehler in der Verbindungszeichenfolge Zu diesem Zeitpunkt werden wir einen Fehler in diesem Versprechen erhalten. Also fügen wir hier auch die Catch-Methode hinzu, und hier erhalten wir ein Fehlerobjekt. Und wir konsolen einfach das Punktprotokoll, Mongo-DB-Verbindung ist fehlgeschlagen Komma das Fehlerobjekt. Im Grunde sagen wir zu Mongoose, verbinden Sie unsere Anwendung dieser lokalen Datenbank, Mongo-Demo Jetzt fragen Sie sich vielleicht, wir haben diese Mongo-Demo-Datenbank nicht erstellt Wie kann Mongoose unsere Anwendung mit dieser Datenbank verbinden ? Wird es uns einen Fehler geben? Und die Antwort nein, es wird uns keinen Fehler geben denn wenn diese Datenbank-Mongo-Demo in unserem System nicht verfügbar ist, erstellt Mongoose eine neue Datenbank namens Mongo-Demo, und wenn diese Datenbank bereits verfügbar ist, wird sie einfach verwendet Wenn diese Datenbank nun erfolgreich verbunden wurde, protokollieren wir die Erfolgsmeldung, und wenn unsere Verbindung fehlschlägt, wir Speichern Sie die Änderungen und lassen Sie uns unsere Anwendung mit Nodemon Index Dot JS ausführen unsere Anwendung mit Nodemon Index Dot Siehst du, hier haben wir die Verbindung erfolgreich hergestellt. So verbinden wir Mongo Di Be mithilfe der Dot Connect-Methode von Mongo mit unserer Knotenanwendung Lassen Sie mich Ihnen jetzt etwas sagen. Zuvor hatte Mongo Di Be eine ältere Methode, um eine Verbindung zur Datenbank herzustellen, aber sie war nicht perfekt, und Entwickler hatten damit ein Problem In einem alten Code werden Sie sehen, diese Optionen zusammen mit der Verbindung übergeben Diese Optionen dienen nur die Verbindung besser handhaben zu können. Sie könnten den neuen URL-Parser auf true setzen, Mongoose anweist, die moderne Art der Verbindung mit Mongo DB zu verwenden die moderne Art der Verbindung mit Mongo DB zu Außerdem verwenden wir die einheitliche Topologie auf True, was Mongos anweist, Verbindungen reibungsloser und stabiler zu verwalten Verbindungen In der neuen Mongo Di-Version sind diese Optionen jetzt standardmäßig aktiviert, sodass wir sie hier nicht weitergeben müssen Ich habe dir davon erzählt, wenn du diese Art von Code siehst, wirst du dadurch nicht verwirrt In der nächsten Lektion werden wir nun unser erstes Dokumentschema erstellen. 61. Bedeutung von Schema: Bevor wir unsere Daten in unserer Datenbank speichern, ist es besser, die Abfallstruktur für diese Daten zu definieren Zum Beispiel möchten wir einen neuen Benutzer auf unserer Website registrieren Also füllt er das Formular mit Name, E-Mail, Telefonnummer und Passwort aus. Und wenn wir auf Registrieren klicken, speichern wir diese Daten in unserer Datenbank. Als Entwickler wissen wir, dass Benutzer manchmal vergessen haben, den Namen oder die E-Mail-Adresse oder das Passwort zu schreiben. Der Benutzer kann alles vergessen. dies zu verhindern, werden wir eine Wurfstruktur für diese Daten definieren, was bedeutet, dass wir den Namen als Pflichtfeld und die E-Mail-Adresse als eindeutiges Feld definieren können , was bedeutet, dass jeder Benutzer eine eindeutige E-Mail-Adresse verwenden sollte Die Telefonnummer kann beliebig sein oder der Benutzer kann diese Information auch überspringen und das Passwort ist ebenfalls erforderlich Wenn der Benutzer nun keinen Namen weitergibt oder keine falsche E-Mail-Adresse schreibt, werden seine Daten nicht in unserer Datenbank gespeichert. Wir geben für diesen Benutzer einen Fehler zurück. Auf diese Weise können wir verhindern, dass unerwünschte und unnötige Daten in unserer Datenbank gespeichert werden. Aus diesem Grund ist es wichtig, eine Struktur zu definieren , und diese Struktur wird Schema genannt. Vielleicht fragen Sie in der Lektion zur Einführung in die Datenbank, dass ich Ihnen gesagt habe, dass Mongo DB oder kein SQL das Schema oder die flexible Schemastruktur ist und SQUL die schemabasierte Struktur ist, und jetzt sage ich Ihnen, dass Sie Schema definieren sollen Warum? Wir wissen, dass wir in MongoDB Daten im Schlüssel-Wert-Paar speichern werden Nehmen wir an, in unserem vorherigen Beispiel gibt ein Benutzer den Feldnamen, E-Mail als E-Mail-Adresse oder den Namen als Benutzernamen Wie können wir dann diese Art von Daten verwalten MongoDB ist schemaflexibel, was bedeutet, dass wir kein Schema definieren müssen Definition eines Schemas sorgt jedoch für Konsistenz, Validierung und Vorhersagbarkeit, die in den meisten Anwendungen auf Produktionsebene von entscheidender Bedeutung sind Ein Schema hilft uns dabei, unerwünschte oder fehlerhafte Daten zu vermeiden. Durch die Definition eines Schemas können wir auch die Abfragelogik klarer schreiben. Jetzt fragen Sie sich vielleicht, ob Mongo Di B Schemas oder flexible Schema-Struktur ist Schemas oder flexible Schema-Struktur Wie können wir Struktur in MongoDB definieren? Die Antwort lautet, dass Mongo DB das Schema seiner Daten nicht erzwingt. Durch die Verwendung anderer Tools wie Mongoose können wir jedoch ein Schema für unsere Mongo-DB-Dokumente definieren Wenn Sie mit SQL vertraut sind, haben wir auch eine Tabelle, nehmen wir an, Benutzer, und in dieser Tabelle haben wir Zeilen für In Mongo Di B wird diese Tabelle nun als Sammlung bezeichnet. Diese Zeile kann als Dokument aufgerufen werden. Lassen Sie sich nicht verwirren, wenn ich Wörter wie Sammlung und Dokument verwende . Sie sind Tabelle und Zeile sehr ähnlich. Um es noch einmal zusammenzufassen: Wir können ein Schema für unsere Mongo Dew-Sammlung definieren unsere Mongo Dew-Sammlung um unsere Anwendung besser nutzen zu In der nächsten Lektion werden wir nun sehen, wie wir ein Schema für unsere Mongo Dew-Sammlung definieren können Schema für unsere Mongo Dew-Sammlung definieren 62. Definieren von Schema für Dokument: Mal sehen, wie wir das Schema mithilfe von Mangos definieren können. Dafür verwenden wir also das neue Mango-Punktschema, das eine Klasse ist In dieser Klammer fügen wir nun ein Objekt mit unserem vollständigen Namen und unserer Struktur für diese Füllung Zum Beispiel benötigen wir zuerst den Namen und die Spalte, und hier schreiben wir den Datentyp, den wir speichern möchten Als Namen wollen wir also Stream speichern. Stellen Sie sicher, dass Sie wie in Großbuchstaben schreiben. Danach haben wir vielleicht eine E-Mail und das wollen wir auch als Zeichenfolge. Nun, wie ich Ihnen bereits gesagt habe, möchten wir E-Mail als eindeutigen Wert für jedes Dokument oder jede Zeile speichern . Wie können wir diese Einzigartigkeit hier also definieren? An der Stelle dieser Zeichenfolge übergeben wir einfach das Objekt. Dieses Objekt hat mehrere Eigenschaften. Zuerst wollen wir den Typ dieser Füllung definieren, nämlich eine Zeichenfolge , und dann haben wir eine weitere Eigenschaft, die eindeutig ist, und wir setzen sie auf true. Wenn wir also bereits eine E-Mail für einen Benutzer haben , kann dieselbe E-Mail nicht für einen anderen Benutzer verwendet werden. Nehmen wir danach an, wir haben Telefon und übergeben hier das Objekt und setzen den Typ auf Nummer. Nun, hier wollen wir diese Füllung nicht nötig machen. Der Benutzer kann dieses Telefon auch überspringen. Also hier geben wir nichts weiter. Und wenn wir nur die Typeigenschaft für die Füllung übergeben wollen, können wir direkt wie diese Zahl schreiben. Aber ich folge gerne einer konsistenten Syntax, also lasse ich das so, wie es ist. Aber im Namensfeld an der Stelle dieser Zeichenfolge fügen wir einfach ein Objekt mit Typ zur Zeichenfolge hinzu, und wir möchten dieses Feld auch verpflichtend machen. Wir fügen hier „required“ zu „true“ hinzu. Stellen Sie sicher, dass wir hier „ erforderlich“ und nicht „erforderlich“ schreiben. Ich bin mir nicht sicher, ob nur require funktioniert oder nicht. Außerdem speichern wir unsere EML-ID immer in Kleinbuchstaben, und das können wir hier auch mit Kleinbuchstaben auf true definieren Sie können sehen, dass es nicht schwer ist, ein Schema zu definieren . Es ist sehr einfach. Danach haben wir ein Passwort und wollen es als Zeichenfolge speichern und es ist das Pflichtfeld. Sag mir, welche Eigenschaften wir hier hinzufügen sollen. Richtig, wir fügen hier type zu string und required zu true hinzu. Du machst das wirklich großartig. Danach hat dieser Benutzer möglicherweise Hobbys, die mehrere Dinge sein können. Also wollen wir es in einem Array speichern. Geben Sie in eckige Klammern ein, was ein Array ist, und darin wollen wir eine einfache Zeichenfolge. Unsere Hobbys könnten also wie diese Reihe von Zeichenketten aussehen. Danach haben wir vielleicht überprüft, welcher Quellbenutzer verifiziert ist oder nicht, und wir setzen seinen Typ auf Bullion, was wahr oder falsch bedeutet Und standardmäßig möchten wir den Benutzer als nicht verifiziert speichern. Dafür haben wir also eine weitere Eigenschaft namens Standard. Wir übergeben den Standardwert als falsch. So definieren wir das Schema für unsere Mongo-DB-Sammlung. Im Schema haben wir mehrere Schematypen wie Zeichenfolge, Zahl, Boolean, Datum, Objekt, Array, Objekt-ID, die wir in Zukunft sehen werden, B zum Speichern der gemischten Binärdaten für jede Art von Daten Wenn Sie alle Schematypen und ihre Eigenschaften kennenlernen möchten, können Sie diese Mongoose-Dokumentation besuchen Auf dieser Seite erhalten wir alle Informationen. In der nächsten Lektion werden wir nun sehen, wie dieses Schema für die Erfassung angewendet wird. 63. Erstellen von Modellen: In der vorherigen Lektion haben wir dieses Benutzerschema erstellt. Wie können wir nun definieren , welche Sammlung diesem Schema folgen soll? Dafür müssen wir ein Modell erstellen. Zuallererst speichern wir dieses Schema in einer Variablen namens Benutzerschema. Um dieses Benutzerschema anzuwenden, müssen wir nun ein Modell erstellen. Also schreiben wir hier Mongoose Dot Model. Darin übergeben wir an erster Stelle den Singularnamen unserer Sammlung , der hier Benutzer ist Dieser Benutzer wird also zur Benutzerkollektion. Wenn wir eine Sammlung namens post erstellen wollen , was im Plural steht, dann müssen wir hier den singulären Namen dieser Sammlung schreiben , nämlich Beim zweiten Argument übergeben wir nun unser Schema für diese Benutzersammlung, das ist dieses Benutzerschema Jetzt gibt dieser Ausdruck das Modell für die Benutzersammlung zurück. Also speichern wir es in einer Variablen namens user. Können Sie mir sagen, warum ich diese Pascal-Konvention verwende oder warum ich U als Benutzermodell verwende liegt daran, dass dieser Benutzer eine Klasse ist und wir mit dieser Benutzerklasse oder diesem Benutzermodell viele Dinge tun werden Das Modell zu vereinfachen ist wie eine Blaupause für die Erstellung und Bearbeitung Dokumenten in einer Mongo-Deb-Sammlung . Definiert die Form unserer Daten mithilfe eines Schemas und bietet eine Möglichkeit, mit dieser Sammlung zu interagieren Einfach ausgedrückt ermöglicht uns das Modell, neue Dokumente auf der Grundlage des Schemas zu erstellen, Daten aus der Sammlung zu lesen, bestehende Dokumente zu aktualisieren und auch Dokumente aus der Sammlung zu löschen. Kurz gesagt, ohne Modell können wir mit der Sammlung Mongo Di Bi nichts Keine Sorge, wir werden all das in den kommenden Lektionen sehen all das in den kommenden Lektionen Lassen Sie mich Ihnen derzeit zeigen, wie wir mit diesem Benutzermodell einen neuen Benutzer erstellen können . Um also einen neuen Benutzer zu erstellen, schreiben wir einen neuen Benutzer, und darin übergeben wir unser Benutzerobjekt. Das erste Feld dieser Sammlung ist also Name und übergibt den Wert als Code plus U. Sie können Ihren Namen schreiben. Als Nächstes haben wir eine E-Mail, sagen wir, Code auf did gmail.com Derzeit schreiben wir diese Werte manuell , aber in der Realität unser Benutzer vom Frontend diesen Wert und sendet ihn per Post Und im Backend werden wir diese Post-Anfrage bearbeiten, und innerhalb der Post-Request-Logik werden wir diesen neuen Modellausdruck schreiben. Also mach dir darüber keine Sorgen. Als Nächstes haben wir ein Telefon, das alles sein kann 23, 51, 552 Als nächstes haben wir ein Passwort. Stellen Sie sicher, dass wir hier denselben Füllnamen schreiben , den wir im Schema definiert haben. Passwort für die Zeichenfolge 123, vier, fünf, sechs, 78. Und Hobbys zum Anordnen, und hier füge ich Lernen, Lehren und Nachverfolgen hinzu. Für das letzte Feld haben wir bereits den Standardwert in unserem Schema festgelegt, sodass wir diese Füllung hier nicht übergeben müssen. So können wir einen neuen Benutzer oder ein neues Dokument der Sammlung erstellen . Hier speichern wir es in einer Variablen für jeden neuen Benutzer. Derzeit ist dieser neue Benutzer nur lokal verfügbar. In der nächsten Lektion werden wir sehen, wie wir diesen neuen Benutzer in unserer Datenbank speichern können. 64. Speichern neuer Daten: Also hier haben wir neue Benutzerdaten. Speichern wir es jetzt in unserer Datenbank. Diese neuen Benutzerdaten haben also eine Methode, nämlich Punkt CV. Mit dieser Speichermethode können wir diese neuen Benutzerdaten in unserer Datenbank speichern. Das Speichern der Daten in der Datenbank ist jetzt eine asynchrone Aufgabe, was bedeutet, dass das Speichern neuer Daten in der Datenbank einige Zeit dauern kann Speichern neuer Daten in der Datenbank einige Zeit Und aus diesem Grund gibt dieser Ausdruck ein Versprechen zurück. Sie können sich daran halten, warten und wenn unsere Daten erfolgreich in der Datenbank gespeichert wurden, wird das gespeicherte Benutzerobjekt aus der Datenbank zurückgegeben, sodass wir es in einer Variablen speichern können, die als gespeicherte Daten bezeichnet wird, und einfach das Punktprotokoll mit gespeicherten Daten in der Konsole speichern können. Wie wir nun wissen, benötigen wir, wenn wir await verwenden wollen, eine Acing-Funktion, und nur innerhalb dieser Funktion können wir await verwenden. Andernfalls blockiert unser Code die nächsten Zeilen. Hier, vor diesem neuen Benutzerobjekt, erstellen wir eine neue Acing-Funktion namens Create User. Und innerhalb dieser Funktion können wir diesen neuen Benutzer einfach verschieben und die Methode speichern. Und am Ende werden wir diese Funktion zum Erstellen eines Benutzers nennen. Speichern Sie die Datei jetzt nicht, sie wird automatisch ausgeführt. Terminal stoppe ich unsere Node-Bindung mit Control plus C. Speichern Sie nun die Änderungen und lassen Sie uns sehen, ob das funktioniert oder nicht. Das Terminal, wir führen diese Datei mit Node Index Dot JS aus. Verwenden Sie hier nicht Nodemon , da wir diese Indexpunkt-JS-Datei nur einmal ausführen wollen Wenn wir node M verwenden und etwas in unserer Datei ändern, wird jedes Mal ein neuer Benutzer erstellt Sehen Sie, hier erhalten wir neue Benutzerdaten mit unseren Füllungen und am Ende erhalten wir auch die Unterstrich-ID, die eindeutige ID für dieses Dokument, und sie wird von Mongo DB generiert. Mit dieser ID können wir viele Dinge tun Außerdem erhalten wir hier einen Unterstrich mit einem Unterstrich auf Null. Ist das? Dieser Unterstrich wird bei Mangos verwendet, wenn sich das Dokument verschlechtert Wenn wir ein neues Dokument erstellen, Mongoose den unterstrichenen Unterstrich gefüllt hinzu und setzt ihn fügt Mongoose den unterstrichenen Unterstrich gefüllt hinzu und setzt ihn auf Null. Jetzt erhöhen Mangos jedes Mal, wenn das jeweilige Dokument aktualisiert wird, den Unterstrich, der mit einem Unterstrich Machen Sie sich darüber vorerst keine Sorgen. Wir können diese Daten auch in der Mongo DV-Kompassanwendung sehen in der Mongo DV-Kompassanwendung Sehen Sie in der lokalen Datenbank, hier bekommen wir unsere Datenbank nicht, klicken Sie auf die Baumpunkte und aktualisieren Sie die Siehst du, jetzt bekommen wir die Mongo-Demo-Datenbank. Darin haben wir eine Benutzersammlung, die wir mit dem Modell erstellt haben, und in dieser Sammlung haben wir unser erstes Dokument mit eindeutiger ID und auch unsere Füllungen Nehmen wir an , dieses Obs-Array ist ein Schlüssel-Wert-Paar, key ist der Index dieses Elements und value ist unsere Zeichenfolge. Wir erhalten Daten aus der Datenbank in unserer Indexpunkt-JS-Datei, dann erhalten wir ein normales String-Array. Es wird nur hier im Schlüssel-Wert-Paar angezeigt. Sie auch, dass wir standardmäßig den Wert „Dieser Wert ist verifiziert“ auf „Falsch“ gesetzt ist. Und ja, wir können Daten aus dieser Anwendung ändern. Um es kurz zusammenzufassen: Zuerst erstellen wir ein neues Benutzerobjekt mit diesem Benutzermodell, und dann können wir dieses Dokument einfach mit der Lots-Methode speichern Versuchen wir nun, weitere Benutzerdaten zu speichern, da wir diese Daten in den kommenden Lektionen benötigen Ich habe seinen Namen in Halley geändert, E-Mail an Halley at direct Wenn du etwas ändern möchtest, kannst du die Telefonnummer, das Passwort, Harley 123 und deine Hobbys ändern, sagen wir Coding, Jimming und sagen wir Coding, Jimming Speichern Sie die Änderungen und in unserem Terminal führen wir Node Index Gut, sieh mal, hier bekommen wir neue Daten. Wenn wir unseren Mongo Di B-Kompass überprüfen, bekommen wir hier keine Daten. Also aktualisieren wir von hier aus und sehen, dass wir hier unsere neuen Daten erhalten. So ist es mit Daten in unserer Datenbank. Wenn wir dem Schritt für Schritt folgen, dann ist es wirklich einfach. 65. Abfrage der Daten: Lassen Sie uns nun sehen, wie wir die Daten abfragen können. Aber Sie fragen sich vielleicht, was bedeutet Abfrage? Abfrage ist einfach eine Anfrage nach Informationen aus der Datenbank. In einfachen Worten, eine Abfrage ist nur eine Möglichkeit die Datenbank auf der Grundlage bestimmter Bedingungen nach bestimmten Daten zu fragen . Beispielsweise möchten wir aus der Sammlung unserer Benutzer Daten aller Benutzer abrufen. Zunächst schreiben wir das Modell dieser Sammlung, das ist der Benutzerpunkt, hier erhalten wir mehrere Abfragemethoden. Wir müssen anhand der ID suchen und eine finden. Wir haben auch andere gute Methoden zum Aktualisieren, Löschen und Ersetzen. Mach dir darüber keine Sorgen. Wir werden sie in den kommenden Lektionen sehen. Derzeit konzentrieren wir uns nur auf diesen Fund , der verwendet wird, um mehrere Dokumente aus unserer Sammlung zu finden . Wir haben also Fine n , das verwendet wird, um nur ein einzelnes Dokument aus der Sammlung abzurufen Außerdem haben wir Fine by ID, das verwendet wird, um Dokumente anhand ihrer eindeutigen ID abzurufen Derzeit möchten wir mehrere Dokumente abrufen, deshalb verwenden wir hier den Punkt Nun, dieser Ausdruck gibt auch Promise zurück. Wir können hier dann die Methode verwenden, oder wir können Ising Await verwenden. In diesem Anwendungsfall ist Ain Await einfacher und hilft uns , einen sauberen Kern zu schreiben. Hier erstellen wir eine neue Ing-Funktion namens get users und verschieben diese Await einfach in diese Funktion. Dadurch werden nun die Daten aller Benutzer aus der Benutzersammlung zurückgegeben . Wir speichern sie in einer Variablen namens users und Consol protokolliert diese Benutzerdaten An der Stelle dieser Creatuser-Funktion rufen wir GTUsersFunction auf und verschieben sie unter diese Funktion Nun wollen wir sehen, ob wir Daten bekommen oder nicht. Speichern Sie die Änderungen. Und lassen Sie uns diese Anwendung mit dem Knotenindex Dot gs ausführen. Sehen Sie, hier erhalten wir eine Reihe von Daten von zwei Benutzern. Der erste ist Code PlusU und dann Harley. Lieblich. So holen wir uns alle Daten aus der Sammlung Lassen Sie uns das jetzt interessanter machen. Angenommen, wir möchten nur die Benutzer finden , deren Name Harley ist Um das zu tun, übergeben wir das Objekt in der Fine-Methode. Hier können wir mehrere Bedingungen im Schlüssel-Wert-Paar definieren . Das ist ein Name, für den zwei Harley kodieren. Dadurch werden alle Benutzerdaten gefunden, deren Name Halley ist. Außerdem können wir hier mehrere Bedingungen wie Es verifiziert auf falsch usw. übergeben . Diese Abfrage prüft, ob der Name Halle ist und ob sein verifizierter Wert falsch ist oder nicht Wenn beide Bedingungen zutreffen, erhalten wir nur dann die Daten dieser Benutzer. Sag das und lass uns unsere Anwendung ausführen. Siehst du, hier bekommen wir ein leeres Array. Warum? Wie wir in unserer Datenbank sehen können, haben wir den Namen Halle und es wurde auch verifiziert, dass er auf False gesetzt ist. Warum bekommen wir diese Daten dann nicht? Hier im Namen Property übergeben wir Halle in Kleinbuchstaben. Aber in der Datenbank ist H in Großbuchstaben geschrieben. Lassen Sie uns also diese Bedingung ändern, sehen, was sich ändert, und lassen Sie uns unsere Anwendung noch einmal ausführen. Siehst du, hier bekommen wir unsere Daten. Denken Sie also daran, wenn wir Zeichenfolge für Bedingung übergeben, achten Sie darauf, dass wir Groß- und Kleinschreibung beachten. Gut. Derzeit erhalten wir Daten mit allen Füllungen. Was ist, wenn wir nur den Benutzernamen und die Hobbys abrufen wollen? Dazu können wir nach dieser guten Methode die Auswahlmethode hinzufügen und innerhalb der Codes geben wir die Namen unserer Felder getrennt durch Leerzeichen Wir schreiben Name Space Hobbies. Wenn wir andere Felder wollen, dann können wir auch hier mit Leerzeichen durchgehen. Im Moment wollen wir das nicht. Speichern Sie die Änderungen und lassen Sie uns unsere Anwendung ausführen. Sehen Sie, hier erhalten wir nur den Namen, Hobbys und die Unterstrich-ID, die automatisch von Mongo DB hinzugefügt wird Wenn wir aus unseren Daten nur ein oder zwei Füllungen entfernen wollen, wie hier, wollen wir alle Daten außer dem Passwort und das ist An der Stelle dieser Füllnamen geben wir also minus Passwort, Leerzeichen ein, Minus ist verifiziert. Speichern Sie die Änderungen, öffnen Sie das Terminal und lassen Sie uns unsere Datei ausführen. Siehst du, hier bekommen wir alle Fehler außer Passwort und Es verifiziert. Einfach. Lassen Sie uns nun diese etwas erweiterte Abfrage erstellen. Angenommen, wir haben 100 Benutzerdaten und möchten diese Daten abrufen, aber wie können wir 100 Daten in einem einzigen Array abrufen Es ist besser, zuerst zehn Daten und danach weitere zehn Daten abzurufen danach weitere Also hier entfernen wir diese Bedingung, weil wir alle Daten haben wollen und nach der Auswahl fügen wir ein Limit hinzu, wir können die Anzahl der Datensätze übergeben, die wir sehen wollen Sagen wir zehn. Speichern Sie die Änderungen, öffnen Sie das Terminal und lassen Sie uns unsere Anwendung ausführen. Sehen Sie, hier erhalten wir zwei Datensätze, weil wir nur zwei Datensätze haben. Wenn wir 20 Datensätze haben, erhalten wir nur die ersten zehn Datensätze. Da wir ein Limit haben, überspringen wir auch die Methode. Hier übergeben wir die Anzahl der Daten, die wir überspringen möchten. Wenn wir 20 Datensätze haben und Skip Five einhalten, dann werden die ersten fünf Datensätze übersprungen und dann werden sechs bis 20 Daten angezeigt. Diese Limit- und Skip-Methode sind sehr nützlich für Seitenzugriffe und Abfragen Keine Sorge, dafür habe ich eine separate Lektion hinzugefügt. Verstehe vorerst nur, dass Skip und Limit verfügbar sind. Also lass uns das entfernen. Gut. können wir unsere Daten auch um alle gefüllten Werte kürzen. Nehmen wir an, wir möchten unsere Benutzerdaten anhand des ausgefüllten Namens kürzen. Also können wir hier einen Punkt kurz schreiben, und darin übergeben wir Objekt, und hier übergeben wir unseren Feldnamen , der Name ist, und hier können wir zwei Werte übergeben , einen für aufsteigende Reihenfolge und minus einen für absteigende Lassen Sie uns beide nacheinander weitergeben. Speichern Sie dies zunächst und lassen Sie uns unsere Anwendung ausführen. Siehst du, wir bekommen Benutzer in aufsteigender Reihenfolge, das heißt A bis ZD, wenn wir das auf minus eins ändern, speichern wir das und lassen uns unsere Datei erneut ausführen Siehst du, hier bekommen wir eine absteigende Reihenfolge , also Z bis A, und deshalb wird zuerst Har angezeigt und dann Code Keine Sorge, ich gebe Ihnen ein ausführliches PDF dieses Abschnitts Sie können diese Methoden so schnell wie möglich überarbeiten. 66. Vergleichsosoperatoren in MongoDB: Lassen Sie uns etwas über Vergleichsoperatoren in Mongodib lernen. Vergleichsoperatoren werden verwendet, um Werte in der Datenbank mit den Werten zu vergleichen , die wir in der Abfrage angeben. Dies ist sehr wichtig, wenn wir mit Daten arbeiten, insbesondere mit zahlenbasierten Daten . Stellen Sie sich zum Beispiel vor, wir haben in unseren Benutzerdaten das Feld „Alter“ eingegeben und möchten Benutzerdaten abrufen, deren Alter zwischen 18 und 30 Jahren liegt, über 18 oder unter 50 Es kann alles sein. Wenn wir so etwas machen wollen, brauchen wir einen Vergleichsoperator. In Mongo Deb gibt es viele Vergleichsoperatoren. Erstens haben wir den Dollar-EQ, was für gleich ist Als nächstes haben wir Dollar N, nicht dem Dollar GT entspricht, der größer ist als Dollar GT E. Kannst Richtig, größer oder gleich Dollar LT, was weniger als Dollar LT für weniger als oder gleich Dollar E ist . Dieser Wert wird verwendet, um einen beliebigen Wert in der Liste abzugleichen. Das Alter sollte also 18, 22, 25 sein 22, 25 Kann mehrere Werte in einem Array übergeben. Und endlich haben wir Dollar NIN, der mit keinem Wert im Array übereinstimmt, und das ist das Gegenteil von Dollar N. Vergleichsoperatoren sind wirklich einfach. Lassen Sie mich Ihnen zeigen, wo wir Vergleichsoperatoren schreiben müssen. Um es praktisch zu machen, fügen wir für diese beiden Dokumente das H-Feld hinzu. Also Pan Mongo als Kompass und gehe zur Sammlung des Benutzers Hier können wir jedes Dokument mit diesem Bearbeitungssymbol ändern. Über ein beliebiges Feld. Und auf der linken Seite erhalten wir Plus-Symbol zum Hinzufügen eines neuen Felds. Wählen Sie Neues Feld hinzufügen, und hier schreiben wir unseren vollständigen Namen , also Alter, und wir übergeben einen Wert, sagen wir zehn. Derzeit ist dieser Wertetyp eine Zeichenfolge, aber wir können das von hier aus ändern und setzen ihn auf Integer 32. Siehst du, jetzt ist es Integer. Außerdem fügen wir ein neues Feld für das zweite Dokument hinzu, geben den Namen, das Alter und den Wert ein, sagen wir 20. Da haben wir einen Typ auf Integer 32 geändert und auf Update geklickt. Kode. Wie wir sehen können, haben wir in unserem Code, wenn Sie eine Bedingung für unsere Abfrage hinzufügen wollen, dann fügen wir das Objekt hier ein, Beispiel Alter bis zehn. Dadurch werden alle Benutzerdaten abgerufen, deren Alter unter zehn liegt. Lassen Sie mich Ihnen eine Frage stellen, wo wir unseren logischen Operator schreiben können Denn wie wir sehen können, müssen wir für die Bedingung ein Schlüssel-Wert-Paar in dieser Find-Methode übergeben. Die Lösung befindet sich also an der Stelle dieses harten Codewerts Zehn Wir können unseren Vergleichsoperator in ein anderes Objekt schreiben Lass dich nicht verwirren, sieh dir das an. An der Stelle von zehn fügen wir also ein Objekt hinzu und schreiben einfach Vergleichsoperator als Schlüssel in dieses Unterobjekt. Sagen wir Dollar GTE, was größer oder gleich ist, und größer als oder gleich was? 18. Das bedeutet also einfach, alle Benutzer zu finden, deren Alter mindestens 18 Jahre beträgt Wir ersetzen einfach den hartcodierten Wert Zehn durch das Objekt, und innerhalb des Objekts verwenden wir den Vergleichsoperator Lass mich dir jetzt eine kleine Aufgabe geben. Lassen Sie uns das ganze Objekt aus der Fine-Methode entfernen. Wir möchten alle Benutzer abrufen , die jünger als 18 Jahre sind. Hier fügen wir ein Objekt hinzu, und zuerst fügen wir hinzu, auf welches Feld wir die Bedingung anwenden möchten , nämlich das Alter Und statt eines harten Werts übergeben wir hier Objekt, übergeben wir hier Objekt weil wir den Vergleichsoperator verwenden wollen, und darin verwenden wir Dollar T für weniger als und weniger als bis 18. So einfach ist das. Speichern Sie diese Datei und für die Find-Methode können wir unsere Anwendung mit Nodemon Index Dot JS ausführen Nodemon Index Dot JS da dadurch nichts an der Datenbank geändert wird Siehst du, hier bekommen wir Benutzer , deren Alter unter 18 ist. Sie können sehen, dass wir nur das Objekt mit dem Vergleichsoperator an der Stelle des harten Werts übergeben müssen. Außerdem sind diese ersten sechs Operatoren sehr einfach, aber viele Schüler sind verwirrt diesen Operator und nicht den Operator angeht. An der Stelle des Wertes müssen wir hier eine Liste von Werten übergeben. Lassen Sie mich Ihnen diese beiden Operatoren zeigen. Angenommen, wir möchten nur Benutzer abrufen , die 18, 20 oder 30 Jahre alt Wenn wir also mehrere Werte für ein Feld vergleichen wollen, verwenden wir den Operator Dollar An der Stelle von Dollar LT verwenden wir also Dollar in. An der Stelle des Werts übergeben wir eine Reihe von Werten, 18, 20, 30. So einfach ist das, speichern Sie die Änderungen und schauen Sie sich das an. Siehst du, hier bekommen wir Benutzer mit 20 Jahren, weil wir 20 in diesem Array überschreiten. Jetzt ist Dollar NN das Gegenteil von Dollar in. Ich nenne es Insider, was bedeutet, Patch-Benutzer zu patchen, die nicht 18, 20 oder 30 Jahre alt sind. Speichern Sie die Änderungen und sehen Sie, hier haben wir Benutzer im Alter von zehn Jahren. So bestehen wir also die Vergleichsoperatoren in Mongo DV. Denken Sie daran, dass wir im normalen Zustand hier fill with values übergeben, aber für Vergleichsoperatoren übergeben wir hier fill with object, und innerhalb dieses Objekts fügen wir unseren Vergleichsoperator 67. Logische Operatoren in MongoDB: Sehen wir uns logische Operatoren an. Logische Operatoren ermöglichen es uns also, mehrere Bedingungen in unserer Abfrage zu kombinieren. In einfachen Worten, sie helfen uns, mehr Komplexe aus der Datenbank abzufragen . Mach dir keine Sorgen. Es gibt nur wenige logische Operatoren, und sie sind auch als Vergleichsoperatoren einfach. erste logische Operator ist Dollar R. Wir verwenden den Operator, wenn wir mehrere Bedingungen haben und wir möchten, dass, wenn eine Bedingung erfüllt ist, wenn eine Bedingung erfüllt ist, diese Daten zurückgegeben werden. Beispiel: Wir möchten Benutzer abrufen, die 30 Jahre alt sind oder In diesem Fall wollen wir, dass eine beliebige Bedingung erfüllt ist, und deshalb verwenden wir hier und deshalb verwenden wir Lassen Sie mich Ihnen das praktisch zeigen. Ich kommentiere diesen vorherigen Code aus und schreibe, dass Cost Users dem Wert Await User Punkt Find entspricht. Und in dieser Find-Methode übergeben wir Object, und in diesem Objekt fügen wir einfach Dollar oder Operator hinzu. Jetzt denken Sie vielleicht an einen Vergleichsoperator an der Stelle des Werts, aber wir verwenden einen logischen Operator an der Stelle der Bedingung. Lass mich dir meinen Trigger geben, damit du dich daran erinnern kannst. Wie wir wissen, vergleichen wir immer Werte, und deshalb müssen wir den Vergleichsoperator an der Stelle des Wertes schreiben Vergleichsoperator an der Stelle des Wertes Aber wir implementieren logische Operatoren für Bedingungen, und deshalb müssen wir logische Operatoren an die Stelle von Bedingungen schreiben . Als ich mit Mongo Deb angefangen habe, erinnere ich mich so daran. Wie wir wissen, wollen wir hier mehrere Bedingungen hinzufügen und was wir für mehrere Bedingungen verwenden, verwenden wir Array In diesem Array fügen wir nun unsere Bedingungen für einzelne Objekte hinzu. Also das Objektalter auf 30 oder wir übergeben einen anderen Bedingungsnamen H. Wenn eine Bedingung erfüllt ist, erhalten wir diese Benutzerdaten. Die Änderungen und schauen Sie sich das an. Siehst du, hier bekommen wir den Benutzer Halley, weil er Halley heißt Dieses Benutzeralter entspricht unserem Zustand oder nicht. Es spielt keine Rolle. Wenn eine Bedingung miteinander verknüpft ist, erhalten wir diese Daten So einfach ist das. Nehmen wir nun an, wir wollen für unsere Abfrage. Diese beiden Bedingungen müssen erfüllt sein, was bedeutet, dass das Alter des Benutzers 30 Jahre und der Name Halley lauten sollte In dieser Situation, in der wir wollen, müssen alle Bedingungen erfüllt sein Wir werden den Endoperator verwenden. Also an der Stelle dieses Operators übergeben wir den Operator. Kannst du jetzt die Ausgabe erraten? Richtig, wir bekommen nichts, weil wir keine Daten haben , bei denen das Alter 30 ist und der Name h ist. Siehst du, hier bekommen wir ein leeres Array. Lassen Sie mich Ihnen nun die Abkürzung zeigen , wie Sie das und den Operator schreiben können. Wenn wir das wollen, müssen alle Bedingungen erfüllt sein Wir schreiben dieselbe Abfrage bereits zu Beginn des Abfragethemas. Wir können diese Bedingungen direkt wie folgt in der Find-Methode übergeben . Beide funktionieren gleich. Aber wenn wir den Operator verwenden wollen, müssen wir dieser Syntax folgen. Jetzt haben wir nach dem Dollar-End-Operator einen weiteren logischen Operator, nämlich Dollar NR, oder wir nennen ihn als logischen NR. Wir wollen zum Beispiel Benutzer finden, die nicht 30 Jahre alt sind und nicht den Namen Harley tragen, was bedeutet, dass beide Bedingungen Dafür übergeben wir an der Stelle dieses Endbetreibers den NR-Operator wir Die Änderungen und sehen Sie, hier erhalten wir Daten mit dem Namen Gott segne Sie, denn für diese Daten sind beide Bedingungen falsch, und deshalb erhalten wir diese Daten. Aber für unsere zweiten Benutzerdaten ist diese Namensbedingung wahr, sodass wir diese Daten nicht einfach bekommen. Der letzte logische Operator, den wir haben, ist Dollarnot oder logischer Irrer. Dieser logische Knotenoperator unterscheidet sich kaum, da wir Not-Operator nur mit Vergleichsoperatoren und regulären Ausdrücken verwenden Vergleichsoperatoren und regulären Machen Sie sich keine Gedanken über reguläre Ausdrücke. Das werden wir in der nächsten Lektion sehen. Lassen Sie uns zunächst sehen, Dollar Naught Operator. Nehmen wir an, wir möchten Benutzer finden , deren Alter nicht 30 ist Auch hier kommentiere ich diese Syntax aus und schreibe erneut, cost user equals awight user Objekt, und zuerst fügen wir gefüllt hinzu, für das wir eine Bedingung hinzufügen wollen, nämlich H. An der Stelle des Werts übergeben wir nun das Objekt mit dem Operator Dollar Wir schreiben den Dollar-Nuss-Operator an die Stelle des Werts, weil Dollar-Nut-Operator in direktem Zusammenhang mit dem Wert steht , nicht mit Bedingungen Was wir wollen, ist, dass Alter nicht gleich 30 sein sollte, wir haben Alter und auch Null, aber wir haben keine Gleichwertigkeit und keinen Wert Wir fügen ein weiteres Objekt mit dem Dollar-Operator hinzu, was gleich bedeutet, und übergeben hier einfach Speichern Sie die Änderungen und schauen Sie sich das an. Siehst du, hier haben wir beide Nutzer , weil beide nicht gleich 30 Sie können sehen, dass es wirklich einfach ist. Lass es mich dir noch einmal zeigen. Im Vergleichsoperator schreiben wir so. Spalte Alter ist der Dollar gleich oder größer oder kleiner als der Operator wir für seinen Wert verwenden möchten Hier wollen wir nur den Not-Operator hinzufügen, wir schließen dieses Objekt einfach mit einem anderen Objekt zusammen und fügen hier den Dollar-Nought-Operator und einen Doppelpunkt hinzu, so einfach Ich weiß, das ist ein bisschen verwirrend, aber machen Sie sich keine Sorgen, wenn Sie sich nicht an die Syntax von Operatoren erinnern Ich gebe Ihnen am Ende dieses Abschnitts mein Cheatsheet damit Sie es verwenden können, wenn wir an realen Projekten arbeiten Hier dreht sich alles um logische Operatoren. Wenn Sie sich den Kurs ständig ansehen, können Sie eine kleine Pause von Ihrem Bildschirm einlegen, Musik hören oder einen frischen Spaziergang machen. Wir sehen uns in der nächsten Lektion. 68. Reguläre Ausdrücke in MongoDB: Schauen wir uns nun die regulären Ausdrücke an. Was ist ein regulärer Ausdruck? Ein regulärer Ausdruck ist eine Möglichkeit , Suchmuster für Zeichenketten zu definieren. Zum Beispiel möchten wir alle Benutzer finden, deren Namen mit Edge beginnen, oder wir möchten alle Benutzer abrufen, deren E-Mail gmail.com am Ende ihrer E-Mail enthält In diesen Fällen werden wir reguläre Ausdrücke verwenden oder einige Entwickler nennen Es ist sehr nützlich bei Abfragen oder Suchanfragen mit automatischen Vorschlägen Lass es mich dir praktisch zeigen. Hier kommentiere ich diese vorherige Anfrage. Entfernen Sie außerdem alte Abfragen und schreiben Sie eine neue Abfrage Cast users equal to await user dot find Hier übergeben wir das Objekt und auf welche Eigenschaft wir das Suchmuster anwenden möchten Versuchen wir es mit dem Namen. An der Stelle des Wertes übergeben wir nun einen regulären Ausdruck. Hier ist die Syntax des regulären Ausdrucks. Schrägstrichmuster Schrägstrich. Auf der Grundlage dieses Musters werden wir also viele Dinge tun Nehmen wir an, wir wollen alle Benutzerdaten finden , deren Name mit „Also“ beginnt. An der Stelle dieses Musters verwenden wir das Kerat-Symbol, was „beginnen mit“ bedeutet, und hier übergeben wir cptalH Diese Abfrage findet alle Benutzer, deren Name mit einem Großbuchstaben beginnt . Wenn wir also Benutzer finden wollen , deren Name mit einem beliebigen Buchstaben endet, dann dupliziere ich diese Zeile und an der Stelle dieses Karats Dieser Dollar bedeutet Ende mit. Diese Abfrage gibt also alle Daten zurück, deren Name mit U endet Lassen Sie mich Ihnen nun eine kleine Aufgabe geben. Wir möchten Benutzer finden, deren E-Mail mit gmail.com endet. Es ist wirklich einfach. Wir ändern diesen vollständigen Namen E-Mail und schreiben an der Stelle einfach gmail.com Dollar Mal sehen, ob wir die Ergebnisse bekommen oder nicht. Mal schauen, ob sich das ändert, und C bekommen wir beide Nutzer, weil sie beide Gmail.com haben Lass mich dir jetzt etwas Cooles zeigen. Im Mongo Di B Compass ändere ich die zweite Benutzer-E-Mail anstelle von gmail.com Ich schreibe Gmail, com. Speichern Sie das und lassen Sie uns sehen , was wir bekommen. Speichern Sie diese Datei. Und sehen Sie hier, wir haben wieder beide Benutzer. Sie fragen sich vielleicht, auch wenn diese E-Mail nicht mit gmail.com endet, warum wir diese Benutzerdaten immer noch erhalten Was stimmt nicht mit unserem regulären Ausdruck? In regulären Ausdrücken kann dieser Punkt jedem Zeichen entsprechen, was bedeutet, dass JavaScript ihn mit jedem Zeichen abgleicht. Aus diesem Grund erhalten wir diese Daten, wenn wir an der Stelle dieses Zeitraums ein beliebiges Zeichen übergeben an der Stelle dieses Zeitraums ein beliebiges Zeichen . Nun könnten wir uns fragen, was ist, wenn wir Zeitraum mit Zeitraum vergleichen wollen? Nicht als irgendein Charakter. Es ist wirklich einfach. Kurz vor dem Zeitraum werden wir den umgekehrten Schrägstrich verwenden Jetzt vergleicht JavaScript diesen Zeitraum als Zeitraum und nicht als irgendein Zeichen Speichern Sie die Änderungen und sehen Sie, hier bekommen wir nur den ersten Benutzer. Auch bei diesem Muster wird zwischen Groß- und Kleinschreibung unterschieden. Benutzer eine E-Mail in Großbuchstaben wie gmail.com hat, Wenn ein Benutzer eine E-Mail in Großbuchstaben wie gmail.com hat, werden wir diesen Benutzer nicht in diese Liste aufnehmen Um also die Groß- und Kleinschreibung zu entfernen, müssen wir einfach I am Ende unseres regulären Ausdrucks hinzufügen I am Ende unseres regulären Was ist nun, wenn wir Benutzer finden wollen , deren E-Mail Harley enthält Nicht mit Halle beginnen oder mit Halley enden. Harley kann überall sein. In diesem Fall schreiben wir einfach unser Wort an die Stelle des Musters, ohne Garret oder Dollar hinzuzufügen Wenn wir also Benutzer mit dem exakten Wort finden wollen, sagen wir Entwickler in der Beschreibung, nicht Teil eines anderen Wortes wie Entwickler, dann wollen wir nur Entwickler In diesem Fall schreiben wir ein Muster wie dieses. Hier an der Stelle dieses Musters schreiben wir das Wort Entwickler und vor und nach diesem Wort fügen wir rückwärts B hinzu, rückwärts B, was die Grenze dieses Wortes darstellt Dies sind einige gebräuchliche und nützliche reguläre Ausdrücke. Wenn Sie mehr über Muster regulärer Ausdrücke erfahren möchten , können Sie diesen Artikel verwenden und mehr über andere Muster lesen , da es sich um reines JavaScript handelt. Außerdem verwenden in der aktuellen Mangodib-Version nur wenige Entwickler den Dollar RejxOperator, verwenden in der aktuellen Mangodib-Version nur wenige Entwickler den Dollar RejxOperator Muster wie dieses hinzuzufügen Beides funktioniert gleich. Ich mag diese Sater-Version, aber Sie können auch diesen Rjxoperator verwenden Es liegt ganz bei dir. 69. Dokumentanzahl zählen und schätzen: Angenommen, wir möchten die Anzahl der Dokumente zählen , die in der Sammlung unseres Benutzers verfügbar sind. Ich dupliziere diese Abfrage und kommentiere die vorherige Anfrage. Wenn wir nun nur die Anzahl der Dokumente zählen wollen, dann übergeben wir anstelle dieser guten Methode die Methode count Documents. Diese Abfrage funktioniert genauso wie zuvor. Wir erhalten eine Reihe von Daten in der Ausgabe. Bei der Methode Count documents übergeben wir unsere Bedingungen oder wir übergeben auch logische Operatoren, Vergleichsoperatoren und reguläre Ausdrücke, genau wie bei der Find-Methode. Find-Methode gibt die tatsächlichen Daten zurück , während die Methode Count documents die Anzahl der Dokumente zurückgibt. Lassen Sie uns das überprüfen. Sehen Sie sich die Änderungen an und werfen Sie einen Blick darauf. C, hier erhalten wir Null weil es keine Daten für diesen Zustand gibt. Jetzt wollen wir manchmal keine Bedingungen hinzufügen, sondern nur die Gesamtzahl der Dokumente. Zu diesem Zeitpunkt können wir dieses Objekt entfernen, speichern und sehen, hier erhalten wir die Gesamtzahl der Benutzerdaten. Derzeit sind unsere Daten sehr klein. Stellen Sie sich vor, wir möchten die Anzahl der Produkte für große E-Commerce-Anwendungen zählen. Sie möchten die Gesamtzahl der auf der Plattform verfügbaren Produkte im Admin-Dashboard anzeigen. Derzeit benötigen wir nicht die nächste Zählung, die die Gesamtzahl der Produkte anzeigt. Zu diesem Zeitpunkt können wir jetzt eine andere Methode verwenden, um die geschätzte Anzahl von Dokumenten zu zählen, nämlich die geschätzte Anzahl von Dokumenten. Wie der Name schon sagt, handelt es sich dabei um eine geschätzte Anzahl. Genau wie beim Zählen von Dokumenten können wir diese Methode zur geschätzten Anzahl von Dokumenten direkt nach dem Modellnamen übergeben . Jetzt fragen Sie sich vielleicht, was ist der Unterschied zwischen diesen beiden? Erstens gibt „Dokumente zählen“ die genaue Zahl zurück, aber die geschätzte Anzahl zeigt die ungefähre Anzahl an. Ein weiterer Unterschied besteht darin, dass wir bei der Methode zum Zählen von Dokumenten Bedingungen oder Filter übergeben können . Bei der Methode zur geschätzten Anzahl von Dokumenten können wir jedoch keine Bedingung erfüllen. Es kann nur die gesamte Sammlung gezählt werden. Zählen von Dokumenten ist also etwas langsamer als die geschätzte Anzahl von Dokumenten. Zusammenfassend lässt sich sagen, dass wir die Anzahl der Dokumente zählen verwenden, wenn wir Filter anwenden müssen oder wenn wir die Anzahl der Ausgänge ermitteln möchten Auf der anderen Seite verwenden wir die geschätzte Anzahl der Dokumente, wenn wir eine schnelle und grobe Schätzung der Gesamtzahl der Dokumente in der Sammlung benötigen eine schnelle und grobe Schätzung der Gesamtzahl der Dokumente in der Sammlung 70. Paginierung und unendliche Abfrage: Mal sehen, wie wir eine Paginierung oder eine unendliche Abfrage erstellen können. Bevor wir uns die Abfrage ansehen, ist es besser zu verstehen wie Paginierung und unendliches Scrollen funktionieren Angenommen, wir arbeiten an einer großen E-Commerce-Anwendung. In dieser Anwendung haben wir möglicherweise 1.000 oder 10.000 Produkte wie Amazon. Derzeit erhalten wir alle Produkte in einem einzigen API-Aufruf detailliert. Es wird mehr Zeit in Anspruch nehmen und auch die Auslastung unseres Servers wird zunehmen. Anstatt also als Bond-Entwickler alle Daten in einer einzigen Anfrage zu erhalten , können wir sie in Seiten aufteilen, als würden wir in einer einzigen Anfrage nur acht oder zehn Daten erhalten. Wenn der Benutzer mehr Daten benötigt, rufen wir die nächsten zehn Daten ab Machen Sie sich keine Gedanken darüber, wie wir diese API erstellen werden. Verstehe vorerst einfach, wie Paginierung und unendliches Scrollen funktionieren Hier ist das Frontend-Beispiel für Paginierung. Auf der ersten Seite haben wir nur noch acht Daten. Wenn wir auf die Schaltfläche für die zweite Seite klicken, erhalten wir die nächsten acht Daten. So einfach ist das. Lassen Sie mich Ihnen auch ein Beispiel für unendliches Scrollen zeigen. Hier haben wir acht Daten, und wenn wir den unteren Rand der Seite erreichen, werden weitere acht Daten aus dem Backend geladen Siehst du, das ist echt cool. Denken Sie einfach in menschlicher Sprache darüber nach, was hier passiert. Mach dir keine Gedanken über den Code. Denk einfach darüber nach, was passiert. Paginierung und unendliches Scrollen funktionieren beide fast gleich. Bei beiden Techniken werden wir bei Bedarf Daten in kleinen Mengen abrufen Daten in kleinen Mengen Nur beim unendlichen Scrollen behalten wir unsere vorherigen Bei der Paginierung werden wir die vorherigen Daten ersetzen. Das Backend für beide Techniken wird jedoch gleich bleiben. Lassen Sie mich Ihnen das anhand eines Beispiels für 20 Datensätze erklären. Dies sind jeweils 20 Datensätze, wir möchten nur vier Datensätze anzeigen. Wir können die variable Seite pro Daten auf vier festlegen. Von hier erhalten wir vier Datensätze und können sie als Seite eins markieren. Wenn Benutzer nun scrollen oder sogar zur zweiten Seite wechseln, überspringen wir die Daten dieser Seite, was bedeutet, dass wir pro Seite vier Daten überspringen und dann weitere vier Datensätze von hier abrufen Wenn der Benutzer als Nächstes erneut scrollt oder zur dritten Seite wechselt, überspringen wir die Daten von Seite eins und Seite zwei Mathematisch gesehen überspringen wir die aktuelle Seite , also drei minus eins pro Seite, was bedeutet, dass zwei zu vier gleich acht ist Wir überspringen die ersten acht Daten und rufen weitere vier ab , also Daten pro Seite. Jedes Mal, wenn wir unsere Seitenzahl erhöhen, überspringen wir die aktuelle Seite minus eins in Daten pro Seite und rufen weitere Daten ab, die der Anzahl der Daten pro Seite entsprechen Sag mir, wie viele wir überspringen werden , wenn wir zur vierten Seite wechseln Richtig, wir überspringen vier minus eins, das ergibt drei zu vier, was 12 ergibt. Wir überspringen die ersten 12 Datensätze und rufen weitere vier Daten ab. So einfach ist das In Mongoose haben wir die Skip-Methode, die wir bereits gesehen haben, und wir haben auch ein Limit für nur das Abrufen und die Anzahl Also hier entfernen wir diese Abfrage, weil sie zu Verwirrung führen kann Jetzt schreiben wir const users equals to await user dot. Finden Sie hier heraus, dass wir keine Bedingung erfüllen wollen Jetzt, nach der Fine-Methode, folgen wir der Skip-Methode, und innerhalb dieser Methode müssen wir angeben, wie viele Daten wir überspringen wollen Im Moment übergeben wir direkt Null, weil wir für die erste Seite Nulldaten überspringen wollen. Wie viele Daten wollen wir danach auf unserer einzelnen Seite haben? Richtig, wir wollen vier Daten senden. Also fügen wir hier eine weitere Methode namens Limit hinzu und übergeben hier vier. Diese Abfrage funktioniert für Seite eins. Lassen Sie uns nun dafür sorgen, dass diese Abfrage für jede Seite funktioniert. Wenn Sie also nach zwei Seiten suchen und diese API aufrufen, überspringen wir einfach die ersten vier Daten Und dafür haben wir in unserem Beispiel eine Formel erstellt. Also definieren wir oben eine Variable. Die aktuelle Seite entspricht sagen wir zwei. Danach entspricht eine weitere Variable, die pro Seite aufgerufen wird, dem Wert vier. Wie wir sehen können, haben wir diese Werte derzeit fest codiert. In der realen Welt werden diese Werte jedoch vom Frontend übergeben. Und wissen Sie, von welchem Frontend diese Details gesendet werden? Irgendeine Vermutung? Richtig, das Frontend sendet diese Details mithilfe von Abfrageparametern. Nehmen wir an, unsere Produkt-API sieht so aus Slash-API, Schrägstrich für Produkte, Fragezeichen, aktuelle Seite entspricht zwei und die Daten pro Seite entsprechen vier oder zehn, alles, was unser Frontend-Entwickler will Aber im Moment möchte ich diese Komplexität nicht hinzufügen. Deshalb haben wir diese Werte hier fest codiert. Bei dieser Kip-Methode übergeben wir nun Klammern, aktuelle Seite minus eins, in die Daten pro Seite Und im Limit, was wir übergeben werden, richtig, wir geben die Daten pro Seite Lassen Sie mich das speichern, damit wir es deutlich sehen können. Großartig. Wenn wir jetzt in unserem Terminal nachschauen, bekommen wir Tray, weil wir in unserer Datenbank nicht mehr als vier Daten haben, also keine Daten pro Seite zwei. Wenn wir die aktuelle Seite auf eine ändern, speichern Sie diese und sehen Sie, wie wir hier zu den Daten kommen. Wir haben eine Abfrage für Paginierung und unendliches Scrollen erstellt. Diese einzelne Abfrage funktioniert für beide Funktionen. Ich hoffe, ich erkläre das gut. Wenn Sie immer noch Verwirrung haben, versuchen Sie, diese Variablen mit unterschiedlichen Werten zu versehen. Ich wette, du wirst das verstehen. 71. Aktualisieren der Daten: Lassen Sie uns nun sehen, wie wir die Daten in Mongo DB aktualisieren können. Es gibt also zwei Möglichkeiten, Daten zu aktualisieren. In der ersten Methode finden wir zuerst das Dokument, das wir aktualisieren möchten. Danach ändern Sie die Eigenschaft und speichern schließlich die aktualisierten Daten in unserer Datenbank. Und die zweite Methode ist, dass wir Aktualisierungsmethoden für Mangos verwenden und das Dokument direkt in der Datenbank aktualisieren Danach haben wir die Möglichkeit, je nach Bedarf aktualisierte Daten zurückzugeben je nach Bedarf aktualisierte Daten Was denkst du nun , welche Methode schnell ist? Nun, welche Methode ist Ihrer Meinung nach nützlich? Ja, die zweite Methode ist nützlicher , weil wir bei der ersten Methode mehrere Schritte ausführen müssen, was etwas Zeit in Anspruch nehmen kann. Aber bei der zweiten Methode werden wir Methoden verwenden, die durch Mangos definiert sind, sodass wir uns nicht darum kümmern müssen, Daten selbst zu aktualisieren Außerdem werden wir die erste Methode entsprechend unseren Bedürfnissen verwenden. Jetzt gibt es vier Methoden, um das Dokument zu aktualisieren. Mach dir keine Sorgen. Jede Methode ist sehr einfach und leicht. Lass mich dir das zeigen. Hier öffne ich das MongoDB-Demoprojekt Und hier nehmen wir an, wir möchten unsere Benutzer-E-Mail-ID aktualisieren , deren Name Code Bless lautet Also erstellen wir hier eine Zeichenfunktion namens Update User. Und in diese Funktion werden wir unsere Update-Logik schreiben. Für Update verwenden wir also das Benutzermodul dot. Hier haben wir Update eine Methode. Genau wie bei der Fine-Methode können wir hier ein Abfrageobjekt übergeben, auf das wir Filter anwenden, oder wir können Bedingung sagen. Also, was ist hier Bedingung? Der Benutzername sollte Code Plus sein. Also haben wir erklärt, welchen Benutzer wir aktualisieren möchten. Jetzt müssen wir nur noch angeben , welche Eigenschaft wir ändern möchten. Dafür übergeben wir also ein anderes Objekt am zweiten Parameter, und darin haben wir den und darin haben wir Dollar-Set-Operator und wir übergeben an das Objekt. In diesem Objekt geben wir nun an, welche Eigenschaft wir mit ihrem aktualisierten Wert ändern möchten. Wir wollen also die E-Mail-Adresse auf updated at the red gmail.com umstellen auf updated at the red gmail.com So können wir mehrere Eigenschaften zusammenfügen. Aber im Moment wollen wir nur die E-Mail ändern. Wie wir wissen, ist dieser Ausdruck die Aufgabe von Asnruners. Also können wir weitermachen, warten. Lass mich speichern, damit wir es richtig sehen können. Gut. Nun gibt dieser Ausdruck das aktualisierte Objekt nicht zurück. Mal sehen, was wir hier bekommen. Also speichern wir es in einer Variablen namens result und protokollieren dieses Ergebnis einfach unten in der Konsole mit einem Punkt. An der Stelle dieser Gate-Benutzerfunktion nennen wir auch die Funktion „Benutzer aktualisieren“. jetzt sicher, dass Sie die Anwendung beenden, bevor Sie die Änderungen speichern . Speichern Sie nun die Änderungen und schauen Sie sich das an. Führen Sie diese Anwendung mit Node Index Dot JS aus. Sehen Sie, hier erhalten wir keine aktualisierten Benutzerdaten, aber wir erhalten einige grundlegende Informationen zur DDT-Task Lassen Sie uns überprüfen, wie Daten in der Datenbank aktualisiert werden oder nicht Also Pamongo sei kompass und sieh hier unsere E-Mail auf updated@gmail.com geändert wurde So aktualisieren wir also die Daten. Zuerst übergeben wir ein Abfrageobjekt mit Bedingungen, und beim zweiten Argument übergeben wir den Dollar-Set-Operator und wir übergeben ein Objekt mit aktualisierten Eigenschaften und Werten. So einfach ist das. Denken Sie aber auch daran, dass dieser Methode zur Aktualisierung nur ein Dokument aktualisiert wird, nicht alle Dokumente, die diese Bedingung erfüllen. Manchmal möchten wir auch das aktualisierte Dokument erhalten. Keine Sorge, es ist wirklich einfach. An der Stelle des ersten Updates werden wir eines finden und aktualisieren. Dadurch wird das alte Dokument zurückgegeben, bevor wir es aktualisieren. Aber hier wollen wir das aktualisierte Dokument bekommen. das aktualisierte Dokument vergessen, übergeben wir hier das dritte Objekt, und darin übergeben wir new an true Als bewährte Methode werden wir hier auch eine weitere Option übergeben, nämlich Validatoren auf True ausführen Jetzt fragen Sie sich vielleicht, was Run Validators ist? Es ist nichts, was wir unserer Abfrage mitteilen, um sicherzustellen, dass diese aktualisierten Werte dem Modellschema entsprechen Lassen Sie mich diesen E-Mail-Wert auch in blessthergml.com ändern. Die Änderungen und schauen Sie sich das an. Lassen Sie uns diese Anwendung erneut ausführen. Sehen Sie, jetzt bekommen wir hier einen aktualisierten Wert. So können wir Werte mit Update One aktualisieren und einen finden und die Methode aktualisieren. Beide sind sich sehr ähnlich. Aktualisieren Sie eins, geben Sie das aktualisierte Dokument nicht zurück. Wenn Sie Find One und Update verwenden, erhalten wir das aktualisierte Dokument, aber beide aktualisieren nur ein Dokument. Lassen Sie mich Ihnen hier eine kleine Aufgabe stellen. Wir möchten den Namen des Benutzers aktualisieren, dessen ID dies ist. Kannst du die Abfrage schreiben? Es ist wirklich einfach. Hier im Abfrageobjekt an der Stelle des Namens übergeben wir die Unterstrich-ID und hier unsere Benutzer-ID in einer Zeichenfolge Sie können Ihre Benutzer-ID aus dem Mongo DB Compass kopieren und diesen E-Mail-Wert auch auf achmail.com in XYZ ändern Speichern Sie die Änderungen und schauen Sie sich das an. Führen Sie diese Anwendung aus. Sehen Sie hier wir bekommen das aktualisierte Dokument. Wunderbar. Das ist also sehr einfach. Oft möchten wir unser Dokument nur anhand ihrer eindeutigen ID finden , wie wir es derzeit getan haben. Wir möchten keine anderen Bedingungen erfüllen, da diese ID eindeutig ist und es keinen Sinn macht, andere Bedingungen zu erfüllen. Wenn wir Daten mit ihrer ID an der Stelle von find one und update update aktualisieren möchten , haben wir eine andere Kurzmethode, nämlich Suchen nach ID und Update. Jetzt müssen wir dieses Abfrageobjekt nicht übergeben. An dieser Stelle übergeben wir unsere ID direkt in einer Zeichenfolge. Die Änderungen und schauen Sie sich das an. Führen Sie diese Anwendung aus. Siehst du, wir bekommen wieder ein aktualisiertes Dokument. Wenn wir also einen Benutzer anhand seiner ID finden wollen, verwenden wir Fine by ID und Update. Jetzt haben wir diese drei Methoden für das Update gesehen. Aktualisiere eine, finde eine und aktualisiere und suche nach ID und aktualisiere sie. Wenn Sie feststellen, dass alle Methoden nur ein einzelnes Dokument aktualisieren , das zuerst gefunden wurde. Zweitens, aktualisiere eins und finde eins und aktualisiere ihre Namen zeigt, dass sie nur ein Dokument aktualisieren. Und wenn wir von Fine by ID sprechen und aktualisieren, was wir hier als Bedingung übergeben, übergeben wir eine eindeutige ID, was bedeutet, dass auch nur ein einziger Datensatz aktualisiert wird , dessen ID diese ist. Was aber, wenn wir mehrere Dokumente aktualisieren wollen? Dafür haben wir die vierte Aktualisierungsmethode, nämlich Update Many. Statt dieser Geldbuße nach ID und Update fügen wir Update Many hinzu. Hier müssen wir also erneut Ihr Abfrageobjekt übergeben , in dem wir Bedingungen definieren werden. Du überträgst also dein Alter auf 20. Hier sagen wir also, aktualisieren Sie unsere Aufzeichnungen , deren Alter 20 ist, und aktualisieren Sie ihre E-Mail-Adresse auf diesen Wert. Lassen Sie mich diesen E-Mail-Wert als hegmil.com ändern. Wir brauchen dieses dritte Argument nicht, das sind Optionen, weil es nur für ein gutes Argument funktioniert und nach ID und Update aktualisiert und gefunden wird Sehen Sie sich die Änderungen an und lassen Sie uns diese Anwendung ausführen. Sehen Sie, wir erhalten kein aktualisiertes Dokument, aber wenn wir unsere Datenbank überprüfen, wird unser Wert aktualisiert. Um es kurz zusammenzufassen Wir haben vier Methoden zum Aktualisieren von Daten in Mongo DB Aktualisieren Sie eins für die Aktualisierung eines einzelnen Dokuments, aktualisieren Sie viele für die Aktualisierung mehrerer Dokumente, suchen Sie eines und aktualisieren Sie es, um ein einzelnes Dokument in einem Schritt zu finden und zu aktualisieren, den letzten Schritt , suchen Sie nach ID und aktualisieren um ein Dokument anhand der ID zu finden und zu aktualisieren Außerdem übergeben wir in find one und update und find by ID and update method das Option-Objekt, und find by ID and update method das Option-Objekt, in dem wir new auf true setzen, um neue aktualisierte Daten zu erhalten , und führen Validatoren auf true aus, um dem Modellschema für aktualisierte Werte zu folgen . So einfach ist das. 72. Aktualisieren von Operatoren in MongoDB: Lassen Sie uns nun über Update-Operatoren sprechen. Aktualisierungsoperatoren werden verwendet, um Dokumente während eines Aktualisierungsvorgangs zu ändern. Einfach ausgedrückt, ermöglichen uns Aktualisierungsoperatoren , bestimmte Füllungen zu aktualisieren, Werte zu erhöhen, neue Daten festzulegen, Füllungen zu entfernen und vieles mehr Lass mich dir etwas sagen. Wir verwenden bereits einen Aktualisierungsoperator , der in Dollar festgelegt ist, aber wir haben viele andere Aktualisierungsoperatoren. Gehen Sie also zum Browser und geben Sie Update Operators in Mongo DB Öffnen Sie diesen ersten Link, und hier können wir sehen, dass wir Aktualisierungsoperatoren wie das aktuelle Dollardatum haben , um den Wert des ausgefüllten Datums auf das aktuelle Datum festzulegen den Wert des ausgefüllten Datums auf das aktuelle Datum Dollar-Tinte, um den Wert der Füllung um einen bestimmten Betrag zu erhöhen den Wert der Füllung um einen bestimmten Betrag Nehmen wir an, jemand mag den Beitrag, dann können wir den Dollar Ink Operator verwenden um den Wert der Füllung zu erhöhen Auch im Ink-Operator können wir negative Werte übergeben , wodurch sich die Anzahl verringern kann. Als Nächstes haben wir Mean, Max, ML für Multiplikation, Umbenennen, Setzen, Setzen beim Einfügen, Set für das Entfernen des Felds aus dem Dokument Ebenfalls unten haben wir Operatoren für Array, Pull, Push, Pull All usw. Machen Sie sich keine Sorgen um diese Operatoren. Wir werden viele von ihnen in unseren zukünftigen Projekten verwenden. Im Moment möchte ich nur diese Update-Operatoren vorstellen. In der nächsten Lektion werden wir sehen, wie wir Dokumente aus MongoDB löschen können 73. Löschen der Daten: Lassen Sie uns nun sehen, wie wir Daten aus dem Mongo Div löschen können. Es ist der Aktualisierung der Daten sehr ähnlich. Wir haben vier Methoden zum Löschen der Daten. Lösche eine, lösche viele, finde eine und lösche und letzte, suche nach ID und lösche. Jetzt verstehen Sie, warum ich mir mehr Zeit nehme , um die Aktualisierungsmethoden zu erläutern. Sie sind den Löschmethoden sehr ähnlich. Sehen wir uns diese Löschmethoden schnell an. Hier erstellen wir eine neue ASN-Funktion namens Benutzer löschen. Darin verwenden wir nun Benutzerpunkt Delete one und was wir in dieser Methode übergeben werden Wir übergeben einfach das Abfrageobjekt , weil wir hier nur das Dokument löschen wollen. Wir müssen nicht angeben, was wir aktualisieren möchten, wir können so etwas wie diese Ascore-ID an eine Benutzer-ID übergeben , die ich aus dem Mongo Dib-Kompass kopiert habe Dadurch wird dieser einzelne Benutzer mit seiner ID entfernt. Jetzt können wir Await wie zuvor verwenden und das Ergebnis einfach unveränderlich speichern Dieses Ergebnis ist das Objekt mit der Löscheigenschaft. Wir bekommen hier kein Dokument. Lass mich dich jetzt eine Sache fragen. Was ist, wenn wir dieses gelöschte Dokument im Ergebnis haben wollen ? Welche Methode werden wir verwenden? Wir können hier eine verwenden, eine finden und löschen. Und hier müssen wir nichts ändern. Anstelle von Fine One und Delete können wir also Fine by ID und Delete Method verwenden. Aber wenn wir fine by ID und delete verwenden, müssen wir hier kein Objekt mit der Eigenschaft ID übergeben. Wir können es direkt so weitergeben. Ich möchte nicht etwas ausleihen, indem ich diese Methoden zeige , weil sie fast identisch sind, oder? Stellen Sie sich vor, wir möchten alle Benutzer löschen , deren Alter älter als 15 ist und die auch nicht verifiziert sind Es ist wirklich einfach. Wir verwenden hier die Methode Delete Many und an der Spitze dieser ID übergeben wir ein Abfrageobjekt, in dem das Alter größer als 15 sein sollte Und eine weitere Eigenschaft wurde als falsch verifiziert. Lassen Sie uns dieses Ergebnis nun in der Konsole protokollieren. Und an der Stelle, an der die Funktion „Benutzer aktualisieren“ aufgerufen wird, rufen wir die Funktion für gelöschte Benutzer auf. Speichern Sie die Änderungen und lassen Sie uns diese Anwendung ausführen. Siehst du, hier werden wir gelöscht und zählen bis eins, weil nur ein Dokument diese Bedingung erfüllt. Und wenn wir unsere Datenbank überprüfen, fest, dass wir nur ein Dokument haben. Hier dreht sich also alles um den Löschvorgang. Es ist wirklich einfach, als die Daten zu aktualisieren. 74. Übung 01 - Konfigurieren von MongoDB: Jetzt ist es Zeit für Übungen. Sie können alles, was Sie in diesem Abschnitt gelernt haben, selbst üben was Sie in diesem Abschnitt gelernt haben Öffne unser erstes Projekt, Aufgabenbereich, den wir im fünften Abschnitt hinterlassen haben. Wir können an diesem Projekt üben. Wenn Sie noch keinen früheren Projektcode haben, sich keine Sorgen. Sie können ihn unten in dieser Lektion herunterladen . Jetzt entwerfe ich diese Übung so , dass Sie die verschiedenen Schritte von Mongo DB durchgehen Zunächst möchte ich, dass Sie dieses Projekt mit der Mongo DB-Datenbank verbinden dieses Projekt mit der Mongo DB-Datenbank Sie können dieser Datenbank einen Namen, einen Task-Track oder etwas anderes geben Task-Track oder etwas anderes Nachdem Sie in Schritt zwei erfolgreich eine Verbindung zur Datenbank hergestellt haben, müssen Sie ein Schema zum Speichern von Tudous erstellen Erstellen Sie in Ihrem Projekt einen neuen Ordner namens models und erstellen Sie in diesem Ordner eine neue Datei namens Tudous In dieser Datei müssen Sie Schema und Modell für die Tudos-Sammlung getrennt von unserem anderen Code definieren , und die Füllungen sollten Zuerst hatten wir eine Aufgabe, in der wir den Text für dieses Tudo definieren würden Stellen Sie sicher, dass dieses Ausfüllen obligatorisch ist. Als Nächstes haben wir den Status, der Tudo in Bearbeitung“ oder „Erledigt“ lauten kann Sie müssen sich überlegen, welchen Feldtyp Sie verwenden möchten. Außerdem sollte der Standardwert dieses Feldes to do sein. letzte Feld ist nun Text, das ist der Wertebereich, in dem wir verwandte Sprachtexte wie SDML, CSS, JavaScript, React, Node usw. hinzufügen können CSS, JavaScript, React, Node , und das war's für dieses Schema Nun muss in Schritt Nummer drei, basierend auf diesem Schema, ein Modell für die Sammlung von Tudou definiert Einfach. Ich weiß, dass du das kannst. Ich füge auch diese Übungsanleitung als PDF unten zu dieser Lektion hinzu. auch keine Sorgen, wenn Sie nicht an die Methoden von Mongo DB erinnern Sie können das zusammenfassende PDF verwenden, das ich am Ende dieses Abschnitts hinzugefügt habe Das Ziel dieser Übung ist es, den Prozess der Mongo DB-Schritte zu durchlaufen den Prozess der Mongo DB-Schritte zu durchlaufen Geben Sie also 100% und schauen Sie sich dann die Lösung an. Ich hoffe du löst diese Übung oder du versuchst diese Übung zu lösen und bist in einem dieser Schritte stecken geblieben. Mach dir keine Sorgen, zumindest versuchst du es zu lösen. Machen Sie sich das zu eigen. Sehen wir uns jetzt die Lösung an. Zuallererst müssen wir in unserem Projekt Mangos installieren, denn ohne Ted können wir keine anderen Dinge tun Also installiert NPM Mangos mit der roten 8,8 0,0. Gott. Lasst uns dieses Terminal minimieren. Jetzt geben wir in unserer JS-Datei mit Indexpunkt ganz oben ein, dass const mangos gleich require mangos ist Und nach dieser Studos-Route schreiben wir Mangos schreiben wir Beim ersten Argument übergeben wir einen überzähligen Ring, nämlich Mongo DV Doppelpunkt , doppelter Schrägstrich Spalte 27017 Schrägstrich, und hier schreiben wir unseren Datenbanknamen, der TAS TAG ist. Wie wir wissen, gibt dieser Ausdruck ein Versprechen zurück. Also verwenden wir die Methode Art Then und schauen uns darin einfach das Punktprotokoll Mongo DB hat erfolgreich eine Verbindung hergestellt. Was ist nun, wenn wir dabei einen Fehler bekommen? Also fügen wir auch die Cache-Methode hinzu. Hier erhalten wir das Fehlerobjekt, Fehlerfunktion und das Konsolenpunktprotokoll. Die MongoDB-Verbindung ist gefüllt. Und drucke diesen Fehler aus. Schritt Nummer eins ist also erledigt. Jetzt Schritt Nummer zwei, wir müssen das Schema für die Aufgabe definieren. Also erstellen wir in unserem Projekt einen neuen Ordner namens Models. Und in diesem Ordner erstellen wir eine neue Datei namens todos dot js Jetzt fragen Sie sich vielleicht, warum wir eine neue Datei erstellen müssen? Wir können es nicht in unserer Indexpunkt-JS-Datei definieren. Ja, wir können Schema und Modelle in einer Indexpunkt-JS-Datei definieren . Aber stellen Sie sich vor, unser Projekt hat fünf verschiedene Modelle. Stellen Sie sich vor, wie chaotisch unser Code wird. Wir fügen fünf verschiedene Schemas und unserer Indexpunkt-JS-Datei fünf verschiedene Schemas und Modelle Das ist die Praxis in der realen Welt. Wir werden alle Modelle und ihre Schemas in dem separaten Ordner Models definieren ihre Schemas in dem separaten Ordner Models Und welches Modell wir auch erstellen möchten, wir geben der Datei seinen Namen In diesem Fall ist es Tudos dot js. Hier importieren wir zuerst Cs-Mangos, das entspricht Requise-Mangos. Danach erstellen wir ein neues Mongoose-Punktschema und darin übergeben wir unser Fillin-Objekt erste ist eine Aufgabe, und wir setzen es auf eine Zeichenfolge Aber wir wollen das Ausfüllen auch verpflichtend machen. An der Stelle dieser Zeichenfolge übergeben wir also verschiedene Eigenschaften im Objekt. Nehmen wir an, Typ zu Zeichenfolge und erforderlich ist wahr. Als Nächstes haben wir Statistiken zum Objekt Geben Sie erneut zwei Zeichenketten ein. Und hier wollen wir die Feldwerte angeben. Also schreiben wir die Enum-Eigenschaft in ein Array und hier übergeben wir Werte Zuerst ist es erledigt, dann haben wir vielleicht etwas zu tun, und dann schreiben wir fertig Wenn wir also versuchen, irgendeinen vierten Wert einzugeben, dann diese Werte, dann wird das nicht funktionieren. Außerdem wollen wir den Standardwert angeben , also Standard, und wir setzen ihn auf todo. Als Nächstes haben wir Text , der ein Array von Zeichenketten ist. Wir können hier direkt ein Array übergeben und darin übergeben wir die Zeichenfolge Done. Unser Schema ist fertig. Speichern wir es in einer Variablen namens Tds-Schema. Gehen wir zum dritten Schritt über. Erinnerst du dich, wie wir Modell definieren können? Wir verwenden das Mango-Punktmodell. Hier geben wir zunächst den einzigartigen Namen unserer Kollektion weiter, nämlich Todo , aus der Todos-Kollektion werden wird Beim zweiten Argument übergeben wir das Todos-Schema. Jetzt wird das Todo-Modell zurückgegeben. Speichern wir es in einer Variablen namens todo. Stellen Sie sicher, dass wir Ihre Pascal-Groß- und Kleinschreibung verwenden , da diese Todos wie eine JavaScript-Klasse funktioniert Wir haben unsere erste Übung abgeschlossen. In der nächsten Lektion werden wir wenig vorankommen. 75. Übung 02 - Zum Speichern von Daten: Gehen wir nun zur zweiten Übung über, in der wir uns an das Einfügen von Daten in Mango Div erinnern werden über, in der wir uns an das Einfügen von Daten in Mango Div erinnern Also hier ist die Übung zur Anleitung als PDF. Ihr könnt sie auch von der rechten Seite herunterladen. Außerdem habe ich eine JSON-Datei hinzugefügt , in der ich acht Datensätze für Todos hinzugefügt habe In diesem Projekt haben wir jetzt bereits eine API zum Erstellen neuer Aufgaben. Aber in dieser API übertragen wir einfach neue Daten in unser lokales Array Stattdessen möchten wir Daten in unserer Todos-Sammlung speichern Lass mich dir hier einen kleinen Hinweis geben. Mit dem Modell können wir alles in der Sammlung machen. Sie müssen das Modell aus dem Modellordner abrufen und es hier verwenden. Hier ist eine kleine Demo für dich. Wenn wir eine Post-API-Anfrage mit diesem JSON-Objekt senden , speichern wir diese Daten im Backend in unserer Datenbank und geben gespeicherte Daten in der Antwort zurück. Das haben wir in diesem Abschnitt bereits getan. Sie können den aktuellen Abschnittscode auch als Referenz verwenden. Versuchen Sie, das Problem zu lösen, und schauen Sie sich dann die Lösung an. Also hoffe ich, dass du es löst oder versuchst, es zu lösen. Sehen wir uns jetzt die Lösung an. Zunächst müssen wir Datensätze in unsere Todos-Sammlung einfügen Datensätze in unsere Todos-Sammlung Aber wir wissen, dass wir mit der Sammlung irgendwas machen, wir brauchen dieses Modell. Wie können wir das Tudo-Modell in diese Tu-Dos-Routendatei aufnehmen Richtig, wir müssen unser Modell aus Tudos Model Five exportieren. Also schreiben wir hier, Modul Dot Exports entspricht diesem Tudo-Modell Dadurch wird dieses Tudo-Modell standardmäßig exportiert. Speichere das In TudosRout oben importieren wir Const Tudo is equal to require, importieren wir Const Tudo is equal jetzt befinden wir uns im Routenordner und möchten auf den Modellordner und möchten Wir müssen also in unseren Ordner zurückkehren, indem wir Modelle mit doppeltem Schrägstrich verwenden , und in diese Todos-Dot-JS-Datei und Gut. Also haben wir das Todo-Modell in dieser Datei Lassen Sie uns diese Todos-Daten nun schnell in der Sammlung speichern Todos-Daten nun schnell in Also gehen wir zur Post-Anfrage über, die wir erstellen, um neue Aufgaben in unserem lokalen Array hinzuzufügen um neue Aufgaben in unserem lokalen Array Zuallererst können wir diese Tudos-Array-Dot-Push-Methode auskommentieren diese Tudos-Array-Dot-Push-Methode auskommentieren und an dieser Stelle können wir Nu to do schreiben Und hier werden wir ohnmächtig, um das Objekt zu erledigen. Die erste Eigenschaft ist Aufgabe, und wie können wir die Aufgabe bekommen? Ganz oben erhalten wir den Text der Anfrage und speichern ihn in der Variablen do. Also schreiben wir unten, um Dot Task zu erledigen. Als Nächstes haben wir den Status, den wir wiederum von Tudos Punktstatus und auch von Tags zu Todo-Punkt-Tags erhalten Tudos Punktstatus und auch von Tags zu Todo-Punkt-Tags Hier fügen wir keine ID hinzu da sie automatisch von MongoDB generiert wird Bisher haben wir in diesem Abschnitt hier einen fest codierten Wert verwendet, aber hier verwenden wir Werte , die wir im Anfragetext erhalten So einfach ist das. Nun, das wird ein New to do-Objekt zurückgeben und um es zu speichern, schreiben wir hier Nut dot save. Wie wir bereits wissen, ist dies die Aufgabe eines asynchronen Runners. Deshalb verwenden wir Here away. Aber siehe hier, wir bekommen einen Laufzeitfehler. Um Avid verwenden zu können, müssen wir unsere Funktion asynchron machen. Aber warum hier in dieser API, unsere Funktion besteht darin, unsere Funktion besteht darin von der Anfrage und Antwort auf diese CR-Klammer Um diese Funktion nun asynchron zu machen, wir vor dieser Klammer ein Schlüsselwort übergeben wir vor dieser Klammer ein Schlüsselwort. So einfach ist Siehst du, der Fehler ist weg. Jetzt gibt dieser Ausdruck die gespeicherten Daten aus der Datenbank zurück . Also speichern wir es in variablen konstanten gespeicherten Daten. Und dann senden wir diesen Store als Antwort zu do. Lassen Sie uns nun sehen, ob das funktioniert oder nicht. Speichern Sie die Änderungen und lassen Sie uns diese Anwendung mit Nodemon Index Dot JS ausführen diese Anwendung mit Nodemon Index Dot Ein guter Server läuft und wir haben auch erfolgreich eine Verbindung zu Mongo Db hergestellt Perfekt. Mit unserer Tender-Client-Erweiterung senden wir Ihnen jetzt eine Postanfrage. Wir haben diese Create-to-do-API bereits gespeichert, also werden wir sie direkt hier im Hauptteil der Anfrage verwenden hier im Hauptteil der Anfrage Anstatt formularcodiert zu verwenden, werden wir JS und Format verwenden Wird uns die Aufgabe erleichtern. Öffnen Sie jetzt jsnFle, das ich dieser Lektion beifüge. Sie können es herunterladen, während Sie das PDF von der rechten Seite herunterladen. Jetzt kopiere ich einfach das erste To-do-Objekt und füge es in den Anfragetext ein. außerdem sicher, dass Sie eine Präfix-API in der URL haben, und senden Sie die Anfrage. Sehen Sie, hier erhalten wir unsere neuen Daten mit automatisch generierter ID. Das können wir auch im Mongo DbCompass überprüfen, hier bekommen wir die Todos-Daten Jetzt werde ich diese Lektion schnell vorspulen und nacheinander alle Todos einfügen Gut. Sie können sehen, wie wir vorankommen und jede Übung Schritt für Schritt lösen Auch in der realen Welt musst du Schritt für Schritt arbeiten. Auf diese Weise werden Sie weniger verwirrt und können problemlos arbeiten. 76. Übung 03 - Abrufen von Daten: Jetzt ist es Zeit für die dritte Übung, ich für das Abrufen der Daten entwerfe Nachdem Sie der Sammlung mehrere Werte hinzugefügt haben, möchte ich, dass Sie eine Abfrage für diese Sammlung schreiben Wir haben bereits eine G-Methode zum Abrufen aller Aufgaben. Sie können hier alle Abfragen nacheinander schreiben und die Übung abschließen Übung drei Die erste Abfrage besteht darin, dass wir alle To-DOS-Daten abrufen wollen Danach ist die zweite Abfrage Fatudos, der das Tag React hat. Dritte Abfrage, das ist ein bisschen knifflig. Festuds, der das Tag STML und auch einen Status hat, sollte Tudo tun. Danach zählt die vierte Abfrage die Anzahl der Tudos, deren Status Die letzte fünfte Abfrage ist faz tudos, bei der es das Wort create gibt, nur das Wort create nur das Es sollte nicht recreate created enthalten, sondern nur create. Achten Sie auch darauf, dass Sie hier Groß- und Kleinschreibung ignorieren Wie Sie wissen, können Sie meine Zusammenfassung als PDF verwenden, falls Sie sich nicht an die Methoden erinnern und diese Übung lösen Das wird dein Selbstvertrauen stärken und so wirst du lernen, auf welche Dinge du dich mehr konzentrieren musst. Wenn Sie bei einer Abfrage verwirrt sind, können Sie außerdem mit anderen Abfragen fortfahren und andere Abfragen lösen. Ich hoffe also, dass Sie versuchen, diese Übung zu lösen. Sehen wir uns nun schnell die Lösung an. Für die erste Abfrage, um alle Aufgaben aus der Datenbank abzurufen, haben wir hier diesen GPI, in dem wir dieses Todos-Array haben wir hier diesen GPI, in dem wir dieses direkt zurückgeben Aber jetzt wollen wir Daten aus der Datenbank abrufen, und dann werden wir diese Also hier schreiben wir todo dot find. Wir wollen alle Todos, also erfüllen wir hier keine Bedingung Nun, dieser Ausdruck ist vielversprechend. Wir können hier warten und diese Daten in einer Variablen namens Todos speichern diese Daten in einer Variablen namens Todos Jetzt bekommen wir hier einen Laufzeitfehler. Kannst du mir sagen, wie wir es lösen können? Wir machen unsere Funktion zu einer asynchronen Funktion und am Ende werden wir diese Todos als Antwort senden Speichern Sie die Änderungen und nennen wir das GTI PI. Hier haben wir diese GIPI nicht, also erstellen wir eine neue Anfrage, und in der URL übergeben wir die lokale Host-Spalte 3.000 API SLAStudos und Siehst du, hier bekommen wir die Liste der Tudos. Also lösen wir die erste Abfrage. Gehen wir nun zur zweiten Abfrage über. In diesen müssen wir Toudos patchen, der das Tag React hat. Ich dupliziere diese Zeile und kommentiere die erste Abfrage aus , um herauszufinden, ob eine einzelne Zeichenfolge im Array verfügbar ist oder nicht? Wir müssen nichts Besonderes tun. Wir übergeben hier direkt Objekt und fügen hier Bedingung Text hinzu und schreiben als Zeichenfolge unser Schlüsselwort, das React ist. Wenn es im Text-Array irgendein Element gibt, genau wie dieses React, dann kriegen wir das hin. Wir können dasselbe auch tun, indem wir den Operator in verwenden. Beide funktionieren gleich. Speichern Sie die Änderungen und lassen Sie uns diese Anfrage senden. Siehst du, hier haben wir drei zu erledigen und alle haben das React-Tag drin. Gehen wir nun zur dritten Abfrage über, bei der es sich schnelle Todos handelt, die das Tag STML hat und deren Status „to do“ sein sollte An der Stelle dieses Tags React übergeben wir also STML und wir übergeben einen weiteren Bedingungsstatus zu tun Wir können also Ihren Dollar-Operator verwenden, aber wir wissen bereits, dass er genauso funktioniert wie dieser Operator Speichern Sie die Änderungen und schauen Sie sich das an. Senden Sie die Anfrage. Siehst du, hier kommen wir zu Tudos Großartig. Gehen wir nun zur vierten Abfrage über, in der wir die Anzahl der Tudos zählen müssen , deren Status auf Erledigt gesetzt ist Lass mich dich etwas fragen. Sollen wir deine gute Methode anwenden oder die Anzahl der Tudos zählen? Nein, wir haben etwas anderes Erinnerst du dich, ja, wir verwenden die Methode zum Zählen von Dokumenten Also ersetzen wir diese gute Methode durch die Methode zum Zählen von Dokumenten, und hier übergeben wir den Zustandsstatus an D. Speichern Sie die Änderungen und sehen Sie sich das an. Sehen Sie, hier haben wir fünf, was bedeutet, dass der Status fünf Aufgaben erledigt ist. Jetzt haben wir die letzte Abfrage, die nach Dos ruft, in welcher Aufgabe das Wort create steht Hier fügen wir wieder feine Methode hinzu und an der Stelle dieser Statusbedingung haben wir eine Aufgabe und hier müssen wir reguläre Ausdrücke verwenden , weil wir mit Zeichenketten arbeiten Erinnern Sie sich nun an die Syntax regulärer Ausdrücke? Ja, es ist ein Musterschrägstrich. Um nun nach einem bestimmten Wort zu suchen, verwenden wir Backwards B und erstellen Bwards B. Um die Groß- und Kleinschreibung nicht zu berücksichtigen, verwenden wir hier, ich, speichere die Änderungen und Senden Sie die Anfrage und sehen Sie hier, dass wir drei Datensätze erhalten , in denen wir Word in der Aufgabe erstellt haben So holen wir uns Daten aus der Datenbank in der realen Welt. Ich hoffe, Sie haben eine Vorstellung davon, was wir lernen. 77. Übung 04 - Aktualisieren und Entfernen von Tasks: Gehen wir nun zur vierten Übung über. Keine Sorge, Sie können es in nur zwei bis 3 Minuten lösen. In diesem Projekt haben wir auch eine Methode zur Aktualisierung einer bestimmten Aufgabe anhand ihrer ID eingeführt . Bei der ersten Abfrage dieser Übung wird die spezifische Aufgabe anhand ihrer ID aktualisiert und nur der Aufgabentext auf aktualisiert geändert. Da Sie das in der Antwort aktualisiert zurückgeben müssen. Hier können Sie eine beliebige Objekt-ID aus dem Mongo Di BC-Pass kopieren und im Abfrageparameter übergeben Danach müssen Sie bei der zweiten Abfrage alle Dokumente aktualisieren, müssen Sie bei der zweiten Abfrage alle Dokumente aktualisieren deren aktueller Status Doing ist , und diesen Status mit De aktualisieren Außerdem müssen Sie hier keine neue API erstellen. Sie können einfach nur eine Aktualisierungsabfrage schreiben und sie überprüfen, wenn ich die Lösung zeige. Bei der letzten dritten Abfrage müssen Sie eine bestimmte Aufgabe anhand ihrer ID löschen. Hier können Sie auch eine beliebige ID aus dem Mongo Divi-Kompass verwenden beliebige ID aus dem Mongo Divi-Kompass Und nachdem der Löschvorgang abgeschlossen ist, müssen Sie das Objekt mit der Nachrichteneigenschaft zurückgeben , um es erfolgreich zu löschen Und für Löschabfragen können Sie die Löschen-API in unserem Code verwenden. Das sind ziemlich einfache Übungen. Sie können das Zusammenfassungs-PDF verwenden oder sich die Syntax ansehen. Machen Sie sich keine Sorgen, wenn Sie auf die Syntax der Methoden achten müssen. Sogar manchmal habe ich die Syntax vergessen. also keine Sorgen mit der Übung, Sie werden diese Syntax kennen. Ich hoffe also, dass Sie diese Übung lösen oder versuchen, diese Übung zu lösen. Machen Sie sich das selbst zu eigen. Sehen wir uns jetzt schnell die Lösung an. erste Abfrage besteht also darin, die spezifische Aufgabe anhand ihrer ID zu aktualisieren und nur den Aufgabentext zu ändern, um sie zu aktualisieren Hier haben wir also eine ID, die wir von den PAMs mit den Anforderungspunkten erhalten Jetzt brauchen wir vom Körper nur noch eine Aufgabe, damit wir andere Füllungen entfernen können Wir brauchen diesen Code nicht, weil wir diese Logik für ein lokales Array schreiben. Aber jetzt haben wir MongoDB-Methoden. Wir können hier schreiben, um Punkt zu machen. Nun, welche Methode verwenden wir hier? Sollen wir Update eins verwenden, eins finden und aktualisieren, sortiert nach ID, und viele aktualisieren oder aktualisieren? Ja, wir können jeden dieser vier verwenden. Aber hier müssen wir das aktualisierte Dokument zurückgeben. Zwei Optionen werden also einfach entfernt, nämlich Update One und Update Many , da diese beiden das aktualisierte Dokument nicht zurückgeben. Jetzt haben wir nur noch zwei Optionen. Welcher ist einfacher? Wir müssen aktualisieren, was mit der ID zu tun hat. Also verwenden wir hier, suchen nach ID und aktualisieren, und hier geben wir diese ID weiter. Außerdem müssen wir diese ID nicht in eine Ganzzahl konvertieren , da die Mongo DV-Objekt-ID eine Zeichenfolge ist Im zweiten Argument übergeben wir nun ein Objekt mit dem Dollar-Set-Operator und wir übergeben hier ein Objekt mit Aufgabe an Aufgabe, was wir aus dem Hauptteil der Anfrage erhalten Jetzt ist hier eine Sache. Wenn es sich um ein Objekt handelt, sind unser Eigenschaftsname und unser Wertname identisch, was hier Aufgabe und Aufgabe ist. Wir können es einfach als Aufgabe schreiben. Aber weil ich diesen Code gegeben habe, behalte ich ihn so. Erinnerst du dich, dass wir das dritte Argument in diesem Wind nach ID und Aktualisierungsmethode übergeben müssen? Hier übergeben wir new an true und führen auch Validatoren auf Speichern wir das, damit wir es klar sehen können. Nett. Jetzt wissen wir, dass es sich bei diesem Ausdruck um eine asynchrone Aufgabe handelt Also übergeben wir hier eine Gewichtung und speichern den aktualisierten Wert in der Variablen updated to do Außerdem müssen wir hier eine Gewichtung asynchron übergeben, und unten geben wir das einfach aktualisiert zurück Speichern Sie die Änderungen und lassen Sie uns diese Anwendung starten. Gut. Öffnen Sie den aktualisierten API-Test. Hier haben wir den Körper bereit. Ganz oben müssen wir die Objekt-ID „real to do“ als Parameter übergeben. Also kopieren wir jede zu erledigende ID aus dem Become Pass Mongo Di, und hier an der Stelle dieser ID übergeben wir unsere ID und stellen außerdem sicher, übergeben wir unsere ID und stellen außerdem dass wir das API-Präfix weniger hinzufügen Senden Sie diese Anfrage. Schön, wir bekommen unsere aktualisierten Daten. Gehen wir nun zur zweiten Abfrage über, der alle Dokumente aktualisiert deren aktueller Status „In Bearbeitung“ lautet und deren aktualisierter Status auf „Fertig“ steht. Ich dupliziere diese Abfrage und kommentiere sie einfach aus. Jetzt müssen wir hier mehrere Dokumente aktualisieren. Bei der Suche nach ID und Update verwenden wir also Update Many. Hier an der Stelle der ID müssen wir das Abfrageobjekt mit dem Bedingungsstatus auf Wird ausgeführt übergeben und wir wollen die Daten als erledigt ändern. Außerdem entfernen wir dieses dritte Argument. Wir brauchen es nicht, speichern die Änderungen und machen uns keine Gedanken über ID und Aufgabentext. Wir verwenden sie nicht in unserer Abfrage. Senden Sie die Anfrage. Siehst du, hier haben wir die Anzahl auf eins geändert, was bedeutet, dass wir sie erfolgreich aktualisiert haben. Sie können es auch mit dem Mongo Di B-Kompass überprüfen. Das ist eine, richtig, die Arbeit mit Daten. Ich liebe es. Gehen wir nun zur dritten Abfrage über. Dient zum Löschen einer bestimmten Aufgabe anhand ihrer ID. Hier erhalten wir also bereits die ID aus dem Anforderungspunkt PRMs Außerdem entfernen wir diese frühere Integer-Methode , weil wir sie nicht benötigen Jetzt müssen wir nur noch eine Abfrage schreiben. Entferne diesen vorherigen Code und wir verwenden Punkt, welche Methode wir verwenden. Denk darüber nach. Wir müssen eine bestimmte Aufgabe anhand ihrer ID löschen. Ja, wir können Dilt One, Fine One und Delete verwenden , oder wir können auch Fine by ID und Delete verwenden Ich spezifiziere hier nicht, ob wir das gelöschte Dokument zurückgeben müssen oder nicht Also für die Uraufführung verwenden wir hier DLT One Wenn wir ein gelöschtes Dokument wollen, dann verwenden wir hier, fein nach ID und löschen Hier übergeben wir die Eigenschaft Abfrageobjekt mit Unterstrich-ID an ID. Am Anfang fügen wir await hinzu und speichern es in der Variablen result Für await fügen wir oben Async hinzu und unten geben wir dieses Ergebnis mit dieser Nachrichteneigenschaft in dieses JSON-Objekt zurück mit dieser Nachrichteneigenschaft in dieses JSON-Objekt Speichern Sie die Änderungen und schauen Sie sich das an, kopieren Sie eine beliebige ID aus der Datenbank und öffnen Sie die Löschanfrage. Bei W dieser ID fügen wir unsere ID ein, Schrägstrich-API-Präfix ein und senden die Siehst du, wir werden gelöscht und zählen bis eins, was bedeutet, dass wir die Aufgabe erfolgreich löschen Wenn wir unsere Datenbank C aktualisieren, haben wir nur sieben Todos Eine Aufgabe ist das Löschen aus der Datenbank. Auf Weise führen wir das Aktualisieren und Löschen in Mongo Ich weiß, dass dieser Abschnitt etwas länger ist als andere Abschnitte, aber wie Sie sehen können, ist es sehr wichtig, Mongo Deb zu Deshalb habe ich diese Übungen speziell für das Erlernen von Mongo Wenn Sie sich diesen Kurs ununterbrochen ansehen, Sie eine kurze Pause vom Bildschirm Trinken Sie etwas Wasser und kümmern Sie sich um Ihre Augen. sehen uns im nächsten Abschnitt, wo wir uns fortgeschrittenen Themen von Mongo Deb 78. Abschnitt 08 - Integrierte Validierungsprogramme: Willkommen im achten Abschnitt des ultimativen Node JS-Kurses In diesem Abschnitt lernen wir fortgeschrittene Konzepte von Mongo DB Wir beginnen mit der Anwendung von Validatoren im Modellschema geben benutzerdefinierte Fehler für diese Validierung zurück Danach werden wir sehen, wie man Beziehungen zwischen Sammlungen aufbaut, man Datenbankstrukturen gestaltet und wie man Patches sehr Diese Konzepte sind sehr nützlich , wenn wir reale Anwendungen erstellen wollen. Fangen wir mit diesem Abschnitt an. Im vorherigen Abschnitt des Mongo-Demoprojekts haben wir dieses Schema für unser Benutzermodell erstellt , und im Schema definieren wir den Typ der Füllung und einige andere Eigenschaften wie erforderlich Dies erfordert eine Art von Validator für dieses Schema. Bisher haben wir sie nur definiert, aber wir sehen nicht wirklich die praktische Implementierung des Validators für Schauen wir uns an, was passiert ist , wenn wir versuchen, Daten hinzuzufügen, ohne den Namen Wir zählen diese Namenseigenschaft von hier ab und unten, an der Stelle der relativen Benutzerfunktion, nennen wir kreative Benutzerfunktion Speichern Sie die Änderungen, und lassen Sie uns im Terminal diese Anwendung node index dot js ausführen Siehst du, hier bekommen wir einen Fehler. Scrollen wir nach oben. Hier können wir sehen, dass wir einen Validierungsfehler erhalten , die Benutzervalidierung ist abgeschlossen. Name, Pfadname ist erforderlich. Jetzt fragen Sie sich vielleicht, warum wir diese Art von langem Fehler erhalten. Der Grund ist also, dass wir Fehler nicht richtig behandeln. Hier wissen wir also, dass diese neue User-Dot-CV-Methode ein Versprechen zurückgibt, und deshalb verwenden wir await. Aber hier tun wir so, als würden wir immer Daten in diesem Objekt erhalten und wir haben vergessen, Fehler zu behandeln Erinnern Sie sich also an den Abschnitt Asynrna JavaScript, wie wir mit Fehlern in Asnawt-Methoden umgehen? wie wir mit Fehlern in Asnawt-Methoden umgehen Richtig, wir verwenden den Try-and-Catch-Blog . Also fügen wir hier auch Tr-Blog hinzu und verschieben unsere Racing-Aufgabe hinein. Wenn Sie nun einen Fehler beim Speichern dieses Benutzers, unseres Codes, erhalten , wechseln Sie zu Catch-Blog. Hier erhalten wir ein Fehlerobjekt, und vorerst verwenden wir einfach das Dot Log dieses Fehlerobjekts, und es hat eine Eigenschaft namens message , in der wir eine Fehlermeldung erhalten Speichern Sie die Änderungen und führen Sie diese Anwendung erneut aus. Siehst du, jetzt bekommen wir unsere Fehlermeldung. Aber hier erhalte ich auch diese Update-Informationen. Lass mich sehen, was falsch ist. Ja, unten habe ich vergessen, diese Benutzeraktualisierungsfunktion zu kommentieren. Speichern Sie NGs und lassen Sie uns diese Anwendung erneut ausführen. Siehst du, hier bekommen wir unsere Fehlermeldung. Das ist gut und klar. In der realen Welt können wir diese Fehlermeldung als Antwort mit dem Statuscode 400 zurückgeben . Machen Sie sich darüber jetzt keine Sorgen. Was ist nun, wenn wir eine benutzerdefinierte Fehlermeldung für dieses Pflichtfeld übergeben möchten ? An der Stelle dieses Werts true übergeben wir ein Array. An erster Stelle übergeben wir unseren Wert für das Erforderliche, was wahr ist. An zweiter Stelle übergeben wir unsere Fehlermeldung in einer Zeichenfolge. Nehmen wir an, bitte geben Sie den Benutzernamen ein. Speichern Sie die Änderungen und schauen Sie sich das an. Siehst du, hier bekommen wir unsere benutzerdefinierte Fehlermeldung. Validatoren helfen uns dabei, die Qualität und Genauigkeit der Daten aufrechtzuerhalten die Qualität und Genauigkeit der Mithilfe von Validatoren überprüfen wir, ob die Werte im Dokument den Regeln entsprechen, die wir für jede Füllung festgelegt haben Bei Mangos gibt es zwei Arten von Validatoren. Der erste besteht aus integrierten Validatoren, den vordefinierten Validatoren Mangos Zweitens haben wir benutzerdefinierte Validatoren, die Erforderlich ist ein Teil der eingebauten Validatoren. Lassen Sie mich Ihnen einen weiteren eingebauten Validator für Mangos zeigen. Für die Zeichenfolge haben wir die Mindestlänge, wodurch die Mindestlänge der Zeichenfolge überprüft wird, und wir übergeben hier die Mindestlänge Danach haben wir die maximale Länge , die die maximale Länge der Zeichenfolge überprüft. Als Nächstes haben wir Match, das die Zeichenfolge mit einem regulären Ausdruck validiert, und seine Syntax ist Schrägstrichmuster. Entwickler verwenden diesen Match-Validator Im Moment wollen wir das nicht. Nehmen wir nun an, wir müssen für jeden Benutzer die Rolle dieses Benutzers angeben , bei der es sich um einen einfachen Benutzer oder um einen Administrator handeln kann, und die andere Zeichenfolge als diese ist nicht gültig. Zu diesem Zeitpunkt haben wir den Typ auf Zeichenfolge gesetzt, um die beiden Möglichkeiten festzulegen, wir verwenden hier die Eigenschaft num und setzen sie auf Array, und Sie haben es richtig erraten, wir werden unsere Werte in diesem Array übergeben Erstens kann er Benutzer sein und zweitens kann er Administrator sein. Wir können so viele Werte angeben, wie wir wollen, aber wir müssen einen dieser Werte übergeben , wenn wir einen neuen Benutzer speichern. Das haben wir bereits in unserer Übung gesehen. Denken Sie daran, dass dies die Validatoren für Zeichenketten sind. Außerdem gibt es zwei Validatoren für die Zahl, Mittelwert und Maximum, aber wir möchten sie hier nicht hinzufügen Das sind alles eingebaute Validatoren. Sie sind sehr hilfreich Außerdem möchte ich klarstellen, dass es sich den Validatoren um eine Mongoose-Funktion handelt Es hat nichts mit Mongo DB zu tun . Wenn wir aus der Mongo-Debi-Datenbank das Namensfeld aus einem Datensatz entfernen, dann ist es Mongo Deb in unserem Schema egal, wir setzen das Namensfeld auf Mongoose gibt uns diese Funktionen, damit wir Benutzerwerte validieren können, bevor wir Benutzerwerte validieren können, bevor Wenn es nicht gültig ist, speichert Mongoose diese Daten nicht in der Datenbank, und wenn sie gültig sind, speichert Mongo sie speichert Mongo So einfach ist das. In der nächsten Lektion werden wir nun sehen, wie man benutzerdefinierte gültige Daten erstellt 79. Benutzerdefinierte Validierer: Lassen Sie uns nun sehen, wie wir benutzerdefinierte Validatoren in unserem Schema festlegen können benutzerdefinierte Validatoren Hier haben wir also alle Hobbies, nämlich die Reihe von Wir möchten sicherstellen, dass der Benutzer mehr als ein Hobby hinzufügen muss. Dafür müssen wir benutzerdefinierte Validatoren definieren. Es ist wirklich einfach. Nach dieser Typeigenschaft haben wir hier eine weitere Eigenschaft namens validate, und wir übergeben hier ein weiteres Objekt. In diesem Objekt haben wir nun die Validator-Eigenschaft, Spalte und hier die Validator-Funktion übergeben Hier wollen wir das überprüfen. für dieses Feld übergebene Wert hat zwei Elemente oder nicht, aber dafür benötigen wir den Wert hier. Wir erhalten diesen Wert als Parameter und nennen ihn V für Wert. In dieser Funktion können wir jetzt einfach die Bedingung zurückgeben. Lassen Sie mich Sie fragen, wie können wir das überprüfen? V hat zwei Elemente oder nicht? Ja, wir können hier schreiben, Punktlänge sollte größer als eins sein. Und das ist es. Mal sehen, ob es funktioniert oder nicht. Dafür kommentieren wir dieses Hobbyfeld aus und ich ändere auch die E-Mail-Adresse auf Harley Speichern Sie die Änderungen und lassen Sie uns diese Anwendung ausführen. Siehst du, hier bekommen wir zwei Fehler, einen für den Namen und einen für Hobby. Validator ist für den Pfad Hobbies mit einem leeren Wert als Zeichenfolge fehlgeschlagen mit einem leeren Wert Stellen Sie sich nun vor, wir geben diesen Fehler mit unserer API zurück. Fast niemand kann diesen Fehler verstehen. Wir müssen also eine aussagekräftige Fehlermeldung für das Ändern dieser Fehlermeldung angeben für das Ändern dieser Fehlermeldung Nach dieser Validator-Funktion haben wir eine Nachrichteneigenschaft und wir übergeben hier eine benutzerdefinierte Nachricht Bitte geben Sie zwei verschiedene Stellen Sie sicher, dass wir diese Nachrichteneigenschaft in diesem Prüfungsobjekt hatten , nicht in der Validator-Funktion, da ich diesen Fehler bei der Aufzeichnung dieser Lektion gemacht habe Speichern Sie das und lassen Sie uns diese Anwendung noch einmal ausführen. Siehst du, hier bekommen wir unsere benutzerdefinierte Fehlermeldung. Lassen Sie uns jetzt mehr Dinge für diese Füllung testen. Was ist, wenn jemand nur ein Hobby weitergibt? Lass uns das überprüfen. Wenn Sie den Befehl entfernen, entfernen wir zwei weitere Hobbys aus unserem Array. Speichern Sie die Änderungen und lassen Sie uns diese Anwendung ausführen. Schön, hier bekommen wir die Fehlermeldung, es funktioniert. Was ist nun, wenn hier jemand einen Nullwert übergibt? Speichern Sie das und lassen Sie uns unsere Anwendung noch einmal ausführen. Siehst du, hier bekommen wir Eigenschaften mit dem Wert Null, Leselänge, nicht lesbar . Warum bekommen wir jetzt diesen Fehler? Weil wir in unseren benutzerdefinierten Validatoren versuchen, die Länge dieses Werts zu ermitteln Wenn der Benutzer jedoch Null als Wert übergibt, können wir nicht auf die Längeneigenschaft zugreifen Wir können eine andere Bedingung einhalten, wenn der Typ V dem Array entspricht. Und seine Länge sollte größer als eins sein. Wenn diese beiden Bedingungen zutreffen, werden unsere Daten nur dann validiert. Wir können die Nachricht auch so ändern, dass Sie bitte ein Hobbyfeld mit zwei verschiedenen Hobbys eingeben. Speichern Sie die Änderungen und lassen Sie uns diese Anwendung ausführen. Sehen Sie, hier erhalten wir die benutzerdefinierte Nachricht für den Nullwert. Um es kurz zusammenzufassen, was das Hinzufügen von benutzerdefinierten Validatoren angeht Wir haben eine gültige Eigenschaft hinter der Und bei dieser Validierung können wir zwei Eigenschaften hinzufügen. Einer ist Validator, der eine Validator-Funktion hat, und ein anderer Und von dieser Validator-Funktion aus geben wir die Bedingung für die geben wir Sie fragen sich vielleicht, ob wir die Bedingung zurückgeben möchten, warum wir dann diese Funktion benötigen Wir können hier direkt eine Bedingung hinzufügen, aber überprüfen Sie dies noch einmal. In diesem Zustand benötigen wir immer den aktuellen Wert dieser Füllung, und den erhalten wir nur in der Validator-Funktion Deshalb brauchen wir diese Funktion. So definieren wir benutzerdefinierte Validatoren für das Schema. 80. Asynchrone Validierungsprüfungen: Manchmal kann unsere Validierung in unserem Projekt einige asynchrone Operationen beinhalten, was bedeutet, dass der Vorgang einige Zeit in Anspruch nehmen kann was bedeutet, dass der Vorgang einige was bedeutet, dass der Vorgang Zum Beispiel möchten wir Daten aus der Datenbank abrufen und auf der Grundlage dieser Daten unsere Füllung validieren In diesem Fall können wir Async-Validatoren anwenden. Lass es mich dir zeigen. Zum Anwenden der Async-Validatoren in der vorherigen Version Hier im Validator-Objekt müssen wir eine Eigenschaft namens async zu true hinzufügen In der neuesten Mongoose-Version ist diese Option jedoch standardmäßig aktiviert. Wir können das entfernen Jetzt können wir diese Funktion einfach asynchron machen und innerhalb dieser Funktion können wir unsere asynchrone Aufgabe ausführen Wir wollen diese Komplexität oder dieses Modell nicht Um die Verzögerung zu demonstrieren, verwenden wir hier die Methode set timeout Der erste Parameter ist die Callback-Funktion und zweitens fügen wir 3.000 Millisekunden hinzu , Lassen Sie mich nun vor dieser eingestellten Timeout-Funktion das Dot Log in der Konsole aufrufen Nehmen wir nun an, dass wir nach 3.000 Millisekunden Daten aus der Datenbank abrufen und auf der Grundlage dieser Daten jede Bedingung zurückgeben können Denken Sie nur daran, dass wir die Bedingung zurückgeben müssen , die wir zuvor zurückgegeben haben, was bedeutet, dass sie wahr oder falsch sein sollte Speichern Sie die Änderungen und lassen Sie uns diese Anwendung ausführen und sehen, hier erhalten wir unseren Fehler. So können wir Async-Validatoren anwenden. Ich persönlich verwende das nie in meinem Projekt weil asynchrone Operationen zur Validierung selten sind, aber dieses Thema könnte einigen von Ihnen helfen, und deshalb füge ich In der nächsten Lektion werden wir nun einige schematisierte Optionen sehen 81. Nützliche SchemaTypes-Optionen: Sehen wir uns nun die Optionen für Schematypen in Mongoose an. Wir verwenden sie bereits in unserem Schema, das in Kleinbuchstaben bis wahr geschrieben ist Dadurch wird unsere Zeichenfolge in Kleinbuchstaben gespeichert. Genau wie hier, wir setzen Großbuchstaben auf Wahr. Dadurch wird unsere gesamte Zeichenfolge in Großbuchstaben gespeichert. Und danach haben wir eine weitere nützliche Option, nämlich Stream to True. Dadurch wird unnötiges Leerzeichen aus unserer Zeichenfolge entfernt. Dadurch wird beispielsweise diese Zeichenfolge in diese Art von Zeichenfolge umgewandelt. Unsere Daten sehen also gut organisiert und sauber aus. Es ist nicht notwendig, wir müssen all diese Schemaoptionen in unserem Projekt verwenden . Wir können alles verwenden, was gemäß unserem Modell benötigt wird. Dafür gibt es keine Regeln. Letztlich dienen Validatoren nur dazu, die Qualität und Genauigkeit der Daten aufrechtzuerhalten 82. Beziehung zwischen Modellen: Bisher haben wir in diesem Kurs also Modelle oder Kollektionen gesehen, die einfach sind und nichts mit einem anderen Modell zu tun haben . Aber in der realen Welt sind die meisten unserer Modelle miteinander verbunden. Lassen Sie mich Ihnen das anhand des Beispiels erklären. Stellen Sie sich vor, wir arbeiten an Social-Media-Anwendung wie Twitter. Wir haben also eine Sammlung für Benutzer, in der wir alle Benutzerdaten wie Name, E-Mail, Passwort usw. speichern . Danach haben wir eine Sammlung für Post, in der wir alle Postdaten speichern werden Im Post-Dokument haben wir Inhalt, d. h. das Textdatum des Beitragsinhalts dieser Beitrag erstellt wurde. Danach haben wir einen Benutzer, diesen Beitrag hochgeladen hat, sagen wir Harley Nun, diese beiden Dokumente oder wir können sagen, Sammlungen sind nicht miteinander verbunden. Wir müssen sie verbinden. Das nennt man Modellbeziehung. Jetzt haben Sie vielleicht die Frage, warum wir Modelle miteinander verbinden müssen? Warum brauchen wir diese Beziehung? Wenn wir also keine Beziehung verwenden, wir möglicherweise dieselben Benutzerdaten für jeden Beitrag, den sie veröffentlichen, wiederholt speichern . Angenommen, ein Benutzer veröffentlicht zehn verschiedene Beiträge. Wenn wir keine Beziehung verwenden, müssen wir dieselben Benutzerdaten zehnmal für jeden Beitrag speichern , und das ist nur ein Benutzer. Stellen Sie sich vor, in unserer Social-Media-Anwendung gibt es 100.000 Studenten oder mehr. Denken Sie daran, wie viele Daten sich in unserer Datenbank wiederholen müssen, und das ist auch schwieriger zu verwalten. Wir müssen also Beziehungen zwischen Modellen verwenden , die Assoziationen aufweisen. Jetzt gibt es zwei Ansätze , um Beziehungen zu implementieren. Erstens werden Verweise verwendet, und bei einem anderen werden Daten in ein anderes Dokument eingebettet. Sehen wir uns zunächst an, wie wir Beziehungen mithilfe von Referenzen implementieren können . Im Post-Dokument haben wir diesen Benutzer und wir übergeben den Benutzernamen. Jetzt ist dieser Benutzer bereits in der Sammlung des Benutzers verfügbar. Anstatt den Benutzernamen in der Beitragssammlung zu speichern, können wir Ihre Benutzer-ID dieses Benutzers verwenden. Anhand der eindeutigen Benutzer-ID können wir eine weitere Abfrage ausführen, um Benutzerdaten wie Name und Profilbild aus der Benutzersammlung abzurufen. Jetzt haben wir für jeden Beitrag nur die Benutzer-ID an der Stelle des Benutzernamens. Wir können jedoch sehen, dass bei diesem Ansatz eine weitere Abfrage ausgeführt werden muss, was zu Leistungsproblemen führen kann. Ich sage nicht, dass es definitiv zu Leistungsproblemen führen wird , aber manchmal kann es passieren. Der andere Ansatz , der dieses Problem lösen kann, ist das Einbetten von Daten in ein anderes Dokument. An der Stelle, an der die Benutzer-ID übergeben wird, können wir hier das Benutzerobjekt und die Sammlung unseres Benutzers entfernen. diesem Ansatz müssen wir uns nicht mit Abfragen befassen, sodass wir hier keine Leistungsprobleme haben, aber hier ist eine Sache. Stellen Sie sich vor, der Benutzer hat 20 bis 40 Details. Dadurch wird unser Post-Dokument viel größer. Außerdem wird es zu Datenduplikationen kommen, da wir für jeden Beitrag ein Benutzerobjekt speichern müssen Nun, einige Entwickler sagen Datenbankspeicher heutzutage billig ist Wir können uns die Datenduplizierung leisten, und das stimmt. Aber was ist, wenn unser Benutzer seinen Benutzernamen oder seine E-Mail-ID aktualisieren möchte seinen Benutzernamen oder seine E-Mail-ID aktualisieren Dieses Mal müssen wir mehrere Beiträge aktualisieren, und wenn zwei bis drei Dokumente diese Aktualisierungen nicht erhalten, führt das zu Dateninkonsistenzen Wenn wir jedoch Referenzen verwenden, müssen wir die Daten nur an einer Stelle aktualisieren Zusammenfassend lässt sich sagen, dass wir bei der Verwendung von Referenzen Datenkonsistenz erzielen, da unsere Daten an einem einzigen Ort gespeichert werden Es kann jedoch zu Leistungseinbußen kommen , da wir mehrere Abfragen ausführen müssen. Auf der anderen Seite erzielen wir Leistung, wenn wir Daten in ein anderes Dokument einbetten . Wir erhalten unsere Daten schneller , weil wir nicht mehrere Abfragen ausführen müssen. Wir haben unsere Daten in einem einzigen Dokument, aber dadurch kommt es zu Dateninkonsistenzen, kommt es zu Dateninkonsistenzen weil wir dieselben Daten an mehreren Stellen haben Das ist eins kaufen, eins gratis bekommen. Wir müssen uns für unsere Bewerbung entscheiden. Wir brauchen Datenkonsistenz oder wir wollen Leistung. Wenn wir Datenkonsistenz wollen, verwenden wir Referenzen, und wenn wir Leistung wollen, dann betten wir Daten in ein anderes Dokument ein. Verschiedene Projekte haben unterschiedliche Anforderungen. Als Entwickler müssen Sie entscheiden, welcher Ansatz für Ihr Projekt am besten geeignet ist. Heutzutage verwenden Entwickler einen hybriden Ansatz , der diese beiden Ansätze kombiniert, und das werden wir in der nächsten Lektion sehen. 83. Hybridansatz für Beziehungen: Wir haben gesehen, dass wir Datenkonsistenz erreichen, wenn wir Referenzen verwenden , und wenn wir Daten in ein anderes Dokument einbetten , erzielen wir Leistung. Lassen Sie mich Ihnen den hybriden Ansatz zeigen , den Entwickler heutzutage verwenden. Angenommen, wir haben Benutzer mit 20 bis 30 Eigenschaften Wir speichern die Details dieser Benutzer in der Sammlung des Benutzers. Nun zur Post, wir haben diese anderen Felder, genau wie wir es im Referenzansatz sehen. Aber im Referenzansatz speichern wir hier die Benutzer-ID. Den Ort dafür können wir hier verwenden, ein kleines Benutzerobjekt, das nur notwendige Eigenschaften enthält die wir mit dem Beitrag anzeigen wollen. Möglicherweise haben wir eine Benutzer-ID, die den Verweis auf die Sammlung des Benutzers und den Benutzernamen darstellt. Wir speichern hier nicht alle 20 bis 30 Eigenschaften, sondern wir werden nur so viele Daten einbetten. Wir wollen mit Beitrag anzeigen. Mit diesem Ansatz können wir Beiträge schnell abrufen, da wir nicht mehrere Abfragen abrufen müssen Wir haben alle notwendigen Daten in einem einzigen Objekt. Dieser Ansatz funktioniert am besten, wenn unsere Sammlung kleine Details benötigt die häufig zugegriffen wird. Zum Beispiel in unserem E-Commerce-Projekt, bei dem wir Produkte, Bestellungen, Einkaufswagen usw. haben . jeder Bestellung möchten wir kleine Details unserer Produkte wie ID, Name, Titelbild und Preis verwenden kleine Details unserer Produkte wie ID, Name, , da wir diese Bestelldetails zusammen mit den Produkten anzeigen möchten diese Bestelldetails zusammen mit den Produkten Wir haben also eine separate Erfassung von Produktdaten, werden aber dennoch einige kleine Daten zu Produkten in jede Bestellung einbetten . Wenn wir also schnellen Zugriff auf kleine Details haben wollen, aber auch auf große oder komplexe Daten verweisen wollen, dann verwenden wir einen hybriden Ansatz. Auch hier sage ich Ihnen, dass Sie sich nicht an einen Ansatz halten müssen. Manche Anwendungen funktionieren am besten mit Referenzen. Funktioniert also am besten mit eingebetteten Daten, und einige funktionieren am besten mit diesem hybriden Ansatz. Sie müssen sich entsprechend den Anforderungen Ihres Projekts entscheiden. Sie sich keine Sorgen, wenn wir zwei weitere Projekte erstellen. Ich werde Ihnen zeigen, wie wir den Beziehungsansatz festlegen können. Ich spreche von Beziehungen zwischen Sammlungen, nicht von anderen Arten von Beziehungen. 84. Anwenden des Referenzansatzes: Lassen Sie uns sehen, wie wir den Referenzansatz für Beziehungen anwenden können . dieses Konzept zu praktizieren, habe ich diese neue Datei erstellt, weil ich nicht möchte, dass Sie durch diesen chaotischen Kern verwirrt werden Lassen Sie mich Ihnen erklären, was ich zu dieser Datei hinzugefügt habe. Zuerst verbinden wir diese Datei mit Mongo-DB-Datenbank namens Mongo, das ist Danach definieren wir hier, wie wir im Beispiel sehen, ein einfaches Benutzerschema mit nur drei Füllungen: Name, E-Mail und Alter Danach definieren wir ein neues Schema für Post. Darin haben wir zwei Füllinhalte, bei denen es sich um Text und dann um Datum handeln kann, das das aktuelle Echtzeitdatum ist. Wir haben einen Benutzer, den wir in nur einer Minute hinzufügen werden. Danach erstellen wir zwei Modelle für Benutzer und die Beitragserfassung. Das haben wir schon gemacht. Ich möchte Sie nicht langweilen, indem immer wieder denselben Code schreibe. Nachdem wir diese beiden Sammlungen erstellt haben, definiere ich einige Funktionen. Eine davon ist „ Benutzer erstellen“, in der wir einen neuen Benutzer erstellen und ihn in der Sammlung des Benutzers speichern können . Als Nächstes haben wir die Funktion Beitrag erstellen, mit der wir einen neuen Beitrag erstellen, indem wir Inhalte und Benutzerdaten verwenden, wer diesen Beitrag erstellt hat. Die letzte Funktion dient zum Abrufen aller Beiträge aus der Datenbank. Wir haben das alles schon gesehen. Lassen Sie uns den ersten Benutzer mit diesen Werten erstellen. Führen Sie diese Anwendung mit Node, Referenzpunkt JS aus. Gut. Versuchen wir nun, einen neuen Beitrag zu erstellen, ohne Benutzerdaten hinzuzufügen. Hier kommentiere ich diese Funktion „ Benutzer erstellen“ aus und entferne Kommentar aus der Funktion „ Beitrag erstellen“. Lassen Sie uns diese Anwendung erneut ausführen und sehen, wie wir hier einen neuen Beitrag erstellen. Wir haben Inhalte und sehen, wir bekommen keine Benutzerdaten, auch wenn wir die neuen Benutzerdaten als „user“ übergeben. Wir können sehen, dass Mangos nur die Füllungen hinzufügen, die wir im Schema definiert haben Es werden nicht alle anderen Füllungen hinzugefügt. In diesem Beitragsmodell müssen Sie nun das Benutzerfeld hinzufügen und wir geben die Benutzerreferenz aus der Benutzersammlung an. Lass mich dir zeigen, was ich meine. Hier fügen wir Benutzer hinzu. Wenn wir nun eine Referenz angeben möchten, können wir diese mithilfe der Objekt-ID angeben, da sie eindeutig ist. Wir übergeben seinen Typ an Mongos Punktschema-Punkttypen, Punkt Object ID Ja, wir müssen diesen Ausdruck übergeben, um Objekt-ID als gefüllten Typ zu definieren Nach der Eigenschaft type müssen wir angeben, welche andere Modellreferenz wir hinzufügen. Wir übergeben RF zwei und hier geben wir unseren Kollektionsnamen im Singular weiter. Genauso wie wir diese Methode des Mongoose-Punktmodells übergeben , die Benutzer ist Lassen Sie uns nun unsere Benutzer-ID in der Funktion „Beitrag erstellen“ übergeben. Im Mongo D BCMEPass erhalten wir die neue Datenbank namens Darin erhalten wir eine Benutzersammlung, kopieren diese Benutzer-ID, die wir gerade erstellt haben, und fügen sie an der Stelle In der Funktion Beitrag erstellen hatten wir diese ID an der Stelle des Benutzers. Lassen Sie uns diesen Inhalt auch in Inhalt ändern. Also die Änderungen, und lassen Sie uns diese Anwendung ausführen. Sehen Sie hier, wir bekommen auch einen neuen Beitrag mit Inhalt, und wir bekommen hier auch die Benutzer-ID, die der Verweis auf das Benutzermodell ist. Das Hinzufügen einer Referenz ist sehr einfach. Wir müssen diesen Fülltyp auf Mongos Punktschema Punkt Types Punkt Object ID setzen und wir übergeben die Ref-Eigenschaft, um den Namen des Referenzmodells in einem einzigen Wort hinzuzufügen . Wenn wir nun versuchen, einen Beitrag zu bekommen, kommentieren Sie diesen und entfernen Sie den Kommentar aus dieser G-Post-Funktion Speichern Sie die Änderungen und schauen Sie sich das an. Siehst du, hier bekommen wir zwei Beiträge. Der erste, den wir ohne Benutzer erstellt haben und der zweite, in dem wir die Benutzer-ID als Referenz definieren. Jetzt fragen Sie sich vielleicht, dass wir hier eine einfache Benutzer-ID bekommen. Wie können wir Benutzerdaten wie Benutzername oder E-Mail von dieser Referenz abrufen ? Das werden wir in der nächsten Lektion sehen. 85. Extrahieren von Daten aus Referenz [Populate]: Mal sehen, wie wir Daten mit dieser Referenz-ID extrahieren können Daten mit dieser Referenz-ID Es ist wirklich einfach. Um die Daten per Referenz abzurufen, verwenden wir eine Methode namens populate. Nach dieser guten Methode fügen wir dot populate hinzu und darin müssen wir den vollständigen Namen übergeben, der die Referenz ist Ja, hier ist es der Benutzer. Speichern Sie die Änderungen und schauen Sie sich das an. Führen Sie diese Datei erneut aus. Siehst du, hier können wir wieder posten. Im zweiten Beitrag erhalten wir alle Details dieser Benutzer-ID. Stellen Sie sich jetzt vor, wir wollen nur ihren Namen bekommen. Wir brauchen keine anderen Füllungen. Können wir das machen? Ja, das können wir. Beim zweiten Argument übergeben wir den Namen der Pille, die wir aus unserer Referenzsammlung erhalten möchten. In Codes fügen wir einen Namen hinzu, speichern ihn und lassen uns diese Anwendung noch einmal ausführen. Siehst du, hier bekommen wir nur den Namen und die Unterstrich-ID. Anstatt nur den Namen anzuzeigen, wollen wir jetzt alle Informationen über den Benutzer, aber wir brauchen nur dieses Alter nicht. Wie können wir das machen? Jeder Ort oder Name, den wir entfernen wollen, minus ganz einfach. Auf diese Weise erweitern wir Referenzdaten mit einer gängigen Methode. Lass mich dir jetzt etwas sagen. Wir hatten eine Referenz in unserem Modell, nur Mangos verwenden diese Referenz. Mongo Deb ist das egal. Selbst wenn wir hier eine ungültige Benutzer-ID weitergeben, überprüft Mongo DB nicht, ob die Benutzer-ID in der Sammlung des Benutzers verfügbar ist oder Es speichert die Daten, ohne sich darüber Gedanken machen zu müssen. Lass mich dir das zeigen. Wir erstellen hier einen weiteren Beitrag. Kommentiere diese Gad-Beitrags-Funktion aus und entferne den Kommentar aus dieser Funktion zum Erstellen von Beiträgen Lassen Sie uns diesen Inhalt auf drei ändern, und wir ändern einfach das letzte Zeichen dieser Benutzer-ID In der Sammlung unserer Benutzer haben wir keinen Benutzer , dessen ID so lautet. Lassen Sie uns nun diese Anwendung ausführen. Siehst du, unser Benutzer Drei wurde hier erstellt. Lassen Sie uns nun die Liste der Beiträge abrufen, diese Funktion auskommentieren und sie Gad Post-Funktion aufrufen Die Änderungen und beim dritten Beitrag sehen wir, dass wir den Benutzer auf Null setzen, weil wir keine Referenz für diese ungültige Objekt-ID erhalten, was beweist, dass MGB nicht überprüft, ob die Benutzer-ID in der Sammlung des Benutzers verfügbar ist oder In der nächsten Lektion werden wir nun einen anderen Ansatz sehen, der in ein anderes Dokument eingebettet ist 86. Anwenden des Einbettungsansatzes: Um den eingebetteten Ansatz anzuwenden, entferne ich den vorherigen Code nicht , da ich Ihnen diesen Code als Referenz geben möchte. Wir laden die Datei Embedded Dot JS von unten herunter, oder Sie finden sie im Ordner Resources Section 8. Beim Referenzansatz hier für „user filled“ übergeben wir nun den Typ an die Objekt-ID und verweisen mit der Benutzersammlung darauf. Aber beim eingebetteten Ansatz fügen wir hier direkt ein Benutzerobjekt mit allen Eigenschaften hinzu. Wir erstellen hier kein Benutzermodell, löschen diese Zeile, wir erstellen nur ein Modell, das gepostet ist. Außerdem können wir die Funktion zum Erstellen eines Benutzers von unten entfernen , da das Dokument für jeden Beitrag ein Benutzerobjekt hat. Jetzt können wir hier ein Objekt hinzufügen und müssen hier Eigenschaften übergeben , die wir für dieses Benutzerobjekt benötigen. Wir können Name zu Zeichenfolge, E-Mail zu Zeichenfolge und Alter zu Zahl sagen . Das Schlechte an diesem Benutzerobjekt ist, dass unser Benutzer keine Werte für den Namen, die E-Mail-Adresse oder das Alter übergeben kann. Wir müssen die Validierungen für diese Füllungen bestehen , da wir in jedem Beitrag ein Benutzerobjekt benötigen Anstatt hier also eine Validierung hinzuzufügen, haben wir bereits ein Benutzerschema An der Stelle, an der dieses einfache Objekt übergeben wird, übergeben wir hier das Benutzerschema. Mit diesem Schema können wir alle unsere Validatoren hinzufügen , genauso wie wir eine separate Sammlung haben Außerdem hat die separate Definition des Schemas noch einen weiteren Vorteil Wir können dieses Benutzerschema auch für eine andere Sammlung verwenden, in die wir auch Benutzerdaten einbetten möchten. Lassen Sie uns nun einen neuen Beitrag mit diesen eingebetteten Benutzerdaten erstellen. Also entferne ich diesen Aufruf der Funktion „ Benutzer erstellen und wir rufen die Funktion „ Beitrag erstellen“ auf. Jetzt müssen wir an der Stelle dieses Benutzers das Benutzerobjekt übergeben , da dieses Benutzerobjekt direkt im Post-Dokument gespeichert wird . Für den Benutzer übergeben wir das Objekt mit dem Eigenschaftsnamen an die Code-E-Mail an den Code etheridgmil.com Alter, sagen wir 25. Speichern Sie die Änderungen und lassen Sie uns diese eingebettete s-Datei ausführen. Node also, bettet ein und drücke Enter. C, wir erhalten einen neuen Beitrag mit einem Benutzerobjekt, das Name, E-Mail und Alter enthält Und wenn wir auch unsere Datenbank unten überprüfen, erhalten wir einen Beitrag mit Benutzerobjekt. In der Referenz übergeben wir also einfach Objekt-ID und fügen einen Verweis auf eine andere Sammlung hinzu. Beim eingebetteten Ansatz fügen wir jedoch direkt ganze Benutzerdaten in das einzelne Dokument ein. Jetzt habe ich eine Frage. Was ist, wenn wir dieses Namensfeld als Pflichtfeld angeben und dann den Namen nicht in das Objekt des Benutzers übergeben? Wird unser Beitrag erstellt oder nicht? Das ist kein Teil der Lektion, die ich wirklich sehen möchte. Lass uns das essen. Hier an der Stelle von Name zu Zeichenfolge fügen wir Objekt, Typ zur Zeichenfolge und required zu true hinzu. Lassen Sie uns nun unten dieses Namensfeld entfernen und diesen Inhalt in Trial Error ändern . Speichern Sie die Änderungen und schauen Sie sich das an. Oh, wir erhalten einen Validierungsfehler, was bedeutet, dass kein neuer Beitrag erstellt wurde, und wir können das auch in unserer Datenbank überprüfen. Stellen Sie sich nun vor, wir möchten 20 bis 30 Eigenschaften für Benutzerdaten speichern . Wir können nicht all diese Füllungen in jedem Post-Dokument hinzufügen. A: Angenommen, wir möchten Benutzerdaten wie E-Mail und Passwort abrufen , wie können wir diese Daten dann separat abrufen, ohne alle Beiträge Diese eingebettete Methode ist für Anwendungen in sozialen Medien nicht wirklich praktikabel Aus diesem Grund verwenden Entwickler hybriden Ansatz, um die Anwendung ausgewogen zu gestalten. In der nächsten Lektion werden wir den hybriden Ansatz implementieren. 87. Hybridansatz anwenden: Lassen Sie uns den hybriden Ansatz in derselben Codevorlage implementieren . Ich füge den gleichen Code erneut in die hybride Punkt-JS-Datei ein. Sie können es auch unten in dieser Lektion herunterladen. Beim eingebetteten Ansatz haben wir jetzt das Eigentum aller Benutzer in einer einzigen Sammlung hinzugefügt und wir erstellen nicht einmal eine Benutzersammlung. Beim hybriden Ansatz erstellen wir jetzt eine Benutzersammlung, erstellen wir jetzt eine Benutzersammlung in der wir alle Eigenschaften hinzufügen können. Aber was wir im Benutzerfeld der Beitragssammlung hinzufügen werden , weil dieses Beitragsdokument Benutzerdaten benötigt , die diesen Beitrag erstellt haben. Anstatt also das Eigentum aller Benutzer hier zu übergeben, fügen wir nur wenige Eigenschaften hinzu, die wir mit dem Beitrag benötigt haben. Bei Post möchten wir zum Beispiel den Benutzernamen und die E-Mail-Adresse dieses Benutzers anzeigen. Wir wollen das nicht, also fügen wir einen Namen hinzu , der eine Zeichenfolge sein kann, und wir möchten das Profilbild dieses Benutzers anzeigen, das eine Zeichenfolge oder eine URL des Profilbilds sein kann Wir fügen also nur die für den Benutzer erforderlichen Felder ein. Nicht das ganze Dokument. Nun, das wird einwandfrei funktionieren. Aber was ist, wenn wir vielleicht in einigen Fällen mehr Informationen über den Benutzer mit dem Beitrag wünschen. Einige Entwickler halten sich auch an den Benutzer Rf , der die Benutzerreferenz ist. Es ist dieselbe Referenz, die wir in der vorherigen Referenzstunde hinzugefügt haben . Wir sagten, es ist Typ nach Mongos Punktschema Punkttypen Punkt Objekt-ID Was wir hier hinzufügen, bezieht sich ja auf den Benutzer. Außerdem können wir diesen Feldnamen in Benutzerzusammenfassung ändern. Ich denke, das ist viel besser. Lassen Sie uns nun ein wenig an der Funktion zum Erstellen von Beiträgen ändern . Hier fügen wir dem Parameter eine Benutzer-ID hinzu und in diesem Beitrag ändern wir dieses Benutzerfeld in Benutzerzusammenfassung. Danach verwendet eine andere Eigenschaft einen Verweis auf diese Benutzer-ID. Unten nennen wir diese Funktion zum Erstellen von Beiträgen. Hier können wir den Inhalt ändern. Dies ist eine hybride Methode, bei der Sie Ihren Objektnamen an Codes und Ihr Profilbild an das JPG-Profil mit dem Punkt übergeben . Für die Benutzer-ID kopiere ich die ID aus der Datenbank. Und füge die ID hier ein. Speichern Sie die Änderungen und schauen Sie sich das an. Siehst du, hier bekommen wir einen neuen Beitrag mit Benutzerübersicht und Benutzervertreter. Wir bekommen beide hier hin Wenn Sie schnell Daten anzeigen möchten , ohne mehrere Abfragen aufrufen zu müssen, dann verwenden wir diese Benutzerzusammenfassung und wenn wir mehr Benutzerdaten wünschen, verwenden wir nur dann diese Benutzerreferenz. Auf diese Weise können wir die Leistung optimieren und erhalten auch die gewünschten Daten. Verwenden Sie, was für Ihre Anwendung am besten funktioniert. Am Ende gehört das nicht dir. 88. Indizes in MongoDB: Lassen Sie uns nun über Indizes in Mongo DB sprechen. Indizes sind ein sehr interessantes und wichtiges Thema von Index wird verwendet, um unsere Datenbankabfrage zu beschleunigen, und wir werden auch die Demo dazu sehen Sogar Mongo DB sagt , dass unsere Datenbank-Suchabfrage mit Indizes unsere Datenbank-Suchabfrage Tenex schneller als zuvor ausführen kann, was wirklich fortschrittlich und cool ist Jetzt fragst du dich vielleicht, wie der Index unsere Suchabfrage schneller macht Lassen Sie mich Ihnen das anhand des Beispiels erklären. Stellen Sie sich vor, wir haben hier eine Liste Hundert Benutzerdaten und wir möchten einen Benutzer finden , dessen E-Mail-Adresse y123 atgmil.com lautet Nun, wie eine echte Abfrage funktioniert, nehme ich ein Dokumentobjekt und überprüfe seine E-Mail, ob er 123 aterra gmail.com hat oder Ist dies nicht der Fall, wechselt es zu einem anderen Dokumentobjekt und überprüft erneut Dieser Vorgang wird fortgesetzt, bis alle Dokumente von hundert Benutzern gescannt sind. Wie Sie sehen können, ist das etwas langsam. Was ist hier die Lösung? Wir werden einen Index für unsere mit Sammlungen gefüllte E-Mail erstellen. Indem wir einfach den Index für ausgefüllte E-Mails erstellen, wird unsere Suchabfrage für E-Mails schneller. Lassen Sie uns das praktisch sehen. In unserer Benutzersammlung haben wir derzeit nur einen Benutzer. Lassen Sie uns einige gefälschte Benutzerdaten zu unserer Sammlung hinzufügen. So können wir praktisch sehen dass unsere Abfrage besser funktioniert oder nicht. Dazu habe ich im Ordner Resources Section 8 eine Datei hinzugefügt, Index Dot JS testet. Einfach in dieser Datei in unserem Projekt. Und in dieser Datei habe ich fast den gleichen Code wie zuvor hinzugefügt. Zuerst, Mogadbi-Sammlung, hier müssen Sie Ihren Datenbanknamen schreiben , den Sie für diesen Abschnitt verwenden Als Nächstes erstellen wir das Benutzerschema mit Name, E-Mail und Passwort, damit wir uns auf unsere Abfrage konzentrieren können Dann haben wir unten Funktionen. Die erste besteht darin, zufällige Daten in die Sammlung des Benutzers einzufügen . Siehst du, mit dieser einfachen For-Schleife und diesem Faker-Paket können wir einen zufälligen Benutzernamen, eine E-Mail-Adresse und ein Passwort zum Testen generieren eine E-Mail-Adresse und ein Passwort zum Testen Dafür müssen wir in unserem Projekt NPM install auf dem Red Faker Js Faker durchführen, und zwar mit der Rate 0,0 Und drücken Sie die Eingabetaste. Gut. Rufen wir nun einfach diese Funktion auf, um 100.000 Benutzerdaten zu generieren , da wir diese Schleife hier 100.000 Mal ausführen. Und hier wollen wir nicht, dass beim Hinzufügen der E-Mail ein Fehler auftritt Deshalb entferne ich den eindeutigen Wert fill to true aus unserem Schema, nur um 100.000 Benutzern die Eingabe zu ermöglichen. außerdem diese Benutzersammlung aus Ihrer Datenbank, Entfernen Sie außerdem diese Benutzersammlung aus Ihrer Datenbank, damit wir alle neuen Daten erhalten. Löschen Sie die Sammlung und geben Sie hier Benutzer ein und löschen Sie die Sammlung. In unserer iExis-Testdatei nennen wir hier die Funktion „ Testbenutzer einfügen Speichern Sie das und lassen Sie uns diese Datei einfach ausführen. Testen Sie den Knoten in Axis Dot Js und drücken Sie die Eingabetaste. Es wird wenig Zeit in Anspruch nehmen und hier sehen Sie, dass wir eine Erfolgsmeldung erhalten. Wenn wir unsere Datenbank überprüfen, die Sammlung aktualisieren, S in der Sammlung des Benutzers, erhalten wir 100.000 Benutzerdaten. Wunderbar. Jetzt kommentieren wir zuerst diesen Teil dieser Datenfunktion aus Wir wollen es nicht mehr ausführen. Lassen Sie uns nun sehen, welcher Benutzer per E-Mail gefunden wird und wie viel Zeit es in Anspruch nimmt. Unten haben wir eine Funktion namens Find User. In dieser Funktion deklariere ich zuerst die Zeit. Danach führen wir Abfrage user dot Fine aus, in der wir die E-Mail an den E-Mail-Parameter übergeben. Nach Abschluss dieser Abfrage deklarieren wir erneut den Timer, der die Endzeit ist, und hier zeigen wir einfach die Endzeit minus die Startzeit an. Auf diese Weise erfahren wir, wie viel Zeit diese feine Abfrage benötigt. Außerdem ist Performance Dot jetzt präziser und zuverlässiger bei der Messung der Ausführungszeit. Nennen wir das nun eine gute Benutzerfunktion. dann aus der Sammlung unserer Benutzer Lassen Sie uns dann aus der Sammlung unserer Benutzer eine beliebige E-Mail kopieren und diese E-Mail in unserer Fine-User-Funktion mit Codes weiterleiten . Speichern Sie dies und im Terminal beenden wir den Code und führen erneut unseren Tasting Index Dot JsFle Siehst du, hier haben wir 130 Millisekunden Zeit. Lassen Sie uns nun einen Index für das Ausfüllen unserer E-Mails erstellen und probieren, wie schnell unsere Anfrage Index zu erstellen, fügen wir hier, bevor wir eine Sammlung erstellen , den User/Schema-Punktindex hinzu und darin übergeben wir die Objekt-E-Mail, also den vollständigen Namen, wir als Index markieren möchten, und als Wert können wir zwei Dinge übergeben, eins und minus eins Jetzt fragst du dich vielleicht, was ist die Bedeutung von eins und minus Es ist wirklich einfach. Eins ist für aufsteigende Reihenfolge und minus eins für absteigende Reihenfolge Wenn wir einen Index erstellen, Mongo DB diese Fülldaten in aufsteigender oder absteigender Reihenfolge aufgenommen Fülldaten in aufsteigender oder absteigender Reihenfolge Dies wird Mongo Deb helfen, Daten schnell zu finden. Keine Sorge, das erkläre ich dir nach der Verkostung. Hier übergeben wir einen in aufsteigender Reihenfolge und fertig. So erstellen wir einen Index für gefüllte E-Mails, eine Codezeile gesamte andere Code in dieser Datei dient zur Verkostung, mach dir darüber keine Sorgen. Wir wollen beim Erstellen des Index nur sehen , unsere Abfrage schnell wird oder nicht. Also hier führen wir wieder dieselbe Benutzersuchfunktion aus und lassen uns diese Datei ausführen. Siehst du, hier haben wir 133 Millisekunden. Lassen Sie mich diese Datei noch einmal ausführen. Siehst du, jetzt dauert es nur 76 Millisekunden. Ich habe so viel Zeit , weil in meinem System derzeit viele große Softwares Bisher, wenn ich das ohne jegliche Software probiere, dauerte es 60 Millisekunden, bis der Index hinzugefügt wurde, und nach dem Hinzufügen des Index dauerte es nur vier es nur Ist fast 15 ngs schneller als ohne Indexabfrage. Das ist wirklich interessant. Außerdem erhalten wir die Abfragezeit in Millisekunden, da unsere Anwendung derzeit lokal ausgeführt wird und auch unsere Datenbank lokal Wenn wir beide Dinge im Internet bereitstellen, können aus den 130 Millisekunden 1,3 Sekunden mit Index werden. Wir führen dieselbe Abfrage in 0,7 Sekunden Wir führen Stellen Sie sich vor, wie schnell unsere Website wird. Deshalb ist die Indexierung Lassen Sie mich Ihnen den Index zeigen , den wir erstellt haben. Öffnen Sie den Mongo Divi-Kompass, wir gehen zu den Indizes Siehst du, hier haben wir zwei Indizes. Der erste ist für die Unterstrich-ID und der zweite für E-Mail In der Sammlung Mongo Di B erstellt Mongo DB also immer einen Index für die hinterlegte Unterstrich-ID Aus diesem Grund erhalten wir diese Ergebnisse schnell, wenn wir Daten anhand ihrer ID suchen erhalten Jetzt haben wir hier unten eine weitere Funktion namens In dieser Funktion erstellen wir zuerst Index manuell mit dieser Zeile und dann schreiben wir eine gute Abfrage. Am Ende der Abfrage verwende ich diese erklärte Methode. Die Methode explain hilft Ihnen zu analysieren, wie Mongo DB eine Abfrage ausführt Es zeigt, ob Mongo DB einen Index verwendet oder einen vollständigen Sammlungsscan durchführt In dieser Erklärung übergeben wir die Ausführungsstatistiken der Zeichenfolge und protokollieren diese Benutzer einfach Mal sehen, was wir darin haben. Hier an der Stelle der feinen Benutzerfunktion fügen wir die B-Index-Funktion und lassen mich diese einfach nach unten verschieben. Die Änderungen und schauen Sie sich das an. Lassen Sie uns diese Anwendung mit Node, Tasting Indexes Dot JS ausführen Tasting Indexes Dot JS Hier finden Sie alle Details zur Abfrage wie Ausführungsstatistiken, Befehle, Serverinformationen und vieles mehr Hier müssen wir nur die Ausführungsstatistiken sehen. Hier können wir eins sehen und zu einem zurückkehren, was bedeutet, dass ein Datensatz von der Abfrage zurückgegeben wird , wenn wir die Gesamtzahl der untersuchten Dokumente sehen, was auch eins ist, wenn wir hier keinen Index für das E-Mail-Feld erstellen, dann wird die Gesamtzahl der untersuchten Dokumente dann wird die Gesamtzahl der untersuchten Dokumente viel höher sein Lassen Sie mich das auch zeigen. Hier haben wir ohne Indexfunktion. Zuerst entferne ich in dieser Funktion den gesamten Index aus unserer Benutzersammlung, und dann führen wir dieselbe Abfrage mit der erläuterten Methode aus. Sie sich in unserer echten Node-Anwendung keine Sorgen, wir werden nur die UserSchema-Punktindex-Methode verwenden , wenn wir das Schema der Sammlung definieren Ich habe diese beiden Methoden hinzugefügt, um den Index mithilfe der Funktion einfach zu entfernen und hinzuzufügen Lassen Sie uns das jetzt ohne Indexfunktion aufrufen und hier dieselbe E-Mail übergeben. Führen Sie jetzt erneut diese Datei aus, Node Testing Indexes Dot JS Sehen Sie hier in den Ausführungsstatus, wir bekommen die Zahl wieder auf eins und die Gesamtzahl der untersuchten Dokumente auf 100.000 Deshalb dauert es länger als beim Index. Bisher haben wir bei der Überprüfung mit dem Index Gesamtzahl der untersuchten Dokumente auf eins reduziert Aus diesem Grund wird unsere Abfrage durch die Erstellung eines Index schnell. Jetzt fragen Sie sich vielleicht, wie unsere Abfrage durch Indizes so viel schneller wird Was passiert hier? Das werden wir in der nächsten Lektion sehen. 89. Funktionsweise von Indizes in MongoDB: Also vorher hatten wir ein Problem. unserer Datenbankabfrage werden alle hunderttausend Dokumente Bei unserer Datenbankabfrage werden alle hunderttausend Dokumente nacheinander durchsucht, um bestimmte E-Mails zu finden , was unsere Abfrage verlangsamt. Und wir lösen dieses Problem, indem wir einfach Index für ausgefüllte E-Mails anwenden. Aber die Hauptfrage ist wie? Was passiert hinter den Kulissen, wenn wir den Index anwenden? Lassen Sie mich Ihnen das anhand eines interessanten Beispiels erklären. Stellen Sie sich vor, Sie befinden sich in einer Bibliothek mit 100.000 Büchern. Jetzt müssen Sie ein Buch mit dem Titel Harry Potter finden. Wenn die Bücher nun nicht in beliebiger Reihenfolge angeordnet sind, müssen Sie mit dem ersten Buch beginnen, jeden Titel einzeln überprüfen und diesen Vorgang fortsetzen, bis Sie das Harry-Potter-Buch gefunden haben. Das ist wie das Scannen aller 100.000 Dokumente in Mongo Di B ohne Index, was wir als langsam betrachten können Nehmen wir nun an, die Bibliothek erstellt einen Index, so etwas wie die Liste zum Speichern der Buchinformationen dieser Liste, oder wir können sagen, in diesem Index haben wir Buchtitel, die wir alphabetisch sortiert haben, und wir fügen auch einen Zeiger hinzu, der auf das genaue Selbst oder den Ort verweist, an dem sich das Buch befindet Wenn Sie jetzt nach Harry Potter suchen, gehen Sie zum Index und finden Harry Potter in Sekundenschnelle, finden Harry Potter in weil er alphabetisch sortiert ist, und dann fügen wir zusammen mit dem Buchtitel den Sie verwenden diesen Zeiger, um direkt zum Buch zu gelangen. Anstatt 100.000 Bücher zu scannen, finden Sie Ihr Buch in nur einer Millisekunde Wenn wir in Mongo DB einen Index erstellen, erstellt Mongo Di B außerdem eine baumartige Struktur, die wir als B-Baum oder Balanced Tree bezeichnen, und kürzen unsere Daten in aufsteigender oder und kürzen unsere Daten in absteigender Reihenfolge, je nachdem, ob wir den Wert als eins oder minus eins übergeben Mit dieser Füllung wird ein Zeiger gespeichert, der den ursprünglichen Speicherort des Dokuments angibt Durch die Erstellung eines Indexes reduzieren wir die Anzahl der gescannten Dokumente. Aus diesem lautet unsere Feinabfrage f für diese Füllung. Jetzt fragen Sie vielleicht nach den gekürzten Daten, außerdem müssen wir unsere Daten finden, weshalb das weniger Zeit in Anspruch nimmt, als alle Dokumente einzeln zu überprüfen Das ist die wirklich gute Frage. Lass mich dir das erklären. Die Sache ist die, nehmen wir an, wenn Sie in beiden ein unsortiertes Array und ein kurzgeschnittenes Array haben , möchten Sie Element 60 finden Dann müssen wir im Array mit beiden nicht jede Zahl scannen, wie kann dieses sortierte Array weniger Zeit in Anspruch nehmen? Wie wir bereits gesehen haben, , erstellt Mongo B bei der Indexerstellung eine Batterie - oder Bilanzbaumstruktur wobei an jeden Daten ein Zeiger angebracht ist Aber in dieser Batterie muss Mongo Dib auch nach Daten suchen, und für die Suche nach den Daten verwendet Mongoi eine andere Suchtechnik, verwendet Mongoi eine andere Suchtechnik, die wir als binäre Suche bezeichnet haben Wenn wir also keinen Index erstellen, verwendet Mongo Db die lineare Suchtechnik, was bedeutet, dass Mongo Db die Daten nacheinander für alle Dokumente überprüft Daten nacheinander für alle Dokumente Und wenn wir einen Index erstellen, verwendet Mongo Dib Lassen Sie mich Ihnen schnell erklären, wie binäre Suche funktioniert, damit Sie es besser verstehen Stellen Sie sich vor, wir haben ein Feld mit den Zahlen zehn, 20, 30, 200 gekürzt Zahlen zehn, 20, 30, 200 In diesem Array wollen wir 60 finden. Jetzt gibt es zwei Möglichkeiten. Zuerst überprüfen wir, ob zehn 60 ist, nein, 20 nein. 30, nein. 40, nein. 50, nein. 60, ja. Hier suchen wir also alle Elemente nacheinander, was das Beispiel der linearen Suche ist. Lassen Sie mich nun erklären , was binäre Suche ist. Bei der binären Suche ruckeln wir bei der Hälfte. Hier, wo zehn, 20, 30 geprüft werden, springen wir also direkt zur Hälfte der Liste, die 50 ist Hier überprüfen wir, ob 50 größer als 60 oder weniger als 60 ist. Ja, 50 ist weniger als 60, also gehen wir zur rechten Seite der Liste. Jetzt ist unsere Liste 50 bis hundert. Dabei springen wir wieder auf die Hälfte. Sag mir, auf welchen Gegenstand wir springen werden. Richtig, wir springen auf 80. Dabei überprüfen wir erneut, ob 60 größer als 80 oder weniger als ist. Es ist weniger als. Wenn unsere Zahl also kleiner als ist, bewegen wir uns auf die linke Seite. Jetzt 50-70, wir springen wieder auf die Hälfte, die 60 ist, und wir bekommen das Element An der Stelle von 60 von sechs Atomen bei linearer Suche erhalten wir hier 60 drei bis vier Atomen. Das ist wirklich schnell. Was sagst du? Und das sind nur zehn Daten. Stellen Sie sich vor, wir haben 1 Million Daten, dann, wie viel Zeit wir mit dem Index sparen können. Aus diesem Grund macht der Index unsere Suche effizienter und benötigt weniger Zeit als die lineare Suche. Beachten Sie auch, dass die binäre Suche nur bei sortierten Arrays funktioniert Deshalb geben wir bei der Erstellung eines Indexes an, ob es sich um ein aufsteigendes oder ein absteigendes Array handeln soll , eins oder minus Jetzt verstehst du richtig, was Index ist und warum er wirklich schnell funktioniert Bedeutet das, dass wir für jedes Feld in unserer Datenbank einen Index erstellen müssen ? Die Antwort lautet nein. Wir müssen einen Index nur für die Füllungen erstellen , nach denen wir suchen möchten. Angenommen, wir haben Benutzerdaten und möchten Benutzer nach Namen suchen. Darin können wir einen Index mit gefülltem Namen erstellen. Mongotbcmmand, verwende den Index also nur für große Sammlungen, in denen wir Tausende oder Millionen von Daten speichern werden Tausende oder Millionen von Daten speichern Sie fragen sich vielleicht, warum wir keinen Index für eine kleine Sammlung oder für jedes Feld erstellen können Index für eine kleine Sammlung oder für jedes Feld Der Grund dafür ist, dass Mongotb beim Erstellen eines Index, wie wir wissen, die Btree-Struktur erstellt, aber Bitr wird auch in unserer Datenbank gespeichert, und Lass es mich dir zeigen. Öffnen Sie den Mongoib-Kompass und gehen Sie zu unserer Datenbank Siehst du, hier bekommen wir die Benutzersammlung. Hier ist die Speichergröße unserer Sammlung, die 6,65 B auf der rechten Seite beträgt, C, wir haben die Gesamtgröße der Indizes auf 3,86 B, was bedeutet, dass unsere Daten nur drei MB groß sind und andere 3,86 B nur Mehr als 50% werden also durch Indizes erfasst, was wirklich riesig ist, was wirklich riesig ist, und Wenn wir einen Index für alle Felder erstellen, wie viel Speicherplatz wird das dann beanspruchen? Wenn wir kleine Sammlungen haben, läuft unsere lineare Suche auch schnell. Der Unterschied ist ignorierbar und deshalb erstellen wir keinen Index für kleine Sammlungen Wenn wir zuerst einen Index anwenden müssen, hilft die Indizierung, , wenn wir große Sammlungen haben Datensätze wie Millionen von Datensätzen zu verwenden Ohne Index überprüft Mongo Di B jedes Dokument einzeln Zweitens, wenn häufig gesucht wird. Wenn wir häufig nach einer Eingabe wie E-Mail, Benutzername oder Bestell-ID suchen, können wir sie indexieren. Zum Beispiel im Benutzerprotokollierungssystem , in dem wir Benutzer per E-Mail suchen. Dies erhöht die Lesegeschwindigkeit erheblich. Als nächstes drittens, wenn Kurzschlüsse üblich sind. Wenn wir häufig Short Method by Price verwenden, können wir diesen gefüllten Preis indexieren Zum Beispiel in der E-Commerce-Produktliste. Die Uhrzeit, zu der wir Produkte nach Preis oder Datum sortieren möchten. Index: Vollständige Erfassung vermeiden, scannen. Nummer vier, wenn wir die Methoden Fillin, Find, Update und Delete verwenden . Der Index beschleunigt diese Operationen. Lassen Sie uns nun auch sehen, wann wir den Index nicht anwenden müssen. Nummer eins, wenn unsere Sammlung klein ist. Wenn wir nur ein paar hundert Dokumente haben, ist die Suche ohne Index bereits schnell. Nummer zwei: Unsere Daten ändern sich ständig. Indexes verlangsamt die Methode, fügt sie ein, aktualisiert und löscht sie, weil Mongo Di B den Indexbaum jedes Mal aktualisieren muss den Indexbaum jedes Mal aktualisieren muss Zum Beispiel ein Protokollsystem. Dabei werden jede Sekunde neue Protokolle hinzugefügt, und das wird langsamer, wenn wir einen Index für die Protokollierung erstellen. Drittens: Wenn wir bereits zu viele Indizes haben, belegt jeder Index Speicherplatz Zu viele Indizes entsprechen verfügbarem Festplattenspeicher Die Lösung besteht also darin, nur die wichtigsten Füllungen zu indexieren. Viertens, wenn wir viele verschiedene Füllungen abfragen, sollten wir den Index vermeiden Wenn also unsere Suchanfragen in Bezug auf Füllungen wie Name, E-Mail, Alter, Stadt und Indexierung stark variieren , hilft möglicherweise nicht jede einzelne Die Lösung besteht also darin, nur häufig verwendete Füllungen zu indexieren. Um es kurz zusammenzufassen: Wir erstellen einen Index in Mongodi B, wenn wir eine große Sammlung haben Wir wollen unsere Abfrage wirklich schnell machen. Keine Sorge, wir werden diese Indizes in unserem Projekt anwenden , wenn wir sie benötigen Im nächsten Abschnitt beginnen wir nun mit dem Aufbau unseres zweiten Projekts, dem Backend für E-Commerce-Anwendungen 90. Abschnitt 09 - Projekt 02 und Planung: Es ist Zeit, unser zweites Projekt zu erstellen. In diesem Projekt werden wir die E-Commerce-Anwendung Ben erstellen. Wir werden kein Frontend erstellen , da dies nicht Teil dieses Kurses ist. Dafür habe ich einen separaten Reac-JS-Kurs. Wenn ich jetzt ein neues Projekt starte, plane ich das Projekt gerne grob Das gibt mir Klarheit, und ich empfehle Ihnen auch, dasselbe zu tun. Zuallererst müssen wir also das grundlegende Frontend visualisieren, nicht das perfekte Design, sondern nur das Visualisieren. Zum Beispiel erstellen wir hier eine E-Commerce-Anwendung. Auf dieser Website kann der Benutzer ein Konto erstellen oder sich auf der Website anmelden. Danach können sie die Produktliste sehen und wenn sie auf dieses Produkt klicken, können sie alle Details zu diesem Produkt, weitere Bilder und eine Beschreibung sehen . Es spielt keine Rolle, ob der Benutzer angemeldet ist oder nicht. Alle Benutzer können Produkte sehen. Danach kann der Benutzer seine Bestellhistorie einsehen. Außerdem können sie Produkte zur Karte hinzufügen, Produkte von der Karte entfernen und die Bestellung per Zahlung aufgeben. Das sind also die Funktionen, die wir für unser Projekt benötigen. Machen Sie sich keine Sorgen, wenn Sie nicht alle Funktionen Ihres Projekts kennen Wie ich Ihnen gesagt habe, das ist nur geplant. In Zukunft können wir Funktionen zu unserer Anwendung hinzufügen oder daraus entfernen. Zunächst werden wir mit der Erstellung des Benutzermodells beginnen und eine API für die Benutzerauthentifizierung erstellen. Danach werden wir zu Produkten, dann zu Karten und dann zu Bestellungen übergehen . Sie werden das lieben und auch das Selbstvertrauen bekommen , keine eigenen Projekte zu erstellen. Lass uns dieses tolle Projekt starten. 91. Erstellen eines neuen Servers: nun in unserem Projektordner Lassen Sie uns nun in unserem Projektordner einen neuen Ordner für unser zweites E-Commerce-Projekt namens cart Wish Backend erstellen unser zweites E-Commerce-Projekt namens und dieses Projekt einfach im VS-Code öffnen Gut. Was sollten wir jetzt tun, wenn wir ein neues Projekt erstellen? Richtig. Wir werden das Projekt mit NPM int Y initialisieren. Dadurch wird ein Paket mit Punkten und einer Datei erstellt Jetzt erstellen wir hier eine neue Datei namens index dot js. Lassen Sie uns einen Express-Server für diese Anwendung erstellen. Const Express entspricht dem erforderlichen Express-Paket. Danach erstellen wir die Express-App, Const-App entspricht, und wir nennen diese Express-Funktion hier Lassen Sie uns nun diesen Server abhören, also App Punkt LISN hier, zuerst übergeben wir den Port, aber an der Stelle, an der der hartcodierte Wert übergeben wird, erstellen wir hier die Variable const port, die dem Prozess Punkt nv Punkt Port oder 3.000 entspricht dem Prozess Punkt nv Punkt Port Wenn wir also einen Port in der Umgebung haben, wird er den anderen Port verwenden, wir haben 3.000, und wir übergeben hier einfach zuerst den Port Und was wir beim zweiten Parameter übergeben, übergeben wir hier die Callback-Funktion und einfach das Consol Dot Der Server überwacht den Port, die Dollar-Ci-Pakete und Lassen Sie uns nun diese Anwendung ausführen und überprüfen, ob wir das richtig gemacht haben oder nicht. Warum denke ich, dass wir hier einen Fehler bekommen könnten? Mal sehen, Fehler im Leben von Entwicklern sind konstant. Hab keine Angst davor. Öffne das Terminal und führe hier nodebn index dot js aus. Siehst du, hier bekommen wir einen Fehler. Oh, wir haben vergessen, das Express-Paket zu installieren. Also NPM installiert Express. Und wenn Sie dieselbe Version wie meine verwenden möchten, schreiben Sie mit der Rate 5.1 0.0 und drücken Sie die Eingabetaste Gut. Versuchen wir es jetzt noch einmal. Siehst du, hier hören wir den Server ab. In der nächsten Lektion werden wir diese Anwendung mit der Datenbank verbinden . 92. Verbindung zur Datenbank herstellen: Lassen Sie uns diese Anwendung mit einer Datenbank verbinden , da wir Informationen über Benutzer, Produkte usw. speichern müssen . Zuallererst müssen wir in unserem Projekt Mangos installieren Wir werden den gleichen Fehler nicht wiederholen. Öffnen Sie das Terminal und erstellen Sie von hier aus ein neues Terminal. Auf diese Weise müssen wir unsere Anwendung nicht beenden. Also installiert NPM Mongoose auf dem roten 8.13 0.2. Gut. Lassen Sie uns das minimieren. Jetzt importieren wir in unserer Indexpunktdatei Const Mangos, was Require Mangos entspricht. Und nach dieser App schreiben wir Mongos schreiben wir Mongos Beim ersten Argument übergeben wir unsere Verbindungszeichenfolge Wenn Sie sich nicht an die Verbindungszeichenfolge von Mongo Di B erinnern , können Sie sie vom Mongo DB Compass abrufen Hier in der Seitenleiste haben wir diese lokale Host-Verbindung, und auf der rechten Seite haben wir die Option mit drei Punkten Hier erhalten wir Copy Connection String. Und füge es an der ersten Position ein. Jetzt fügen wir am Ende dieser Verbindungszeichenfolge unseren Datenbanknamen hinzu , der Card fish lautet. Nun, wie wir wissen, gibt dieser Ausdruck ein Versprechen zurück. Also verwenden wir hier die Punkt-TN-Methode und darin einfach das Konsolen-Dotlog. MongoDB hat erfolgreich eine Verbindung hergestellt. Jetzt, nach der Methode, fügen wir auch die Dot-Cache-Methode zur Behandlung von Fehlern Hier erhalten wir das Fehlerobjekt, die Fehlerfunktion und das Gonsol-Punktprotokoll, MongoDB-Verbindung, fehlgeschlagen, und drucken dieses Fehlerobjekt Lassen Sie uns nun diese Implementierung testen, die Änderungen speichern und im Terminal sehen wir, hier wird Mongo DB In der nächsten Lektion werden wir unser Benutzermodell entwerfen. 93. Übung - Erstellen eines Benutzermodells: Lassen Sie mich Ihnen ein wenig Übung geben , denn das haben wir bereits getan. Sie müssen also ein Benutzermodell für dieses Projekt erstellen. Sie müssen entscheiden, welche Benutzer wir für dieses Projekt benötigen. Machen Sie sich keine Sorgen, ob Sie mehr oder weniger Füllungen hinzufügen, aber das Wichtigste ist, dass Sie über Füllungen nachdenken. Denken Sie also daran, welche Funktionen sich auf Benutzer beziehen, und entscheiden Sie entsprechend über die Füllung durch den Benutzer. Definieren Sie ein Schema für diese Füllungen und erstellen Sie dann ein Modell mit diesem Schema. Nach Abschluss dieser Übung können Sie sich die Lösung ansehen. Sehen wir uns nun die Lösung an. Zuallererst werden wir hier einen neuen Ordner namens Models erstellen . Und in diesem Ordner werden wir eine neue Datei namens users dot js erstellen. Gut. Hier importieren wir zunächst Const Mongos, was den benötigten Mangos entspricht Denn wie können wir ohne Mangos ein Schema oder ein Modell erstellen? Das Cost-Benutzerschema entspricht dem neuen Mango-Punktschema. In den Cali-Klammern übergeben wir unser Schema als Schlüssel-Wert-Paar Zuallererst setzen wir den Namen auf Objekt, wir setzen seinen Typ auf Zeichenfolge, erforderlich zum Zeichnen, und wir setzen die mittlere Länge auf drei Danach können wir das E-Mail-Feld setzen und seinen Typ auf string setzen, ebenfalls required auf true. Außerdem müssen wir unique auf true setzen, da alle Benutzer nur eine eindeutige E-Mail haben sollten Als Best Practice fügen wir außerdem den Wert true in Kleinbuchstaben hinzu Danach, welches Feld wir hinzufügen können, ja, wir können Passwort, Typ zur Zeichenfolge hinzufügen , und außerdem müssen wir required auf true Danach benötigen wir für E-Commerce-Nutzer die Lieferadresse, um das Produkt zu liefern. Geben Sie also die Zeichenfolge ein , die auf true gesetzt ist, und außerdem setzen wir die mittlere Länge auf fünf. Danach können wir die Rolle für jeden Benutzer angeben, unabhängig davon, ob er Benutzer oder Administrator ist. Also setzen wir den Typ auf Zeichenfolge. Wir können das Rollenfeld auf zwei Optionen einschränken , indem wir die Enum-Eigenschaft für das Array verwenden Hier übergeben wir unsere Werte user oder admin. Außerdem können wir den Standardwert auf user setzen. Wenn wir die Rolle in admin ändern wollen, müssen wir auf die Datenbank zugreifen. Standardmäßig ist die Rolle aller Benutzer auf Nur Benutzer festgelegt. Ich denke, das sind so ziemlich alle Felder für das Benutzermodell. Wenn wir in Zukunft mehr Funktionalität benötigen, können wir auch das Schema ändern. Mach dir darüber keine Sorgen. Und wenn du während der Übung unterschiedliche Namen für diese Füllungen verwendest, kannst du sie ändern, genau wie bei mir. Andernfalls könnte es in Zukunft zu Bugs kommen. Jetzt haben wir das Benutzerschema bereit, sodass wir ein Modell mit diesem Schema erstellen können. Const-Benutzer entspricht also dem Punktmodell von Mongos und dem, was wir an erster Stelle übergeben Richtig, wir übergeben den singulären Namen des Modells, das Benutzer Beim zweiten Argument übergeben wir das Benutzerschema Lassen Sie uns auch dieses Benutzermodell exportieren. Wir werden es in der Route des Benutzers benötigen. Das Modul Dot Exports entspricht dem Benutzer. Perfekt. In der nächsten Lektion werden wir nun die erste Route dieses Projekts zum Erstellen eines neuen Benutzers erstellen. 94. Erstellen des neuen Benutzers: Lassen Sie uns nun eine API zum Erstellen eines neuen Benutzers erstellen. Hier erstellen wir einen neuen Ordner namens routes. In diesem Ordner werden wir alle unsere Routen in separaten Dateien erstellen . Erstellen Sie eine neue Datei users dot js. Erinnern Sie sich jetzt, wie wir eine API in einer separaten Datei erstellen können ? Wenn wir eine API in unserer Haupt-Indexpunkt-JS-Datei erstellen müssen, können wir diese App-Variable verwenden. Aber wie können wir eine API in einer separaten Datei erstellen? Richtig, dafür werden wir einen Router erstellen. Also geben wir zuerst ein, dass Express dem erforderlichen Express entspricht. Danach hat dieser Express eine Router-Methode , die wir aufrufen können. Dadurch erhalten wir einen Router. Speichern Sie es unveränderlichen Router. Gut. Lassen Sie uns nun eine API zum Erstellen eines neuen Benutzers erstellen. Welche Methode wir hier verwenden können, get oder put, wir werden die Post-Methode verwenden. Also hat der Router Post bekommen. Hier schreiben wir unseren Endpunkt , der ein Schrägstrich ist, und nach diesem Endpunkt fügen wir eine Callback-Funktion hinzu, die ausgeführt wird, wenn jemand die API mit diesem Endpunkt aufruft Diese Funktion hat zwei Parameter: Anfrage und Antwort und Fehlerfunktion Zuallererst wollen wir in dieser Funktion Werte, die der Benutzer im Hauptteil der Anfrage übergibt. Const-Benutzerdaten entsprechen also dem Hauptteil der Anfrage. Lassen Sie uns diese Benutzerdaten mit Const dot protokollieren. Und danach einfach responsDTSN oder wir können hier Response Dot JSON verwenden , weil wir JSN-Daten senden , also diese Benutzerdaten , Lassen Sie uns nun überprüfen, ob unsere API korrekt definiert ist oder nicht. Ich mache gerne kleine Schritte , weil das keine Verwirrung stiftet. Das funktioniert, dann können wir zur Hauptlogik übergehen. Derzeit definieren wir hier API, aber wir müssen diese Route zu unserer Indexpunkt-JS-Datei hinzufügen. Andernfalls wird es nicht funktionieren. Wir wissen das richtig. Lassen Sie uns diesen Router mit dem Modul exportieren. Punktexporte entsprechen Router. Speichern Sie diese Datei und wechseln Sie zur Index Dot JS-Datei. Hier, nach der Mongo-DV-Verbindung, können wir App Dot U hinzufügen und an der ersten Position fügen wir unser API-Präfix, den Slash-API-Slash-Benutzer hinzu, und an der zweiten Position müssen wir Router übergeben, müssen wir Router übergeben wir aus der Benutzerroute exportieren Oben fügen wir also die Kosten für Benutzerrouten hinzu, die den hier benötigten Zeiträumen entsprechen Hier gehen wir zum Routenordner und darin rotieren Benutzer. Jetzt können wir einfach die Route dieses Benutzers hier übergeben . Das haben wir schon gemacht. Denken Sie daran, und machen Sie sich keine Sorgen wenn Sie sich nicht an die Syntax erinnern, sie ist völlig in Ordnung. Oft habe ich auch die Syntax vergessen. Konzentrieren Sie sich vorerst auf die Erstellung der Anwendung. Speichern Sie die Änderungen und lassen Sie uns diese Benutzer-API testen. Im Tender-Client können wir also unsere bisherigen Aktivitäten sehen, aber ich möchte die Dinge nicht mit dem vorherigen Projekt vermischen, wir gehen zu den Sammlungen und von der rechten Seite haben wir die Option Neue Sammlung und geben ihr einen Namen cartwis Wir werden all unseren API-Geschmack in diese Sammlung aufnehmen. Auf der rechten Seite haben wir mehr Optionen. Klicken Sie auf Neuen Ordner erstellen und geben Sie ihm den Namen Benutzer. In diesem Benutzerordner speichern wir also unseren gesamten API-Geschmack in Bezug auf den Benutzer. Sie können sehen, wie systematisch das aussieht, und wenn wir dieses Projekt in Zukunft besuchen, wir nicht verwirrt. Also erstellen wir eine neue Anfrage und geben ihr einen Namen. Erstellen Sie einen neuen Benutzer. Wählen Sie die Methode aus, die gepostet werden soll, und wir geben unsere API-URL ein, also DTP, Spalte Abo, Schrägstrich, Lokaler Host, Spalte 3.000 oder was auch immer Sie als Port-API-Benutzer verwenden Vergessen Sie nicht, dieses Präfix hinzuzufügen. Um Daten im Hauptteil der Anfrage zu senden, wählen wir Ihren Text aus und übergeben die Daten hier im JSON-Format. Objekt, erster Feldname, stellen Sie sicher, dass wir in doppelten Codes schreiben. Wert für den Code plas Als nächstes haben wir eine E-Mail zum Codieren auf der roten Seite gmail.com danach, welche Füllung wir hinzufügen, Lassen Sie mich danach, welche Füllung wir hinzufügen, das Schema des Benutzers einchecken Ja, wir haben Passwort und Lieferstatus und beide sind erforderlich. Passwort und als Zeichenfolge eins, zwei, drei, 45678 und Lieferadresse , sagen wir XYZ, bei XYZ Stellen Sie sicher, dass wir den gleichen Namen verwenden , den wir im Schema verwendet haben Andernfalls erhalten wir eine Fehlermeldung. Lassen Sie uns nun diese Anfrage senden. Was denkst du? Wird es funktionieren oder nicht? Lass uns sehen. Schicken Sie die Anfrage. Siehst du, hier erhalten wir den Status 200, was okay bedeutet, aber wir erhalten unsere Daten nicht in der Antwort auf diese Anfrage. Schauen wir uns Konsole A an. Siehe auch hier, wir werden undefiniert Kannst du dir vorstellen, warum das wieder passiert? Denken Sie daran, wenn wir Daten aus einer Anfrage des Hauptteils abrufen wollen , müssen wir eine Middleware für die Konvertierung der Daten in jsnfMat verwenden Konvertierung der Daten in Jetzt erinnern Sie sich, dass wir in der js-Datei mit dem Indexpunkt vor dieser Route der js-Datei mit dem Indexpunkt vor dieser Route App Dot UG zum Hinzufügen von Middleware und wir Auf diese Weise erhalten wir Daten aus der Anfrage des Körpers. Schau, ob sich das ändert. Lassen Sie uns die Anfrage erneut senden. Sehen Sie, jetzt erhalten wir die Daten in der Antwort, unsere aktuelle Implementierung funktioniert. Lassen Sie uns diese Daten nun in der Sammlung unseres Benutzers speichern. Bevor wir die Daten in der Sammlung des Benutzers speichern, müssen wir jedoch überprüfen, ob dieser Benutzer bereits in unserer Datenbank vorhanden ist oder nicht. Lassen Sie sich nicht verwirren, sehen Sie sich das an und Ihre Zuteilungen werden gelöscht. Hier benötigen wir ein Benutzermodell für die Ausführung der Abfrage. Cost user is required, hier müssen wir einen Ordner höher gehen, Zeitraum, Schrägstrichmodelle und wir gehen zum Benutzermodell Jetzt, nach diesen Benutzerdaten, können wir so etwas wie diesen Benutzerpunkt Fine machen Hier übergeben wir Objekt für Filter. Hier finden wir den Benutzer anhand seiner eindeutigen E-Mail-Adresse und als Wert geben wir hier die E-Mail-Adresse mit dem Punkt userdata Wir suchen also nach einem Benutzer, dessen E-Mail-Adresse mit dieser Punkt-E-Mail mit Benutzerdaten identisch ist Außerdem ist hier eine Sache. Wenn wir keinen Benutzer haben , dessen E-Mail-Adresse mit dieser Punkt-E-Mail mit den Benutzerdaten übereinstimmt, gibt diese Suchmethode ein leeres Array zurück Also statt dieser Find-Methode können wir hier Find one method verwenden Wenn der Benutzer nicht existiert, gibt diese Find-One-Methode undefined zurück, und das hilft uns beim Schreiben der Bedingung Also werden wir hier die Methode Find one verwenden. Wie wir wissen, wird dieser Ausdruck Promise zurückgeben, also müssen wir hier warten, und um await zu verwenden, müssen wir diese Cavey-Funktion zu einem machen Gut. Lassen Sie uns nun das Ergebnis in der Variablen user speichern. Jetzt können Sie hier einfach eine Bedingung eingeben. Wenn der Benutzer verfügbar ist, geben wir in der Antwort einen Fehler zurück. Also antworte Dodge Status auf 400 für eine schlechte Anfrage und auch in der Antwort will ich Daten senden, also Punkt Json, und hier übergeben wir das Objekt mit der Nachricht user already exists. Jetzt ist hier eine Sache. Wenn der Benutzer bereits verfügbar ist, möchten wir diese grundlegende Logik nicht ausführen. Um das zu tun, müssen wir hier vor dieser Antwort den Punkt Status übergeben . Andernfalls wird der Code vorwärts ausgeführt. Was ist, wenn der Benutzer in der Sammlung des Benutzers nicht verfügbar ist? Richtig, wir werden die Benutzerdaten in der Sammlung speichern. Const new user ist also gleich new user, und hier im Objekt übergeben wir unsere Daten Also Name zu Benutzerdaten Punktname und E-Mail zu Benutzerdatenpunkt Moment, hier müssen wir Benutzerdaten mehrfach schreiben. Stattdessen können wir hier unser Objekt destrukturieren. An der Stelle der Benutzerdaten fügen wir also Object hinzu und übergeben den Namen, fügen wir also Object hinzu und übergeben den wir aus dem Request Dot Body erhalten Dies wird als Destrukturierung von Objekten bezeichnet. Wir haben also Namen, E-Mail, Passwort und letzte Lieferadresse Stellen Sie sicher, dass wir hier den gleichen Namen eingeben, den wir im Hauptteil der Anfrage angeben. Jetzt können wir an die Stelle des Punktnamens der Benutzerdaten nur noch den Namen schreiben Auch wenn der Eigenschaftsname und Name einer Wertvariablen identisch sind, können wir dies entfernen Aber zu Ihrem Verständnis werde ich es nicht entfernen. E-Mail an E-Mail Passwort an Passwort und Lieferadresse an Lieferadresse. Außerdem müssen wir hier die feine Methode ändern , E-Mail zu E-Mail. Jetzt haben wir ein neues Benutzerobjekt, sodass wir es in unserer Datenbank speichern können, neuer Benutzerpunkt c, und das ist die asynchrone Operation Deshalb halten wir an Await fest. Jetzt wird der gespeicherte Benutzer aus der Datenbank zurückgegeben. Wenn wir die gespeicherten Benutzerdaten nicht zurückgeben möchten, können wir auch diese neuen Benutzerdaten verwenden. Keine Sorge, wir erhalten in beiden Objekten eine ID. Am Ende halten wir uns also an den Antwortpunktstatus „Sag mir den Statuscode“, den wir für neue Daten verwenden werden. Richtig, wir verwenden 201 Punkte Json, und hier übergeben wir ein neues Benutzerobjekt. Perfekt. Lassen Sie uns nun diese Implementierung testen. Speichern Sie die Änderungen und lassen Sie uns die Post-Anfrage senden. Siehst du, hier bekommen wir einen neuen Benutzer mit seiner eindeutigen ID. Und wenn wir unsere Datenbank überprüfen, die Datenbank aktualisieren, erhalten wir hier Cardwish Darin finden wir Benutzer, und hier bekommen wir unseren ersten Benutzer Was ist, wenn wir dieselbe Anfrage mit denselben Benutzerinformationen senden? Sehen Sie, hier erhalten wir, dass der Benutzer bereits existiert mit dem Fehler 400 schlechte Anfrage. Perfekt. 95. Hashen des Kennworts aus Sicherheitsgründen: Derzeit speichern wir in unseren Nutzungsdaten das Passwort in einer einfachen Zeichenfolge Aber was ist, wenn jemand Zugriff auf unsere Datenbank erhält, dann kann jeder die tatsächlichen Passwörter des Benutzers sehen. Um dieses Problem zu lösen, können wir das Passwort in einer zufälligen Zeichenfolge haben, wodurch unser Passwort unlesbar Zum Hasen des Passworts verwenden wir eine sehr beliebte Bibliothek namens NPM installiert BCRP. Mach dir darüber keine Sorgen. Es ist wirklich einfach. Wir werden verstehen, wie Passwörter in einer separaten Datei gespeichert werden, und am Ende werden wir es der Route unseres Benutzers hinzufügen Hier erstellen wir eine neue Datei namens Pass Dots. Gut. Jetzt importieren wir zunächst const, Bcrypt entspricht require Bcrpt Jetzt ist Bcrpt besonders stark, weil es SLD hatte. Sie fragen sich vielleicht, was verkauft wird? SALT ist ein zusätzliches zufälliges Datenelement, das einem Passwort hinzugefügt wird, bevor es das Passwort hat. Lassen Sie mich es Ihnen in einfachen Worten erklären. Nehmen wir an, wir haben zwei Benutzer, Benutzer A und Benutzer B, und beide wählen ein Passwort. Sagen wir eins, zwei, drei, vier, fünf. Nehmen wir nun an, unser bRP-Paket hat dieses Passwort, das so aussehen könnte Wenn wir nur eins, zwei, drei, vier, fünf haben, ohne Salz, Benutzer A und Benutzer B haben das Passwort Sieht in der Datenbank genauso aus. Das ist ein Problem, weil gesagt wird, dass beide Benutzer dasselbe Passwort haben. Wenn Hacker ein identisches Passwort sehen, könnten sie vermuten, dass beide Benutzer dasselbe einfache Passwort haben Also brauchen wir SLT, um dieses Problem zu lösen. SALT ist nichts, nur zufällige Daten, die einem Passwort hinzugefügt werden, bevor es gesendet wird. Also vor UserAPassword fügen wir einige zufällige Daten hinzu, sodass das Passwort so aussieht Für das Passwort von Benutzer B fügen wir einige zufällige Daten Das Passwort sieht also so aus. Es ist nicht notwendig, Bcrypt behält dasselbe wie das Passwort. Ich zeige es dir nur zum Verständnis. Lass mich dir das praktisch zeigen. Hier können wir Crypt Dot und diese Funktion bis auf zwei Argumente verwenden Crypt Dot und diese Funktion bis auf zwei Argumente erste ist das ursprüngliche Passwort, das vom Benutzer eingegeben wurde Hier übergeben wir zum Beispiel eins, zwei, drei, vier, fünf und das zweite Argument ist verkauft. Dadurch werden die Kosten für das Hasing kontrolliert. Ein hoher Wert bedeutet mehr Sicherheit, aber langsameres Abhören. Normalerweise gilt ein Wert von zehn als sicher und relativ schnell Nun zum dritten Parameter, sehen Sie, hier müssen wir die Callback-Funktion übergeben, da es sich um eine asynchrone Operation handelt Aber anstatt Callback zu verwenden, können wir hier awight am Anfang verwenden eine Gewichtung zu verwenden, müssen wir diesen Ausdruck mit einer Sync-Funktion schreiben , die als Pass bezeichnet wird Und wir verschieben diese Zeile einfach in diese Funktion. Speichern Sie nun diese unveränderliche Variable namens st pass und protokollieren Sie diesen st-Pass einfach in der Konsole Rufen wir nun dieselbe Funktion zweimal auf, damit wir sehen können , ob das Passwort ähnlich ist oder SALT Öffnen Sie das Terminal und führen Sie einfach node spass dot js aus. Siehst du, hier bekommen wir zwei verschiedene ST-Passwörter. Selbst wenn wir dasselbe Passwort eingeben, eins, zwei, drei, vier, fünf, für eins, ist das die Stärke von SLT Lassen Sie uns diesen Code in die Route unseres Benutzers implementieren. Schneiden Sie diese Zeile von hier aus und fügen Sie sie vor unsere neue Benutzervariable ein. Lassen Sie uns jetzt hier ein paar kleine Änderungen vornehmen. Zuerst ändern wir dieses fest codierte Passwort eins, zwei, drei, 45 mit unserem Passwort, das wir aus dem Anfragetext erhalten. Dadurch wird ein Passwort für diesen Benutzer generiert. An der Stelle, an der das ursprüngliche Passwort gespeichert wurde, speichern wir dieses ST-Passwort. Außerdem müssen wir Bcrt oben importieren. Const Bcrypt entspricht require BCR. Löst die Änderungen ab und sieh sie dir an. In unserer Datenbank haben wir Daten ohne Hasing verwendet. Also können wir diesen Datensatz von hier aus löschen, löschen. Lassen Sie uns nun unsere Anwendung mit Normon Index Dot JS ausführen. Gut. Senden Sie jetzt erneut die Post-Anfrage mit denselben Daten. Siehst du, jetzt haben wir erfolgreich das Passwort und haben es in unserer Datenbank gespeichert. Selbst wenn jemand in unsere Datenbank eingegeben hat, kann er das Passwort nicht so sehen, wie es ist. 96. Überprüfung von Benutzereingaben mit Joi: Derzeit funktioniert unsere Benutzerroute einwandfrei. Der Weg-Benutzer ist bereits registriert oder nicht, und wir verwenden auch das Passwort, aber es gibt eine Regel für die Bend-Entwickler. Wir als Bend-Entwickler vertrauen niemals den vom Kunden gesendeten Daten. Wir müssen diese Daten immer validieren. Nehmen wir an, der Name, Client-Pass, die Eigenschaft des Benutzernamens. Manchmal haben sie auch vergessen, eine E-Mail oder sogar ein Passwort zu senden. Zu diesem Zeitpunkt können wir nicht die Hälfte der Informationen in unserer Datenbank speichern . Jetzt könnten Sie sagen, dass wir die Validierung bereits in unserem Schema eingerichtet haben. Sollten wir eine weitere Validierung hinzufügen müssen, ja, ist es oft eine gute Idee, mehrere Validierungsebenen hinzuzufügen mehrere Validierungsebenen hinausgehen, was im Schema eingerichtet ist. In dieser Lektion werden wir die Backend-Datenvalidierung durchführen. Dies ist eine weitere Ebene der Validierung. Wenn Acker diese Validierungsebene irgendwie umgeht, haben wir bereits eine Validierung im Schema, die verhindert, dass ungültige Daten in unsere Datenbank gelangen. Hier haben wir zwei Möglichkeiten. Kann manuell ausgeführt werden oder wir können sehr beliebtes Paket namens Joy verwenden. Wir haben auch andere Validatoren wie Express Validator, Yup und Validator Dot JS Sie können verwenden, was Sie wollen. Ich liebe Joy, weil es vielseitig und einfach zu bedienen ist und weil es sich gut in viele NodeJS-Frameworks integrieren lässt, insbesondere Express Dot JS insbesondere Express Dot Lass mich dir das zeigen. Öffne das Terminal und schreibe NPM, installiere Joy Ethert 17.13 0.3. Gut. Freude zu gebrauchen ist jetzt sehr einfach. Zuallererst werden wir Joy in diese Datei importieren. Ständige Freude mit J ist also gleichbedeutend damit, Freude zu erfordern. Sie wissen bereits, warum wir hier J schreiben , weil dieses Joy-Paket eine Klasse zurückgibt Jetzt müssen wir mit Freude ein Schema für die Textdaten der Anfrage definieren . In diesem Joy-Schema können wir viele Dinge tun, genauso wie wir es im Benutzerschema getan haben. Wir definieren hier eine neue Variable namens Benutzerschema oder Create User Schema ist gleich, und hier übergeben wir Joy Dot Object und darin übergeben wir unser Schemaobjekt. In diesem Objekt übergeben wir unsere Felder mit dem Joy-Schema. Was ist die Art von Eigenschaften? Ist es erforderlich? Was ist der Mittelwert, Maximalwert oder die mittlere Zeichenkettenlänge , die Sortierlänge und vieles mehr Zuallererst brauchen wir hier einen Namen, um Spaß zu haben. Wir können den Feldtyp angeben, bei dem es sich um eine Zeichenfolge handelt Stellen Sie sicher, dass wir diese Funktion hier aufrufen. Jetzt können wir hier auch den Mittelwert bis drei Zeichen hinzufügen, und wir wollen auch, dass das als Pflichtfeld gefüllt wird. Es gibt viele Methoden, Freude. Sie können sich alle Methoden anhand der zugehörigen Dokumentation ansehen. Als nächstes haben wir hier die Zeichenfolge Email fill Joy Dot. Nun zu Email Joy haben wir eine E-Mail-Methode, auch die E-Mail validiert und diese Füllung nach Bedarf angeheftet wird. Als Nächstes haben wir das Passwort für Joy, Punkt, Punkt, Min. 26 Buchstaben des Passworts, und wir benötigen auch dieses Passwort als Pflichtangabe. Als letztes Testament wollen wir seine Lieferadresse an Joy Dot Dot Min to Pi bestätigen und benötigen. Gut. Hier haben wir dieses Joy-Schema, jetzt wollen wir dieses Schema auf die Daten anwenden , die wir in diesem Anforderungspunktkörper erhalten. Aus diesem Grund schreiben wir den gleichen Feldnamen, den wir in den Hauptteil der Anfrage übergeben. Um die Daten mit Joy zu validieren, müssen wir diese Methode zur Punktvalidierung nach dem Schema für kreative Benutzer verwenden . Darin müssen wir angeben, welche Daten wir validieren möchten und welche wir validieren möchten. Dabei müssen wir den Punkttext anfordern. Nun wird das Objekt zurückgegeben, das wir in der Variablen Joe validation speichern . Lassen Sie mich Ihnen zeigen, was wir in dieser Joy-Validierungsvariablen erhalten. Ich kommentiere diesen unteren Code aus und validiere einfach diesen Anforderungspunkttext hier und gebe einfach die Antwort Punkt Json zurück, Joy-Validierung. Sag das in Js und schau es dir an. Senden Sie die Postanfrage. Sehen Sie hier, dass unsere Daten validiert sind. Deshalb bekommen wir den Wert gefüllt. Wenn ich dieses Passwort aus dem Hauptteil der Anfrage entferne und das erneut sende. Sehen Sie, hier erhalten wir ein Fehlerobjekt und darin haben wir diese Details , also ein Array, und darin erhalten wir eine Fehlermeldung. Passwort ist erforderlich. Durch die Verwendung dieses Fehlerobjekts können wir in unserer Antwort einen Fehler zurückgeben. Lass dich nicht verwirren. Lass mich dir das zeigen. Entfernen Sie diese Antwortpunkt-JSN-Methode. Wir brauchen es nicht und wir schreiben einfach hier, ich konditioniere und überprüfe, ob ein Joy-Validierungsfehler verfügbar ist Dann geben wir in der Antwort einfach einen Fehler zurück Antwortpunktstatus zurück, 400 für eine schlechte Anfrage, Punkt Json, und hier geben wir das Joy-Validierungspunktfehlerobjekt zurück. Es hat sich bewährt, dass Entwickler von hier aus nicht mehr das vollständige Fehlerobjekt übergeben. Sie senden gerne nur Fehlermeldungen. Wir fügen Punktdetails hinzu, das ist das Array, und wir greifen auf das erste Element durch eckige Klammern zu. MessAGE mit einem Null-Index-Punkt, lassen Sie uns das testen, senden Sie die Anfrage ohne ausgefülltes Passwort. Siehst du, hier bekommen wir ein Passwort, das benötigt wird. Wenn wir das Passwort erneut ausgefüllt übergeben, also rückgängig machen, aber beim Namen geben wir nur zwei Zeichen weiter. Und sende die Anfrage. Siehst du, hier bekommen wir eine nette Fehlermeldung. Die Länge des Namens muss mindestens drei Zeichen lang sein. Bei der Mongo-Schemavalidierung erhalten wir diese Art von Fehlermeldungen nicht, und das ist der Grund, warum Entwickler Joy mögen Jetzt habe ich hier eine Frage. Wenn wir hier nicht zwei Fehler bestehen, was wir bekommen werden. Also entferne diese ersten beiden Füllungen. Senden Sie die Anfrage. Siehst du, hier bekommen wir nur einen Fehler. Joey führt die Validierung Zeile für Zeile durch. Wenn die erste Zeile nicht validiert wird, wird sofort ein Fehler zurückgegeben Aus diesem Grund geben wir immer eine Punktnachricht mit Details zum ersten Element zurück . diese Weise validieren wir Eingabedaten, die wir vom Anfragetext erhalten. Sie können einen Kommentar aus einem anderen Code entfernen. Gott. Um es kurz zusammenzufassen In der realen Welt gibt es drei Validierungsebenen, clientseitige Validierung, die Frontend-Entwickler im Browser durchführen Benutzer können das im Frontend-Formular sehen. Als Nächstes haben wir die Validierung auf Bacon-Seite, die wir gerade mit Joy durchgeführt haben. Dabei validieren wir Daten, die wir vom Frontend im Request Dot Body erhalten Als Nächstes haben wir das Mongo-Schema, das die endgültige Validierung Wird verhindern, dass ungültige Daten in die Datenbank eingegeben werden. Wenn jemand die clientseitige Validierung besteht, haben wir eine Validierung auf der Waggonseite, und wenn jemand diese auch besteht, dann ist das Mangus-Schema immer da Das Hinzufügen dieser Ebenen bietet einen robusten Ansatz, um zu verhindern, dass ungültige Daten in unsere Datenbank gelangen, und gewährleistet eine sichere und zuverlässige Anwendung Jetzt können Sie sehen, dass wir professionell arbeiten. In der nächsten Lektion werden wir sehen, wie die Benutzerauthentifizierung in der realen Welt funktioniert. 97. Funktionsweise der Authentifizierung: Lassen Sie uns nun über die Benutzerauthentifizierung in Node JS sprechen. Benutzerauthentifizierung spielt in jeder Anwendung eine sehr wichtige Rolle. In nodejs führen wir die Authentifizierung mit JWT durch, oder wir können es JSN WebToken sagen Jetzt fragen Sie sich vielleicht, was ist dieses JWT oder JSN WebTken? Mach dir darüber keine Sorgen. Es ist wirklich einfach. JSON-Webtoken ist eine lange Tokenzeichenfolge, die so aussieht. Mithilfe dieses Tokens, das wir im Backend generieren, können wir den Benutzer authentifizieren Lassen Sie mich Ihnen anhand eines Beispiels erklären, wie Authentifizierung vor JWT funktioniert und wie sie jetzt funktioniert Hier ist eine Harley, bei der er sich mit seinen Kontoinformationen, E-Mail und Passwort anmeldet seinen Kontoinformationen, E-Mail und Jetzt überprüft unser Server zuerst die Informationen, und wenn sie wahr sind, gibt Server seine Benutzer-ID als Antwort zurück und speichert diese in der Sitzung oder in Ooki Wenn er jetzt Anfragen nach sicheren Informationen sendet , sagen wir, all seine Bankinformationen Server fragt also zuerst nach der Benutzer-ID und ob er eine Benutzer-ID hat, und dann sendet der Server die sicheren Informationen. Aber hier ist ein großes Problem Die SSN oder das Cookie, in dem wir unsere Benutzer-ID speichern, können einfach im Browser geändert werden Nehmen wir an, ich ändere diese Benutzer-ID in eine andere Benutzer-ID, dann erhalten wir die Informationen über diesen Benutzer Dieser Ansatz ist nicht gesichert. dieses Problem zu lösen, führen wir nun das JSN-Webtoken Jetzt meldet sich Harley wieder mit seiner E-Mail und seinem Passwort an. Jetzt überprüft unser Server zuerst die Informationen, und wenn sie wahr sind, gibt Server das lange verschlüsselte eindeutige Token als Antwort zurück und speichert es im lokalen Speicher Das Tolle an diesem Token ist, dass es aus Nutzungsdetails und einem geheimen Schlüssel , den nur wir auf dem Server definieren werden. Niemand außer Ihnen und Ihrem Team kennt den geheimen Schlüssel. Wann immer Harley also eine Anfrage nach sicheren Informationen sendet , fragen wir auf dem Server zuerst nach dem JWT-Token und verifizieren es mit unserem geheimen Schlüssel Wenn es verifiziert ist, dann und dann vom Server senden wir diese gesicherten Und wenn wir etwas an den Benutzerinformationen ändern, ändert sich auch unser Token. Als Bend-Entwickler ist es unsere Aufgabe, JSN-Webtoken zu senden, wenn sich Benutzer registrieren oder anmelden , und das Token auch zu verifizieren, wenn wir es benötigen Das Speichern des Tokens im lokalen Speicher und allem anderen ist Aufgabe des Frontend-Entwicklers Legen Sie eine Summe fest. Wenn sich Benutzer erfolgreich anmelden oder registrieren, senden wir ein JSON-Webtoken, das einfach als Sicherheitskarte dient. Wenn ein Benutzer Daten anfordert die nur ein angemeldeter Benutzer zugreifen kann, überprüft der Server zuerst die Sicherheitskarte, bei der unser JSON-Webtoken handelt, und validiert sie mit dem geheimen JWT-Schlüssel Dieses Token wurde verifiziert, erst dann gibt der Server die Daten an diesen Benutzer zurück. So einfach ist das. In der nächsten Lektion werden wir nun das JCN-Webtoken generieren und es als Antwort senden 98. JWT-Token für Benutzer generieren: Wir verstehen also das JN-Webtoken. Es ist wie eine Sicherheitskarte. Lassen Sie uns nun ein Token generieren , wenn sich der Benutzer erfolgreich registriert hat , und in der Antwort ein Token senden. Um ein JSN-Webtoken zu generieren, benötigen wir ein Paket mit einem JSN-Webtoken, öffnen das Terminal und schreiben NPM Installieren Sie das JSN-Webtoken Und wenn Sie dieselbe Version wie meine installieren möchten, schreiben Sie mit der Rate 9.0 0.2 und drücken Sie die Gut. Jetzt importieren wir in der Datei unseres Benutzers oben das Paket mit require und speichern es einfach in einer Variablen namens JWT Wenn wir dieses Token nun ganz am Anfang oder zuletzt erstellen möchten, möchten wir das Token erstellen, wenn unsere Benutzerdaten erfolgreich gespeichert wurden Nach derselben Methode schreiben wir JWT dot Sign. In der Zeichenmethode müssen wir zwei Argumente übergeben Zuerst müssen wir Daten, die wir senden möchten, innerhalb des Tokens übergeben Daten, die wir senden möchten, innerhalb des Tokens Im Moment wollen wir nur die Benutzer-ID mit unserem Token senden. Objekt und erste Eigenschaft, Unterstrich ID bis Nwuser Unterstrich Stellen Sie sicher, dass Sie hier den Unterstrich ID eingeben. Ich habe diesen Fehler schon einmal gemacht. Außerdem möchte ich die Namenseigenschaft dieses Benutzernamens an den Benutzer Punkt N senden . Beim zweiten Argument müssen wir nun eine Zeichenfolge übergeben, die unser Sicherheitsschlüssel ist Vorerst übergeben wir GWT, den Sicherheitsschlüssel. Wir können jede beliebige Zeichenfolge übergeben. Es gibt keine Regeln für den Schlüssel. Außerdem geben wir diesen Schlüssel derzeit direkt weiter. Aber in der nächsten Lektion werden wir ihn zur Umgebungsvariablen hinzufügen . Mach dir darüber keine Sorgen. Dadurch wird nun ein JSN-Webtoken generiert, also speichern wir es in einer Variablen namens Token Einfach an der Stelle, an der neue Benutzerdaten gesendet werden, übergeben wir nur das Token Lassen Sie mich Ihnen zeigen, wie dieses Token aussieht. Speichern Sie die Änderungen und vom Thunder-Client senden wir neue Benutzerdaten, schreiben den vollständigen Namen und ändern die E-Mail in den Code one@gmail.com Stellen Sie sicher, dass Sie das Komma hinzufügen und die Anfrage senden. Siehst du, hier bekommen wir dieses lange Token, das wir gerade generiert haben Lassen Sie mich Ihnen nun mehr über dieses Token zeigen. Kopieren Sie also dieses JWT-Token. Stellen Sie sicher, dass Sie diese Doppelcodes nicht kopieren. Öffnen Sie einen Tab in Ihrem Browser und suchen Sie nach jwt dot IO. Und das ist die offizielle Dokumentation von JWT. Hier in den Bibliotheken können Sie die JWT-Implementierung für verschiedene Bibliotheken sehen JWT-Implementierung für verschiedene jetzt zur Hauptseite zurück und scrollen Sie nach unten zum Debugger-Bereich Und hier können wir unser Token dekodieren. Lassen Sie uns nun verstehen, was das Token enthält. Also hinter unserem Token hier. Jetzt sind alle GWT-Token in drei Teile aufgeteilt. Im ersten Teil geht es um den Header , der in roter Farbe ist Im zweiten Teil geht es um die Nutzlast, die lila ist, und letzte und wichtigste Teil ist die Signatur, die in der blauen Farbe ist Dieser Header enthält nun den Algorithmus und den Tokentyp, was sehr verbreitet ist. Konzentrieren Sie sich darauf. Als Nächstes enthält diese Nutzlast die Daten, die wir mit dem Token übergeben möchten In diesem Fall übergeben wir die Benutzer-ID und verwenden einen Namen , der dieses Objekt in dieser Zeichenmethode ist Der Grund, warum wir diese Daten hier weitergeben, ist , dass wir diese Daten auf unserem Frontend anzeigen können , ohne eine separate API aufrufen zu müssen. Danach haben wir noch eine weitere Eigenschaft It, die für ausgestellt am steht und deren Wert die Zeit ist, zu der unser Token generiert wird. Dadurch können wir sehen, wie alt unser Token ist. Der letzte Teil, der blau ist , ist die Signatur Er wird auf der Grundlage unseres Headers, dieser Nutzdatendaten und des geheimen Schlüssels generiert , der nur auf unserem Server verfügbar ist Dadurch wird verhindert, dass Benutzer ihr eigenes Token erhalten und es dann mit der ID ändern, um so zu tun, als wären sie jemand anderes Denn wenn Sie etwas in dieser Payload oder diesem Header ändern, wird die Signatur neu generiert also keine Möglichkeit, Benutzer haben also keine Möglichkeit, etwas Unethisches zu tun Nur mit diesem geheimen Schlüssel wird unser Token validiert. Andernfalls wird es uns einen Fehler geben. Deshalb ist JWT so beliebt. Um es kurz zusammenzufassen: Wenn sich Benutzer erfolgreich anmelden oder registrieren, erhalten wir ein JCN-Webtoken, das einfach als Sicherheitskarte Wenn Benutzer Daten anfordern die nur LogN-Benutzer zugreifen können, überprüft der Server zuerst die Sicherheitskarte, bei der es sich um unser JCN-Webtoken handelt , unser JCN-Webtoken handelt , und validiert sie mit dem geheimen JWT-Schlüssel Die beiden verifiziert, erst dann gibt der Server die Daten an diesen Benutzer zurück, so einfach wie es eingerichtet 99. Festlegen des Ablaufdatums des Tokens: Viele Entwickler haben sich bewährt, eine Ablaufzeit für dieses JSON-Webtoken festzulegen, z. B. 2 Stunden oder 24 Stunden. Nach Ablauf dieser Zeit ist dieses Token nicht mehr gültig. Wenn der Benutzer ein neues Token möchte, muss er sich erneut anmelden. Dafür können wir also das dritte Argument in dieser JWT Sign-Methode, Object, übergeben dritte Argument in dieser JWT Sign-Methode, Object, , und darin haben wir eine Eigenschaft namens expires in Wir können Werte in Millisekunden übergeben, wenn wir 2 Stunden angeben wollen, und dann zwei für 2 Stunden in 60 für Minuten schreiben , weil 1 Stunde wieder 60 Minuten hat, 60, weil 1 Minute 60 Sekunden hat und in 1.000, um Sekunden in Millisekunden umzurechnen Sie können sehen, dass das ein bisschen verwirrend ist. Wir können hier also auch von Kette zu Kante weiterleiten, was 2 Stunden dauert. Oder wir können hier einen Tag für einen Tag schreiben. Egal, wie du willst. Ein numerischer Wert wird als Anzahl von Millisekunden interpretiert Wenn Sie eine Zeichenfolge verwenden, stellen Sie sicher, dass Sie die Zeiteinheiten wie Tage, Stunden usw. Andernfalls wird standardmäßig die Einheit Millisekunden verwendet. Wenn wir hier also nur 120 als Zeichenfolge übergeben, dann entspricht das Ich gebe gerne 2 Stunden an, also zwei Sekunden, diese Ablaufzeit hängt wirklich von Ihrer Möglicherweise stellen Sie in den Bankanwendungen fest, Ihr Login in der allerletzten Zeit abgelaufen ist, etwa in fünf bis zehn Minuten. Danach müssen Sie sich erneut anmelden. Der Grund, warum sie die Ablaufzeit für Token verwenden , ist , dass sie ihre Anwendung sichern möchten. Auf der anderen Seite legen viele Social-Media-Websites die Ablaufzeit auf 30 Tage oder 60 Tage fest. Sobald Sie sich angemeldet haben, läuft Ihr Token nicht ab weil sie möchten, dass wir mehr von ihren sozialen Medien nutzen. Die Ablaufzeit hängt von Ihrem Projekt ab. Wählen Sie das Beste für Ihre Anwendung aus. Achten Sie nur darauf, dass Sie sich nicht über ExpirYT ärgern. 100. Sichern des Sicherheitsschlüssels in Umgebung: Derzeit geben wir unseren geheimen JWT-Schlüssel direkt hier weiter. In der realen Welt ist dies jedoch nicht sicher, denn wenn wir unsere Anwendung im Internet bereitstellen, laden wir unseren Code auch Cloud wie Github oder Gitlab Wenn wir unseren geheimen Schlüssel in diesen Code schreiben, kann jeder unseren geheimen Schlüssel sehen, und das ist nicht sicher An der Stelle, an der der geheime Schlüssel hier definiert wird, können wir ihn in der DOT-ENV-Datei bearbeiten In diesem Projekt haben wir keine Punkt-ENV-Datei erstellt. Erstellen Sie hier eine neue Datei namens Dot ENV. In dieser Datei definieren wir einfach die Variable JWT Underscore Key is equal to. Hier schreiben wir unseren Schlüssel, der der JWT-Sicherheitsschlüssel ist Außerdem verwenden viele Entwickler gerne einen zufälligen Schlüsselnamen , damit niemand den Sicherheitsschlüssel vorhersagen kann Sie können einen beliebigen Sicherheitsschlüssel verwenden, nur um die Sicherungskopie dieses Sicherheitsschlüssels aufzubewahren. Um nun auf diese JWT-Unterstrich-Schlüsselvariable in unserem Projekt zuzugreifen , müssen wir Dot NV konfigurieren und welches Paket wir dafür verwenden. Wir benötigen das dotNV-Paket, das Terminal öffnen und einfach Dot ENV mit NPM Gut. Jetzt fügen wir in der Datei index dot js ganz oben require dot NV hinzu und rufen hier die Dot Config-Methode auf. Speichern Sie diese Datei, und in der Benutzerroute hier an der Stelle dieser Hardcode-Zeichenfolge fügen wir den Punkt process dot zu unserem Variablennamen hinzu , der JWT underscore Und fertig. Wenn wir diesen Schlüssel erneut verwenden müssen, müssen wir den Originalschlüssel nicht schreiben. Wir können den Prozesspunkt E und einen Punkt für den JWT-Unterstrich schreiben. In der nächsten Lektion werden wir nun eine Anmelderoute erstellen, der wir uns mit E-Mail und Passwort authentifizieren 101. Übung Anmelderoute erstellen: Jetzt ist es Zeit für ein wenig Bewegung. Sie müssen eine neue API für die Anmeldung erstellen, es sollte sich also um eine Post-Anfrage mit Endpunkt-API-Slash-Login handeln Und im Hauptteil dieser Anfrage kann der Benutzer zwei Eigenschaften angeben, E-Mail-Adresse und das zugehörige Passwort Zuallererst müssen Sie in dieser API den Benutzer anhand seiner E-Mail-Adresse finden. Wenn Sie keinen Benutzer gefunden haben, müssen Sie als Antwort eine Fehlermeldung mit der Meldung Ungültige Anmeldeinformationen senden als Antwort eine Fehlermeldung mit der Meldung Ungültige Anmeldeinformationen Wenn der Benutzer verfügbar ist, müssen Sie das Passwort vergleichen. Nur diese beiden Schritte. Sie sich keine Gedanken über den Vergleich des Passworts, verlassen Sie die Übung an diesem Punkt. Definieren Sie einfach eine neue API und suchen Sie den Benutzer mit der E-Mail-Adresse. Nach Abschluss der Übung können Sie sich die Lösung ansehen. Ich hoffe also, dass Sie diese Übung lösen oder zumindest versuchen, sie zu lösen. Machen Sie sich das selbst zu eigen. Sehen wir uns jetzt die Lösung an. Zunächst definieren wir unten eine neue API mithilfe von Router Dot Post. Hier an der ersten Position übergeben wir den Endpunkt-Slash-Login An der zweiten Position übergeben wir die Callback-Funktion mit zwei Parametern, Anfrage und Antwort, und die Adher-Pfeilfunktion Lassen Sie mich Ihnen jetzt meinen Trigger zeigen, mit dem Sie Code ohne Verwirrung schreiben Ich schreibe gerne Schritte im Kommando. Zum Beispiel besteht der erste Schritt darin, den Benutzer aus der Datenbank per E-Mail zu finden Wenn wir einen Benutzer gefunden haben, vergleichen Sie danach das verschlüsselte Passwort. Wenn das Passwort übereinstimmt, erstellen wir ein JSON-Webtoken und senden es als Antwort. Auf diese Weise erhalten wir den klaren Pfad zum Schreiben des Codes. Im ersten Schritt müssen wir den Benutzer per E-Mail finden. Dafür müssen wir Daten aus dem Hauptteil der Anfrage abrufen. Die Kostendaten entsprechen dem Punktkörper der Anfrage. Oder wir können unser Objekt hier auch destrukturieren. Also fügen wir am Ort der Daten ein Objekt hinzu und greifen auf unsere Eigenschaften, E-Mail und Passwort Mit dieser E-Mail finden wir jetzt den Benutzer. Const-Benutzer ist hier also gleich, wir müssen auf den Benutzer Punkt warten. Gut hier übergeben wir das Vergleichsobjekt und vergleichen E-Mails, die mit unserer E-Mail-Variablen gefüllt sind, genau wie zuvor Hier erhalten wir einen Laufzeitfehler für die Verwendung einer Gewichtung. Wir müssen unsere Funktion asynchron machen. Gut. Jetzt können wir den Zustand überprüfen. Wenn der Benutzer nicht definiert ist, geben wir hier einen Fehler zurück. Antwortstatus 401 für ungültige Anmeldeinformationen Außerdem senden wir GSN-Objekt mit der Nachrichteneigenschaft ungültige Anmeldeinformationen Was ist nun, wenn der Benutzer gefunden wird? Ja, wir müssen überprüfen, ob das Passwort falsch ist oder nicht, aber hier ist eine Sache Wir speichern das Benutzerpasswort in verschlüsselter Form. Wir können es nicht direkt mit einem einfachen Zeichenkettenpasswort vergleichen. Also hier müssen wir wieder das Crypt-Paket verwenden. Crypt Dot vergleicht also die erste Position, wir übergeben das Passwort, das wir aus dem Hauptteil der Anfrage erhalten, und danach müssen wir ein Passwort übergeben, das wir in der Datenbank gespeichert haben das wir in der Datenbank gespeichert Also Benutzer-Passwort. Nun, dieser Ausdruck nimmt wieder wenig Zeit in Anspruch, also können wir hier warten und das Ergebnis einfach in einem variablen gültigen Passwort speichern. Wir können die Bedingung erneut bestehen, wenn kein gültiges Passwort verfügbar ist , und wir geben denselben Fehler mit derselben Fehlermeldung zurück. Ich füge diese Zeile hier ein. Jetzt fragen Sie sich vielleicht, warum wir dieselbe Fehlermeldung senden? Das liegt daran, dass wir aus Sicherheitsgründen, wenn wir angeben, dass das Passwort nicht übereinstimmt, bedeutet das, dass wir einen Benutzer gefunden haben und nur das Passwort nicht übereinstimmt. Aus diesem Grund senden Entwickler diese Art von Fehlermeldung mit ungültigen Anmeldeinformationen. Wenn das Passwort nun übereinstimmt, müssen wir ein neues Token erstellen. Ich kopiere den Code aus der Register-API und füge ihn in unsere Login-API ein. Wir müssen nur kleine Änderungen vornehmen. Hier in den Daten müssen wir die Benutzerpunkt-Unterstrich-ID und den Benutzerpunktnamen übergeben Am Ende senden wir einfach die Antwort Dot Json an dieses Token. Gut. Lassen Sie uns nun diese Implementierung probieren. Gehen Sie also zum Thunder-Client und erstellen Sie in der Sammlung des Benutzers eine neue Anfrage und geben Sie ihr einen Namen Melden Sie sich als Benutzer an Ändern Sie die Methode auf Post und die URL auf STP, rufen Sie einen doppelten Schrägstrich auf Localhost, 3.000 Schrägstrich-API-Schrägstrich , Benutzer Schrägstrich Und im Hauptteil übergeben wir Object with email fill. Hier übergeben wir E-Mails, die wir nicht mit Code 12 auf athergmil.com erstellt Geben Sie auch das Passwort 12345678 ein und senden Sie die Anfrage. Sehen Sie, hier erhalten wir die Fehlermeldung ungültige Zugangsdaten. Wenn wir nun eine gültige E-Mail schreiben und das falsche Passwort eingeben und die Anfrage senden, sehen Sie, wir erhalten immer noch den gleichen Fehler. Wenn wir nun „E-Mail schreiben“ und „Passwort schreiben“ übergeben und die Anfrage senden, sehen Sie, jetzt erhalten wir das JSON-Web-Token. So erstellen wir die Login-API. Wir müssen einfach den Benutzer finden sein Passwort mit dem BCR-Paket vergleichen Wenn es übereinstimmt, generieren wir JSN WebTken und senden es als Antwort, so einfach Bevor wir weitermachen, kopieren wir hier buchstäblich den Code zum Generieren des JSON-Web-Tokens und fügen Code zum Generieren des Wir ändern einfach diese Daten. Es ist besser, eine separate Funktion zum Generieren des Tokens zu erstellen , und dann können wir es in beiden APIs verwenden. Im Folgenden erstellen wir also eine neue Funktion namens Generate Token, die der Pfeilfunktion entspricht. Von dieser Funktion aus wollen wir nun einfach das Token zurückgeben. Kopieren Sie diese JWT Dot Sine-Methode und fügen Sie sie hier ein. Jetzt wollen wir hier nur verschiedene Daten übergeben. Wir ersetzen dieses Datenobjekt durch Datenvariable und wir erhalten diese Daten aus dem Parameter. Wenn Sie eine andere Ablaufzeit für das Token festlegen möchten, können Sie auch einen Parameter dafür übergeben. Im Moment wollen wir nicht, dass 2 Stunden für beide okay sind. Jetzt haben wir in der Login-API dieses Datenobjekt, das wir in der JWT-Punktzeichenmethode übergeben und wir rufen es einfach hier auf, generieren die Token-Funktion und übergeben dasselbe Datenobjekt als Argument Gut. Nun, das Gleiche machen wir in der Register-API, schneiden das Datenobjekt aus, und hier rufen wir generate to confunction auf und übergeben hier das Datenobjekt Durch diese Implementierung sieht unser Code organisierter aus. 102. Wie authentifiziere ich Benutzer? Eingeloggt oder nicht?: In der vorherigen Lektion haben wir also gesehen, dass wir nach der Registrierung und Anmeldung ein JWT-Token generieren und es in der Antwort senden Lassen Sie mich Ihnen nun sagen, was das Frontend mit diesem Token machen wird Wenn wir also das JWT-Token vom Backend zum Frontend senden, speichert das Frontend dieses Token im lokalen Speicher des Browsers oder in der Sitzung Dadurch weiß das Frontend, ob der Benutzer angemeldet ist oder nicht. Wenn der Benutzer auf sichere Daten zugreifen möchte, die nur der angemeldete Benutzer zugreift, muss das Frontend dieses Token mit dem API-Aufruf senden. Es gibt also viele Möglichkeiten, Token mit dem API-Aufruf zu senden. Am häufigsten sendet das Frontend jedoch Token in der Anfrage, insbesondere im Autorisierungsheader. Wenn Ihr Frontend eine andere Methode verwendet, wird es das Backend kontaktieren und es dann auf diese Weise implementieren Also hat das Frontend das Token im Autorisierungsheader gesetzt. Und wenn der Benutzer auf eine geschützte API zugreifen möchte, die nur ein gesperrter Benutzer zugreift, dann im Backend zuerst, welches Token verifiziert wird oder nicht. Wenn es verifiziert ist, erlauben wir dem Benutzer den Zugriff auf diese API, und wenn das Token nicht verifiziert ist, geben wir den Fehler mit dem Statuscode 401, Autorisierungstoken erforderlich, zurück . Nun, wo schreiben wir diese Logik? Und erstellen Sie eine Middleware, speziell für die Überprüfung des Tokens, und wir können diese Middleware für alle geschützten APIs hinzufügen Lassen Sie mich Ihnen das praktisch zeigen. In unserem Projekt zur Definition einer Middleware erstellen wir also einen neuen Ordner namens Middleware, und in diesem Ordner erstellen wir eine neue Datei namens Erinnern Sie sich jetzt an diese Middleware? Middleware ist eine Funktion , die entweder die nächste Middleware-Funktion aufruft oder eine Antwort auf die aktuelle Anfrage sendet Hier definieren wir also eine Funktion namens Orth Middleware und AV, die wir für Express-Middleware kennen. Wir erhalten drei Parameter: Request Response und Next Wir erhalten drei Orth Middleware und AV, die wir für Express-Middleware kennen. Wir erhalten drei Parameter: Request Response und Next Error Function. Zuallererst müssen wir hier den Autorisierungsheader abrufen. Der Seconoth-Header entspricht der Punkt-Autorisierung von Request Dot Headers . Stellen Sie sicher, dass Sie die richtige Schreibweise der Eigenschaften schreiben die richtige Schreibweise der Eigenschaften Andernfalls erhalten wir den Header hier nicht. Lassen Sie uns diesen Auth-Header mit einem Punkt protokollieren , um zu sehen, was wir in dieser Variablen bekommen In Zukunft können wir diese Konsole entfernen. Außerdem erhalten wir in der realen Welt diesen Outh-Header als diesen in der Zeichenfolge, wir erhalten zuerst den Fehlerraum und dann das vollständige JWT-Token Der Grund, warum wir hier diesen Fehler erhalten, ist, dass er ein üblicher Authentifizierungsstandard ist und sicherstellt, dass der Server das Token korrekt verarbeitet Bevor wir das Token verifizieren, müssen wir nun prüfen, ob wir das Token in diesem Header erhalten oder nicht. Wir halten uns an die Bedingung, wenn der O-Header nicht verfügbar ist, oder wir halten eine weitere Bedingung ein, beide Header beginnen mit hier in der Zeichenfolge, wir übergeben den Bearer-Space Wenn diese Bedingung nicht wahr ist, geben wir einen Fehler zurück Stellen Sie sicher, dass Sie hier „nicht wahr“ hinzufügen. Darin geben wir nun den Antwortstatus 401 für die unautorisierte Anfrage Punkt Jason zurück Antwortstatus 401 , und hier senden wir ein Objekt mit Nachrichteneigenschaft, Autorisierung und benötigtem Token. Stellen Sie sicher, dass Sie das Objekt bei jedem Fehler mit derselben Eigenschaft senden . Dies erleichtert die Behandlung von Fehlern im Frontend. Nun, was ist mit den beiden Headern. Wie wir wissen, ist der Oh-Header eine Zeichenfolge mit Präfix, Träger, Leerzeichen und dann Token Also müssen wir das Token aus dieser Zeichenfolge abrufen. Es ist wirklich einfach. Das Const-Token entspricht beiden Headern. Hier verwenden wir die Split-Methode und von dort, wo wir trennen wollen, direkt vom Leerzeichen aus Also übergeben wir Doppelcodes und Leerzeichen. Diese Split-Methode gibt nun ein Array wie dieses zurück. Das erste Element ist der Träger und das zweite Element ist unser Token. Wir können über den ersten Index auf das Token zugreifen. In eckigen Klammern schreiben wir eins. Jetzt müssen wir nur noch überprüfen, ob dieses Token gültig ist oder nicht. Dafür benötigen wir oben das JWT-Paket. Wir schreiben, dass Cast JWT dem JSON-Webtoken entspricht Unten schreiben wir JWT dot verify this method mit Ausnahme erste ist ein Token , das wir verifizieren wollen, nämlich dieses Token Beim zweiten Parameter müssen wir den geheimen JWT-Schlüssel hinzufügen, der Prozess Env Dot JWT , Underscore-Schlüssel, ist Wenn unser Token nun erfolgreich verifiziert wurde, erhalten wir hier die Benutzerdaten, die wir mit dem Token senden Wir können es in einer Variablen namens decodierter Benutzer speichern. Wir können diese Benutzerdaten speichern, da Request-Punkt-Benutzer dem dekodierten Benutzer entspricht Wenn wir auf einer geschützten Route die Daten der aktuell angemeldeten Benutzer abrufen möchten, können wir einfach mit Request Dot User darauf zugreifen Keine Sorge, das werde ich Ihnen auch zeigen, wenn wir dieses Projekt vorantreiben . Nachdem wir nun die Benutzerdaten in Request Dot User eingegeben haben, möchten wir mit dieser Methode nichts mehr tun. Wir können also einfach die nächste Funktion aufrufen, die wir die nächste Middleware in der Aufrufliste nennen Wenn wir diese nächste Funktion nicht aufrufen, Express weder die API-Funktion noch eine andere Middleware-Funktion Unser Server wird an diesem Punkt bleiben, und das wird unseren Server wirklich langsam machen Rufen Sie die nächste Funktion immer am Ende der Middleware-Funktion ist nun hier in diesem Code, Was ist nun hier in diesem Code, wenn unser Benutzer nicht verifiziert ist Was ist, wenn der Benutzer ein gefälschtes Token oder ein abgelaufenes Token weitergegeben hat? Wir müssen uns auch darum kümmern. Fehler zu beheben, fügen wir hier den Blog Try und Catch hinzu und fügen diese drei Zeilen einfach dem Try-Blog hinzu. Wenn wir in diesen drei Zeilen einen Fehler erhalten, wird dieser Catch-Blog ausgeführt. In diesem Catch-Blog können wir einfach eine Antwort mit dem Status 400 für ungültige Anfragen mit Punkt Json und What we pass here zurückgeben . Richtig, wir übergeben hier das Objekt mit der Eigenschaftsnachricht und Fehlermeldung wird ein ungültiges Token sein und fertig. Wir vervollständigen die Authentifizierungs-Middleware. Lass uns das auch probieren. Zuallererst müssen wir diese Orddalware exportieren, um diese Middleware in unseren Routen verwenden zu können Also Modul Dot Exports. Entspricht Auth Middleware. Speichern Sie die Änderungen und wechseln Sie zur Benutzerroute. Hier unten, nach der Login-Route, fügen wir die Router-Punkt-Get-Methode und zeigen nur auf einen Schrägstrich Danach fügen wir Callback-Funktion mit Anfrage und Das ist die normale API. Aber wie können wir diese API schützen, was bedeutet, dass nur gesperrte Benutzer auf diese API-Route zugreifen sollten? Dafür müssen wir vor dieser Callback-Funktion Middleware hinzufügen vor dieser Callback-Funktion Middleware Ganz oben importieren wir Const-Middleware. Sie können es auch OT nennen, was bedeutet, dass wir noch einen Schritt weiter gehen müssen , Middleware Um diese Middleware vor dieser API-Callback-Funktion auszuführen, müssen wir sie hier vor der Callback-Funktion hinzufügen Wenn Benutzer eine Get-Anfrage an diesen Endpunkt senden, wird zuerst diese Orth-Middleware-Funktion Welches Act-Token ist in dieser Middleware gültig oder nicht. Wenn es gültig ist, rufen wir erst dann die nächste Funktion auf, die diese API-Callback-Funktion ausführt Wenn wir in unserer Anwendung eine geschützte API erstellen möchten, müssen wir vor dieser API-Callback-Funktion nur Omddalware hinzufügen API-Callback-Funktion nur Omddalware So einfach ist das. Können Sie mir sagen, wie wir an die Daten der angemeldeten Benutzer kommen können? Richtig, wir erhalten die Daten der angemeldeten Benutzer von Request Dot User. Die Kosten für den Benutzer entsprechen also der Anfrage für den Punktbenutzer. Und hier senden wir diesen Benutzer einfach in der Antwort-Dot-JSON-Methode Lassen Sie uns nun diese Implementierung testen. Speichern Sie die Änderungen und zuerst müssen wir ein Token generieren. Öffnen Sie den Thunder-Client und gehen Sie zur Login-API. Hier haben wir die Daten, sodass wir diese Login-Anfrage einfach senden können Gut. Hier bekommen wir das Token. Stellen Sie sicher, dass Sie das Buchstaben-Token generieren , da wir eine Ablaufzeit von 2 Stunden festgelegt haben. Kopieren Sie dieses Token und hier erstellen wir eine neue Anfrage. Gib ihr einen Namen, angemeldeter Benutzer. Zunächst schreiben wir den API-Endpunkt, d. h. HTP, Callan, einen lokalen Host mit doppeltem Schrägstrich, 3.000 API-Slash-Benutzer Senden Sie jetzt diese Anfrage. Siehst du, hier bekommen wir den Fehler. Autorisierungstoken erforderlich, da wir das Token nicht im Autorisierungsheader übergeben haben. den Autorisierungsheader zu übergeben, gehen wir also zu den Headern Hier fügen wir einen neuen Header hinzu, den Schlüssel zur Autorisierung. Siehst du, wir bekommen auch eine Autorisierung, und hier, was wir weitergeben werden. Ja, wir müssen ein Token übergeben, aber mit Präfix Fehlerraum, und hier haben wir ein Token übergeben. Stellen Sie sicher, dass Sie es nicht mit doppelten Codes weitergeben. Lassen Sie uns jetzt die Anfrage senden. Sehen Sie, hier erhalten wir die Benutzerdaten mit dem ID-Namen Es ist der Zeitpunkt , an dem dieses Token generiert wird, und EXP ist die Ablaufzeit, was bedeutet, wann dieses Token abläuft Außerdem, wenn wir unser Terminal, eine Konsole, überprüfen, den Auth-Header. Siehst du, zuerst bekommen wir das Bearer-Präfix und dann bekommen wir Auf diese Weise werden wir Authentifizierungs-Middleware hinzufügen , um unsere API zu schützen Hier erhalten wir also nur den Benutzernamen und die ID. Lassen Sie uns alle Informationen über den angemeldeten Benutzer senden. In der Route des Benutzers fügen wir hier Fine query hinzu, sconctUser entspricht await user dot find Und hier übergeben wir unsere Benutzer-ID, die Anforderungspunkt-Benutzerpunkt-Underscore-ID ist Punkt auswählen, und hier wollen wir kein Passwort senden. Ich gebe eine Zeichenfolge minus Passwort zurück, und dann geben wir die Antwort Punkt an diesen Benutzer Entferne diese erste Benutzerzeile, wir brauchen sie nicht. Außerdem müssen wir diese Funktion zu einem machen. Speichern Sie die Änderungen und nehmen Sie ein. Siehst du, jetzt bekommen wir die vollständigen Daten der angemeldeten Benutzer. Jetzt können wir diese Route verwenden, um die vollständigen Informationen des aktuell angemeldeten Benutzers zu erhalten . diese Weise wird der Benutzer mithilfe dieser OS-Middleware-Funktion angemeldet oder nicht 103. OAuth im Detail: In den vorherigen Videos haben wir also gesehen, wie wir Benutzer mit E-Mail und Passwort anmelden und anmelden, was sehr wichtig ist Aber heutzutage haben Sie vielleicht gesehen, viele Websites einige zusätzliche Funktionen bieten, z. B. können wir uns bei Google anmelden, uns bei Facebook, Twitter anmelden, uns bei Github und die Liste geht je nach Art der Website weiter und weiter. Viele Benutzer verwenden diese Methoden gerne zum Signieren. Wenn sie diese Methoden verwenden, müssen sie kein neues Passwort für eine andere Website erstellen und sich dieses merken. Sie verwenden einfach ihre Google-ID eine soziale ID und melden sich auf unserer Website an. Außerdem ist es wirklich sicher. Daher ist es sehr nützlich, dass wir diese Funktionen auch in unsere Anwendung aufnehmen. Aber bevor Sie sie hinzufügen, fragen Sie sich vielleicht, wie diese Funktionen hinter den Kulissen funktionieren. Hier ist also die vollständige Architektur des Signaturprozesses. Hab keine Angst. Hört es euch einfach als Geschichte an, denn in unserem täglichen Leben nutzen wir diese Funktionen bereits. Nehmen wir an, hier ist ein Hali, er hat eine Website namens Amazon oder Ebay benutzt eine Website namens Amazon oder Ebay Auf dieser Website hat er die Möglichkeit, sich bei Google zu registrieren oder zu Wenn Sie auf diese Schaltfläche klicken, wird er über diese Schaltfläche zur Anmeldeseite von Google weitergeleitet. Hier gibt er seine Google-E-Mail-Adresse und sein Passwort ein und meldet sich an. Wenn er Schreib-E-Mail und Passwort eingibt, passiert etwas auf der Webseite, und am Ende meldet er sich mit seiner E-Mail-Adresse auf der Amazon- oder eBay-Website mit seiner E-Mail-Adresse ohne das neue Passwort zu erstellen. Das ist wirklich unglaublich. Jetzt spielt sich der Hauptteil zwischen diesen ab. Lass mich dir sagen, was dort passiert ist. Wenn Harley eingibt, E-Mail und Passwort in das Google-Konto schreibt und auf Anmelden klickt, generiert der Google-Server einen temporären Code und sendet diesen temporären Code an unser Backend Jetzt können wir im Backend mit diesem Code einige Nutzungsdetails abrufen, auf die wir zugreifen möchten , und sie in unserer Datenbank speichern, wie den Namen des Benutzers, die E-Mail-ID usw. Unser Backend wird sich also erneut mit dem Google-Server in Verbindung setzen und ihm mitteilen, dass wir anstelle dieses temporären Codes auf Nutzungsdaten zugreifen möchten anstelle dieses temporären Codes auf Nutzungsdaten Google-Server überprüft also den Code und extrahiert die Benutzerdaten aus diesem Code. Und dann sendet der Google-Server diese Nutzungsdaten an das Backend In unserem Backend haben wir diese Nutzungsdaten und können diese Daten auf jede Art und Weise verwenden, wie wir sie verwenden möchten Beispiel können wir den Benutzernamen und die Benutzer-E-Mail in unserer Datenbank speichern und einen neuen Benutzer generieren, oder wenn die Benutzer-E-Mail bereits verfügbar ist, tun wir nichts und leiten den Benutzer einfach mit einem Token zum Frontend weiter. Wenn ich jetzt zum ersten Mal etwas über diese Architektur erfahre, das ist Oath oder wir können Open Authorization nennen Jetzt habe ich eine Frage und ich bin mir sicher, dass Sie dieselbe Frage haben Warum sendet der Google-Server zuerst diesen temporären Code oder Autorisierungscode an unser Backend Warum können die Benutzerinformationen nicht direkt gesendet werden? Es gibt einige Gründe, warum Google-Server diesen Autorisierungscode sendet. Angenommen, Google sendet Benutzerinformationen wie E-Mails oder Profildaten direkt Benutzerinformationen wie E-Mails an das Frontend Dann können sie von Hackern gestoppt oder gelöscht und auch gemildert oder missbraucht werden, bevor sie unser Backend erreichen Außerdem wirkt der temporäre Code wie ein Permission-Sleep-Modus. Es teilt Google mit, dass sich dieser Nutzer angemeldet und unserer App die Erlaubnis erteilt hat. Nur unser Backend mit einem geheimen Schlüssel kann diesen Code auf die realen Daten des Benutzers erweitern. Dieser geheime Schlüssel wird uns von Google zur Verfügung gestellt und ist nur in unserem Backend invFLE verfügbar , genau wie unser geheimer JWT-Schlüssel Aus Sicherheitsgründen sendet Google zunächst nur einen temporären Code oder einen Autorisierungscode Hier ist die Zusammenfassung der Funktionsweise von OAuth. Der Nutzer klickt zuerst auf die Google-Schaltfläche, meldet sich an oder registriert sich mit meldet sich an oder registriert sich mit ihr und kehrt dann zur Google-Anmeldeseite zurück, oder wir können Google-Server oder wir anschließend auf dem Google-Server, Überprüfen Sie anschließend auf dem Google-Server, ob die E-Mail-Adresse und das Passwort richtig sind oder nicht Wenn es richtig ist, generiert Google Autorisierungscode und sendet ihn an das Backend Backend sendet erneut den Autorisierungscode mit dem geheimen Schlüssel an den Google-Server, und der Google-Server extrahiert die Benutzerdaten wie Name, E-Mail, Profilschwein usw. Jetzt können wir diese Daten endlich im Backend in unserer Datenbank speichern, oder wenn der Benutzer bereits verfügbar ist, können wir den Benutzer einfach mit JWT Token zur Frontend-Homepage weiterleiten mit JWT Token zur Frontend-Homepage So einfach ist das. Diese Architektur funktioniert also für alle Arten von sozialen Netzwerken wie die Anmeldung mit Facebook, Anmeldung mit Github, Twitter usw. Nicht nur für Google. Ich verwende hier Google als Beispiel. Wenn wir Facebook brauchen, dann autorisiert dieser von Facebook geänderte Google-Server und Server oder Github autorisiert und In der nächsten Lektion werden wir diesen Eid nun praktisch in unserer Catwis-Anwendung implementieren 104. OAuth in Node-Anwendung – Anmeldung mit Google: Lassen Sie uns die Funktion „Mit Google anmelden“ in dieser Anwendung implementieren Funktion „Mit Google Und dafür benötigen wir ein Paket namens passpod dot js. also in OT Architecture Wenn der Benutzer also in OT Architecture auf „Mit Google Pattern anmelden “ klickt, werden wir den Benutzer auf die Seite Shake Local Host Column 3.000 Slash APIs OT Slash Google-Seite weiterleiten 3.000 Slash APIs OT Das ist unsere Backend-API. Wie können wir definieren? Wir möchten die Google-Anmeldeseite anzeigen oder den Google-Server mit dieser Seite verknüpfen. Und wenn wir im Backend einen Autorisierungscode erhalten, wie können wir Anfragen an den Google-Server senden und Benutzerdaten abrufen? Ja, wir können das alles manuell machen, aber die Passport Js Library macht es so viel einfacher. Wir werden es benutzen. Lass dich nicht verwirren. Sehen Sie sich einfach diese vollständige Lektion an und Sie werden verstehen wie diese Oath-Implementierung funktioniert Also gehen wir zur Seite passports.org. Hier können wir sehen, dass Passport eine Authentifizierungs-Middleware für No Jz ist, eine Authentifizierungs-Middleware für No Jz ist, extrem flexibel und modular. Unten finden wir alle Strategien wie Facebook, Twitter, Google, Github usw. Sie sich keine Sorgen, gehen Sie einfach zur Suchleiste und suchen Sie hier, Google, und wählen Sie diesen Pass Google Oth Two Achte darauf, dass du nicht diesen Eid 20 auswählst. Wir verwenden Oth Two. Diese beiden sind sich sehr ähnlich, aber dieser Oath 20 ist eine ältere Strategie Es ist nicht wirklich gut gepflegt. Also werden wir dieses ODER zwei verwenden, das neue Funktionen hat und aktiv von Passport verwaltet wird. Lassen Sie mich ein wenig heranzoomen. Ja. Also zuerst müssen wir dieses Paket installieren. Kopieren Sie also diesen Befehl zurück in den Vas-Code, öffnen Sie das Terminal und in diesem Terminal fügen wir den Befehl einfach hier ein. Und für dieselbe Version können Sie mit einer Geschwindigkeit von 0,2 bis 0,0 schreiben. Außerdem benötigen wir ein Reisepass-Paket mit einer Rate 0,7 bis 0,0 und drücken die Eingabetaste. Gut. Nun zurück zur Dokumentation. Hier geben sie uns den vollständigen Code für die Implementierung der Strategie Passport mit Google. Kopieren Sie den gesamten Code, und in unserem Backend können wir diesen Code in unsere Gs-Datei mit dem Indexpunkt einfügen Aber Detw hat unsere Indexpunkt-JS-Datei durcheinander gebracht, sodass wir diesen Code in der separaten Datei speichern können Dafür erstellen wir einen neuen Ordner namens Config und erstellen darin eine neue Datei, Passport Dot JS und fügen den Code darin Machen Sie sich vorerst keine Sorgen um diesen Code. Ich werde diesen Code erklären und wir werden später auch einige Änderungen vornehmen. Nun zurück zur Dokumentation, scrolle nach unten, und hier können wir sehen, dass sie uns APIs geben , die wir zu unserer Anwendung hinzufügen können. erste API ist Auth Google und an der Stelle der Callback-Funktion übergibt sie die Passport Dot Authenticate-Methode, und an erster Stelle übergeben sie Google, den Authentifizierungsserver, und danach übergeben sie den Umfang der Daten Im Grunde sagen sie, welche Benutzerdaten wir vom Server erhalten möchten Wir möchten E-Mail und Profil, die viele Details über den Benutzer enthalten. Jetzt fragen Sie sich vielleicht, was diese API tun wird. Wenn der Nutzer eine Abrufanfrage vom Browser an diesen Google-Endpunkt mit Schrägstrich sendet , diese Methode zur Authentifizierung mit Passport Dots öffnet diese Methode zur Authentifizierung mit Passport Dots die Google-Anmeldeseite Um diese Route zu unserer Anwendung hinzuzufügen, können wir so etwas tun Im Routenordner erstellen wir eine neue Datei auth dot js. Separate Routen für die Authentifizierung erstellen. In diesem Fall benötigen wir zunächst Cost Express, was Require Express entspricht. Für das Hinzufügen einer Route fügen wir die Kosten hinzu . Router entspricht Express Dot Router. Nun kopieren wir aus der Dokumentation diese erste Route und fügen sie in die zweite Route ein. Außerdem müssen wir oben den Reisepass eingeben, müssen wir oben den Reisepass eingeben, da Sie hier den Reisepass verwenden. Der gültige Reisepass entspricht dem obligatorischen Reisepass. Nun, an der Stelle dieser App Punkt GAD, was verwenden wir? Richtig, wir verwenden Router Dot GAD. Außerdem fügen wir dieses OT nicht hinzu. Wir werden den Schrägstrich OT als Präfix erwähnen, genauso wie wir das Präfix für die Benutzerroute definieren Jetzt unten müssen wir diese Route exportieren. Der Export von Modulpunkten entspricht also dem Router. Speichern Sie das und bevor wir vergessen, diese Route zur Indexpunkt-JS-Datei hinzuzufügen , fügen wir sie hinzu. Nach der Route dieses Benutzers fügen wir app.us hinzu. Hier fügen wir das Präfix API OT hinzu. Beim zweiten Parameter müssen wir Auth-Routen übergeben Wir geben also die Kosten für Os-Routen ein, die dem Wert „Erforderlich“ entsprechen. Los geht's in den Routenordner OT. Jetzt übergeben wir einfach diese anderen Routen in dieser App nach der Methode. Jetzt zurück zur Auth Dot JS-Datei. Hier haben wir den Benutzer Xs API Auth Slash Google angegeben. Es sollte die Google-Anmeldeseite öffnen Nachdem sich die Benutzer erfolgreich angemeldet haben, müssen wir das, was wir tun möchten, auch angeben Denken Sie daran, dass wir zuvor Strategiecode in der Passport Dot JS-Datei Wenn Sie diesen Code verstehen, werden wir auch einige Änderungen an diesem Code vornehmen Zuallererst benötigen wir oben einen Reisepass aus der Passbibliothek, benötigen wir oben einen Reisepass aus weil wir ihn hier verwenden. SeconctPassport entspricht eines Reisepasses und der Änderung dieses R zu den Kosten Danach haben wir den Reisepass-Punkt-Bug und darin haben wir eine neue Google-Strategie, die wir vom Reisepass über den Google-Autor bis zum Paket erhalten Google-Autor bis zum Bei dieser Strategie müssen wir keinen manuellen Code schreiben, um den Autorisierungscode abzurufen und Daten vom Google-Server zu extrahieren Diese Strategie erledigt all das für uns. Danach haben wir ein Objekt mit einer Reihe von Eigenschaften wie Client-ID und Client-Geheimnis. Sie erhalten diese ID, wenn Sie Ihre App bei der Google Console registrieren Damit erhalten wir auch den Geheimcode des Kunden. Ohne diese beiden Ausfüllungen Google uns keine Nutzerdaten. Lassen Sie uns das also auch generieren. Nochmals, ich sage dir, mach dir keine Sorgen um diesen Code. Wenn wir diese Implementierung abgeschlossen haben, werde ich Ihnen den vollständigen Workflow dieses Codes zeigen. Suchen Sie im Browser nach Google Cloud Console. Öffnen Sie diesen zweiten Link. Hier müssen wir uns mit unserem Google-Konto anmelden. Sie können jedes Konto verwenden. Jetzt, nach dem Einloggen, sieht es so aus. Sie sich keine Sorgen, gehen Sie einfach hier auf Projekt auswählen und erstellen Sie ein neues Projekt. Gib ihm einen Namen. Sagen wir Card Wish und klicken Sie auf Erstellen. Hier in der Benachrichtigung wird dieses Projekt erstellt und ausgewählt. Wenn wir dieses Projekt auswählen, können wir es hier sehen. Jetzt brauchen wir API und Dienste. Klicken Sie auf diese drei Zeilen und in der API und den Diensten gelangen wir zum O OT-Inhaltsbildschirm. Mach es einfach wie ich und schon kann es losgehen. Klicken Sie auf diese Schaltfläche „ Erste Schritte“. Hier müssen wir einige Konfigurationseinstellungen vornehmen. Zuallererst müssen wir hier den Namen der App schreiben. Auch hier schreiben wir Cartwish. Wählen Sie danach Ihre Support-E-Mail aus und klicken Sie auf Speichern. Jetzt müssen wir hier die Art der Zielgruppe auswählen , wählen Sie hier extern aus. Dadurch kann sich jeder Benutzer in unsere Anwendung einloggen und auf Weiter klicken. Hier schreiben wir unsere E-Mail, über die wir eine Benachrichtigung zu dieser App erhalten möchten eine Benachrichtigung zu dieser App und klicken dann auf Weiter, genaue Bedingungen und fahren fort und erstellen die App. Jetzt gehen wir über die linke Seitenleiste zum Datenzugriff . Hier müssen wir den Umfang der Benutzerdaten auswählen. Geltungsbereiche drücken die Erlaubnis Nutzer zur Autorisierung für Ihre App zu bitten , und ermöglichen Ihrem Projekt den Zugriff auf bestimmte Arten von Daten privater Nutzer über ihr Google-Konto Klicke einfach auf Bereiche hinzufügen oder entfernen. Wählen Sie den ersten aus, dem Sie eine E-Mail senden und Profil erstellen möchten, und klicken Sie auf Aktualisieren und speichern Sie dies Gehen Sie jetzt zu dieser Zielgruppe und hier können wir Taste-Benutzer hinzufügen. Manchmal, wenn sich unsere Benutzer nach der Implementierung nicht anmelden können, müssen wir sie möglicherweise zu den Taste-Benutzern hinzufügen. Als ich das gemacht habe, habe ich keinen Fehler gefunden. Also mach dir darüber keine Sorgen. Gehen Sie einfach zu Kunden. Hier müssen wir OO-Anmeldeinformationen generieren und dafür klicken wir auf Create Client. Wählen Sie den Anwendungstyp für die Webanwendung aus. Name, den wir nicht ändern müssen. Aber unten müssen wir autorisierte Weiterleitungs-URIs hinzufügen Eine Weiterleitungs-URI ist der Endpunkt in unserer Backend-Anwendung , an den Google den Nutzer nach erfolgreicher Anmeldung weiterleitet Hier schreiben wir STP, Spalte mit doppeltem Schrägstrich, lokaler Host, Spalte 3.000 API OT, Google, Schrägstrich, Callback Merken Sie sich diesen Endpunkt. Wir müssen diese API in unserem Backend definieren. Und klicken Sie auf Erstellen und fertig. Siehst du, hier bekommen wir die Client-ID und auch das Client-Geheimnis. Kopieren Sie diese Kunden-ID und in unserer Anwendung können wir an der Stelle dieser Google-Client-ID diese ID als Seite speichern oder, um sie zu sichern, in einer ENV-Punkt-Datei ablegen Ich denke, das ist sicherer. Was denkst du? Also in der Punkt-ENV-Datei bei der neuen Variablen, Google, Unterstrich, Client-Unterstrich-ID Entspricht, um sicherzustellen, dass Sie keinen Speicherplatz hinzufügen und die Client-ID Ihrer Google-Anwendung hier einfügen Kopieren Sie anschließend dieses Client-Geheimnis zurück nach VSCode und geben Sie einfach Google, Underscore, Client, Underscore Entspricht Base Here Secret. Speichern Sie diese Datei und kehren Sie zur Passport Dot JS-Datei zurück. Hier übergeben wir den Prozess mit Punkt und Punkt an Google, unterstreichen die Kunden-ID Und hier übergeben wir den Prozess Punkt und Punkt Google, unterstreichen den Kunden, unterstreichen Danach haben wir die Callback-URL-Eigenschaft. Stellen Sie sicher, dass wir hier denselben Endpunkt schreiben , den wir in unserer Google Console App übergeben Wir können das von hier aus sehen, klicken Sie auf diese Schaltfläche zum Bearbeiten und hier haben wir die Callback-URL Kopiere das und füge es in Doppelcodes ein. Am Ende dürfen Sie diese Eigenschaft „Anfrage an Rückruf weiterleiten“ nicht berühren diese Eigenschaft „Anfrage an Rückruf weiterleiten Stellen Sie sicher, dass sie auf true gesetzt ist. Es wird das Anforderungsobjekt an diese Callback-URL übergeben. Danach, beim zweiten Parameter, haben wir die Callback-Funktion, oder wir können die Strategie-Callback-Funktion sagen Diese Funktion wird ausgeführt, wenn sich Benutzer erfolgreich mit ihren Daten angemeldet haben. Hier erhalten Sie ein Anforderungsobjekt, Zugriffstoken, ein von Google für unsere App ausgegebenes Token Es ermöglicht unserer App, im Namen des Nutzers autorisierte Anfragen an Google-APIs zu stellen . Danach haben wir ein Refresh-Token, ein Token, das verwendet werden kann, um ein neues Zugriffstoken zu erhalten , wenn das aktuelle abläuft. Keine Sorge, das brauchen wir vorerst nicht. Danach haben wir ein Profil , ein Objekt mit Informationen über den authentifizierten Benutzer wie Name, E-Mail, Google-ID usw. Holen Sie sich diese Daten von Google, und das hängt wirklich von den von uns angeforderten Bereichen Und am Ende haben wir es geschafft, die Funktion, die Sie aufrufen , wenn Sie die Verarbeitung der Benutzerdaten abgeschlossen In dieser Funktion wollen wir jetzt keinen Benutzer finden oder einen neuen Benutzer erstellen. All das werden wir in dieser Callback-API tun. Also hier entfernen wir diesen Code und wiederholen hier einfach die fertige Methode Beim ersten Argument übergeben wir einen Fehler, der Null ist. Beim zweiten Argument müssen wir Benutzerdaten übergeben. In diesem Fall können wir das Profil direkt übergeben. Zusammenfassend lässt sich sagen, dass, wenn sich Nutzer erfolgreich bei Google angemeldet haben, der strategische Rückruf ausgeführt wird und in diesem Profil erhalten wir Benutzerdaten von Wenn wir nun diese Methode „ done“ mit einer Null aufrufen und Nutzerdaten als Profil angeben, führt Passport diesen API-Endpunkt aus, und wir werden diesen Endpunkt in der nächsten Lektion definieren 105. OAuth mit JWT: Definieren wir nun diesen letzten Schritt der Google-Authentifizierung, bei dem diese Callback-API hinzugefügt wird Wo wir diese API hinzufügen, werden wir sie in den Routen shorthTjsFLE definieren Hier fügen wir bereits eine API hinzu, was Schritt eins ist. Jetzt fügen wir hier eine weitere Router-Punkt-Get-Methode hinzu, Endpunkt-Slash, Google-Slash-Callback Sie müssen es genauso angeben, wie Sie es in der Callback-Eigenschaft übergeben Wie wir wissen, sendet Google Nutzungsdaten auf dieser Rückrufroute, und dafür müssen wir uns erneut an Passport Middleware halten Passport Punkt authentifizieren. Hier übergeben wir Google beim zweiten Argument, wir setzen Objekt mit Eigenschaft, was SSN ist, auf Dadurch wird die Passport-Bibliothek angewiesen, die Benutzer-ID in der Sitzung nicht zu speichern Außerdem übergeben wir eine weitere Eigenschaft, einen Fehler, eine Weiterleitung Wenn die Benutzerdaten ausfallen, leitet der Google-Server unseren Benutzer hier weiter. Also hier müssen wir unsere Frontend-URL übergeben. Hier übergeben wir zum Beispiel die Local React-App. Sie können eine SDTP-Spalte und einen doppelten Schrägstrich (Local Host) schreiben doppelten Schrägstrich (Local C5173 Anmeldung mit Schrägstrich. Das ist sehr wichtig. Danach können wir unsere Callback-Funktion hinzufügen, die wir ausführen, nachdem wir von hier aus Profildaten aus dem Passwortstrategie-Callback gesendet haben Profildaten aus dem Passwortstrategie-Callback Wie können wir nun Daten in diesem Rückruf abrufen? Wir erhalten also Daten im Request-Punkt-Benutzer, und wir speichern diese unveränderliche Variable namens profile und geben dieses Profilobjekt einfach im Antwortpunkt Json zurück und übergeben das Lassen Sie uns nun testen, ob das funktioniert oder nicht. diese Implementierung zu testen, müssen wir eine Get-Anfrage an den Endpunkt senden. Öffnen Sie den Browser und gehen Sie zu SGTP Column Double Forward Slash Lokaler Host, Spalte 3.000. Wenn Ihre Anwendung auf einem anderen Pod läuft, müssen Sie hier Ihre Bean-URL und dann den Schrägstrich API oder Google mit einem Schrägstrich versehen Und hier bekommen wir einen Fehler. Es heißt Fehler und Nichtauthentifizierungsstrategie, Google. Lass mich nachschauen. Die Google-Strategie ist korrekt. Außerdem übergeben wir den richtigen Namen der ENV-Variablen. Lassen Sie mich das noch einmal überprüfen. Ja, sie sind gleich. Oh, warte. Wir haben diese Passport-Punkt-JS-Datei nicht zu unserer Indexpunkt-S-Datei hinzugefügt, und aus diesem Grund wurde diese Datei in unserer Anwendung nicht konfiguriert. Ich denke, das ist der Grund, warum wir diesen Fehler bekommen. Gehen Sie also zur Indexpunkt-Gs-Datei, und oben fügen wir require hinzu, wir gehen zum Ordner Config und zum Passport. Sehen Sie sich die Änderungen an und lassen Sie uns unsere Anwendung neu starten. Mein Indexpunkt js. Jetzt zurück zum Browser und ich lasse die Seite ruhen. Siehst du, wir leiten direkt zur Google-Anmeldeseite weiter. Hier sehen wir unseren Anwendungsnamen , den wir in unserer Google-Konsole erwähnt haben. Gut. Jetzt müssen Sie Ihre Google-Kontodaten eingeben und sich einfach damit anmelden. Hier werden Sie um Ihre Erlaubnis gebeten, Google zu erlauben , Ihre E-Mail - und Profildaten an diese Anwendung zu senden . Fahren Sie fort, und hier können Sie sehen, dass wir das Benutzerprofildatenobjekt erhalten. Ganz oben sehen wir den Anbieter, das ist Google ID, was die Google Unique ID ist. Zeigen Sie den Namen neben Ihrem Namen an, der E-Mail-Unterstrich wurde als wahr bestätigt , sodass wir die EML-ID und viele weitere Details erhalten Sie können jede dieser Angaben verwenden und sie in Ihrer Datenbank speichern Damit haben wir unsere Hauptarbeiten für die Google-Authentifizierung abgeschlossen . Jetzt müssen wir nur noch überprüfen, ob ein Benutzer mit dieser EML-ID bereits in unserer Anwendung verfügbar ist oder nicht Es ist nicht verfügbar, dann erstellen wir einen neuen Benutzer mit seinem E-Mail-Namen, der Google-ID, aber wir lassen das Passwort da wir für die Anmeldung bei Google oder Facebook kein Passwort benötigen, und dann generieren wir ein JWT-Token für die Daten dieses Benutzers Wenn der Nutzer bereits in unserer Datenbank verfügbar ist , machen Sie sich keine Sorgen Wir aktualisieren einfach seine Google-ID in unserer Datenbank und generieren dann JWT-Token für die Daten dieses Benutzers Um dies zu implementieren, müssen wir Schema unseres Benutzers ein wenig ändern Wie werden diese Änderungen vorgenommen, da wir in unserer Anwendung Benutzer haben, die sich mit E-Mail und Passwort anmelden können, und einige Benutzer können sich auch mit Google anmelden. Lassen Sie uns zunächst das Benutzerschema ändern. Hier setzen wir das Passwort, required, auf true. Aber wie wir wissen, speichern wir kein Passwort, wenn sich ein Nutzer mit Google anmeldet, also müssen wir required auf false ändern. Wenn wir mit Google Login einen neuen Nutzer erstellen, speichern wir auch nicht die Lieferadresse. So können wir für die Adresse auch required auf false setzen und auch diese Eigenschaft für die mittlere Länge entfernen. Danach können wir ein weiteres Feld für Nutzer hinzufügen , die Google für die Anmeldung verwendet haben. Wir fügen der Zeichenfolge den Google-ID-Typ und True den eindeutigen Typ hinzu. Sie fragen sich vielleicht, warum wir diese Google-ID in unserer Datenbank benötigen? Wir benötigen diese Google-ID, weil wir damit identifizieren können, ob der Nutzer bereits in unserer Datenbank verfügbar ist oder nicht. Aber hier haben wir bereits E-Mails von Benutzern. Warum können wir diese E-Mail nicht verwenden? Siehst du, im Browser bekommen wir diese Profildetails. Hier haben wir die E-Mail-Eigenschaft , also die Reihe von E-Mails. Ein Google-Konto hat eine oder mehrere E-Mails wie hurled gmail.com, was die primäre E-Mail ist, hurleredcorporate.com Wenn Harley seine primäre E-Mail-Adresse ändert, für dasselbe Google-Konto ein neues können wir für dasselbe Google-Konto ein neues Benutzerkonto erstellen. Um dieses E-Mail-Risiko zu beseitigen, speichern wir die Google-ID. Ein weiterer Grund, warum wir hier Google ID verwenden müssen, ist dass jemand seine E-Mail-Adresse des Google-Kontos ändern kann, die Google-ID jedoch nicht. Google-ID ist für alle Google-Nutzer einzigartig Aus diesem Grund speichern wir die Google-ID der Nutzer. Außerdem dient die Google-ID nur zur Identifizierung der Nutzer, die sich über Google anmelden, und nicht zur Identifizierung von Nutzern, die ein Konto mit einer einfachen E-Mail-Adresse und einem Passwort erstellt haben . Für diese verwenden wir E-Mail zur Identifizierung. Speichern Sie diese Datei und lassen Sie uns schnell unsere Logik in diese Google-Callback-Route schreiben Ich schreibe einen Kommentar zu dieser Logik. Zuerst überprüfen wir, ob der Nutzer mit seiner Google-ID oder per E-Mail verfügbar ist oder nicht. Wenn der Nutzer verfügbar ist, aktualisieren wir sein Google-ID-Feld und generieren dann einfach das JWT-Token und senden es in der Antwort Hier müssen wir das Passwort nicht verifizieren , da der Nutzer bei Google angemeldet ist Wenn der Benutzer nicht verfügbar ist, erstellen wir einen neuen Benutzer mit Namen, E-Mail und Google-ID, generieren dann JWT-Token und senden es als Antwort Am Ende müssen wir das JWT-Token an das Frontend senden , so einfach ist Zuallererst, welcher Benutzer verfügbar ist oder nicht. Dafür benötigen wir eine Benutzersammlung. Also ganz oben, Kosten pro Nutzer gleich Bedarf, wir gehen einen Ordner höher als die Modelle der Benutzer Jetzt schreiben wir unten eine feine Abfrage, einen Benutzerpunkt Und hier übergeben wir Object und fügen die Bedingung, Google-ID, hinzu. Um die Punkt-ID zu profilieren. Was ist auch, wenn sich jemand zuerst mit E-Mail und Passwort anmeldet und dann versucht, sich mit Google anzumelden. Derzeit haben wir die Google-ID dieses Nutzers nicht in unserer Datenbank gefunden . Wir müssen also auch Benutzer anhand von E-Mails finden. Sie können hier unseren Operator verwenden. Wir fügen Dollar oder Spalte hinzu, und wir müssen hier ein Array mit mehreren Bedingungen hinzufügen. Also fügen wir ein Bedingungsobjekt, Google-ID, zur Profilpunkt-ID und das zweite Bedingungsobjekt, E-Mail, zur Profilpunkt-E-Mail hinzu. Nun, hier ist eine Sache. Dieses E-Mail-Feld mit Profilpunkt wird nicht zu 100% verfügbar sein. Für einige Google-Konten funktioniert es und für einige Konten funktioniert es nicht. hat sich daher bewährt, dass Entwickler dieses E-Mail-Feld mit Profilpunkt nicht verwenden. Sie verwenden E-Mails mit Profilpunkten, also dem Array, auf dessen erstes Element wir über den Nullindex in eckigen Klammern zugreifen dessen erstes Element wir über den Nullindex in eckigen Klammern Wert halten wir uns an den Punktwert. Wie wir wissen, gibt diese Abfrage ein Versprechen zurück, sodass wir wait einhalten können, indem wir das Benutzerobjekt in der Variablen let user speichern. Await verwenden zu können, müssen wir außerdem dafür sorgen, dass dieser Callback aktiviert wird. Jetzt haben wir hier zwei Szenarien. Wenn der Benutzer verfügbar ist und der Benutzer sonst nicht verfügbar ist. Was wir nun tun wollen, wenn der Nutzer verfügbar ist, werden wir überprüfen, ob die Google-ID gespeichert ist oder nicht. Wenn die Google-ID des Benutzers nicht verfügbar ist, legen wir die Google-ID für den Benutzerpunkt fest. Entspricht der Punkt-ID des Profils. Diese Profilpunkt-ID ist Google-ID. Und danach schreiben wir zur Speicherunterstützung await user dot save. Im anderen Fall müssen wir die Logik für den Benutzer schreiben , der nicht existiert. Im Grunde werden wir einen neuen Benutzer erstellen. Wir schreiben also, dass Benutzer gleich neuem Benutzer ist. Hier übergeben wir ein Objekt mit Eigenschaften. Der erste ist der Name des Profils, der Punktanzeigename. Dann E-Mail an Profil Punkt-E-Mails. Hier greifen wir auf den Punktwert des ersten Elements zu. So wie wir es zuvor getan haben. Letzte Eigenschaft, wir benötigen eine Google-ID, um die Punkt-ID zu profilieren. Um diesen neuen Benutzer zu speichern, schreiben wir hier await user dot save. Du musst nur eine Sache tun. Generieren Sie das JWT-Token und senden Sie es. Das Cost-Token entspricht also der Route des Benutzers Wir kopieren diese JWT-Signmethode zum Generieren von Token und fügen sie Hier müssen wir im Tempo dieser Datenvariablen Daten, wir senden möchten, innerhalb des Tokens übergeben senden möchten, innerhalb des Tokens Und was wir beim Login übergeben haben, ja, wir geben nur ID und Namen weiter. Also hier übergeben wir auch die Underscore-ID, nicht die Google-ID. Google-ID dient nur Backend zur Überprüfung dieser Bedingung Kopieren Sie einfach dieses Datenobjekt und übergeben Sie es hier. Wenn Sie auch eine E-Mail senden möchten, können Sie das auch angeben Aber es ist in jedem Fall wichtig, dass Sie dieselben Details senden Es wird für das Frontend einfach sein, diese Daten zu verwenden. Stellen Sie außerdem sicher, dass wir hier JWT importieren müssen. Die Kosten für JWT entsprechen dem erforderlichen JSON-Webtoken. An der Stelle, an der wir diese Profildetails als Antwort senden, senden wir nun diese Profildetails als Antwort senden, das JWT-Token Scheinbar senden wir das Token bei der einfachen Registrierung und Anmeldung mit E-Mail und Passwort Manchmal fordern Frontend-Entwickler Sie auch auf, Benutzer direkt auf die Startseite des Frontends weiterzuleiten Zu diesem Zeitpunkt können wir so etwas tun. Antwortpunkt redIC und hier verwenden wir den Template-String. Hier müssen wir die URL unserer Frontend-Seite angeben , auf die wir den Nutzer nach erfolgreicher Anmeldung bei Google weiterleiten möchten Nutzer nach erfolgreicher Anmeldung bei Google F lokal können wir SDDP, Column Double für Slash Local Host, Column 5173, was die EditRact-App ist, schreiben Column Double für Slash Local Host, Column 5173, was die EditRact-App ist, Hier müssen Sie Ihre Frontend-URL und Ihr Slash-Dashboard schreiben . Hier übergeben wir das Token im Abfrageparameter mit einem Fragezeichen, das Token entspricht den Dollar-Cali-Klammern, Sie können diese URL auch nach Belieben ändern. Es hängt wirklich von Ihrem Frontend ab. Viele Entwickler leiten Benutzer weiter, und einige Entwickler senden nur Token. Ich zeige Ihnen beide Möglichkeiten. Sie können wählen, was auch immer Ihnen Ihr Frontend-Entwickler sagt. Schließlich haben wir die Funktion „Mit Google anmelden“ in unserer Anwendung implementiert . Lassen Sie uns zusammenfassen, was wir in den letzten beiden Lektionen getan haben. Zunächst klickt der Nutzer auf die Schaltfläche „Mit Google anmelden Unser Frontend leitet den Benutzer zum lokalen Host weiter. Spalte 3.000 Schrägstrich API Ath Slash Google Dies ist unsere Bend-URL. Wenn Ihr Backend auf dem lokalen Host 8.000 läuft, sollte der Benutzer auf den lokalen Host 8.000 API Auth Google umleiten 8.000 API Auth Wenn der Benutzer jetzt zu API Auth Google weiterleitet, wird dieser Code ausgeführt dieser Hier erwähnen wir Passport Dot Authenticate bei Google und erwähnen den Geltungsbereich Danach wird direkt dieser Code ausgeführt, in der Passport-JS-Datei verfügbar ist Hier sendet Passport unsere Kunden-ID, Kundengeheimnis und die Rückruf-URL, an die wir Profildaten senden möchten Nachdem sich Nutzer erfolgreich mit dem Google-Konto angemeldet und die Erlaubnis erteilt haben, wird diese Funktion ausgeführt Hier geben wir die Methode mit dem Fehler Null und den Profildaten zurück mit dem Fehler Null und den Profildaten Auf diese Profildaten können wir als Request Dot-Benutzer in unserer Callback-Funktion zugreifen als Request Dot-Benutzer in unserer Callback-Funktion außerdem sicher, dass wir Anfrage zum Rückruf nicht an True weiterleiten können Danach wird unsere Callback-API ausgeführt, und hier schreiben wir unsere Benutzerlogik, und dann senden wir den Benutzer mit einem Token oder leiten ihn weiter So einfach ist das. Ich bin mir sicher, dass alle Ihre Zweifel klar sind. Keine Sorge, das ist dein erstes Mal und deswegen bist du etwas verwirrt. Aber mit der Zeit werdet ihr das ohne jegliche Verwirrung verstehen. Die letzten beiden Lektionen sind etwas lang, aber sehen Sie sich einfach an, was Sie in Ihrer Anwendung implementiert haben . Herzlichen Glückwunsch dazu, Sie können eine kleine Pause vom Bildschirm und dann diesen Abschnitt fortsetzen. 106. Anmeldung mit Facebook über OAuth: Daher haben wir zuvor die Anmeldung mit Google hinzugefügt. Jetzt können wir auch die Anmeldung mit Presbook oder einer anderen Plattform wie Github oder Twitter hinzufügen oder einer anderen Plattform wie Github oder Twitter Es gibt einige allgemeine Schritte, denen wir folgen müssen. Schritt Nummer eins: Installieren Sie Passport- und Passport-Strategiebibliothek in der Knotenanwendung. Schritt zwei: Fügen Sie den ersten API-Endpunkt hinzu , der den Passport mit dieser Strategie auslöst. Schritt Nummer drei: Fügen Sie Pass-Strategiecode in die Passport-DOT-JS-Datei ein. Genauso wie wir die Google-Strategie hinzufügen. Schritt Nummer vier: Generieren Sie ID und das Geheimnis für diese Plattform. Schließlich, Schritt Nummer fünf, definieren Sie die Callback-API, speichern Sie bei Bedarf Benutzerdaten und senden Sie das JWT-Token Mit diesen fünf Schritten können wir jede Plattform in OT hinzufügen Lassen Sie mich Ihnen schnell zeigen, wie wir die Anmeldung mit Facebook implementieren können . Schritt Nummer eins: Wir müssen die Pass-Strategie installieren. Wir gehen zu den Passdokumenten und suchen hier nach Facebook. Schau, hier bekommen wir den Installationsbefehl, kopieren ihn und fügen ihn einfach in unser Terminal ein. Wenn Sie dieselbe Version verwenden möchten, die ich verwende, können Sie hier auch 3,0 0,0 hinzufügen und die Eingabetaste drücken. Jetzt Schritt Nummer zwei, wir müssen API und Punkt hinzufügen, wodurch die Facebook-Anmeldeseite geöffnet wird. Scrollen Sie also in der Passdokumentation nach unten. Und hier bekommen wir API-Code. Siehst du, es sieht der Google-API sehr ähnlich. Denken Sie daran und kopieren Sie einfach diese erste API. Und in unserer th dot js-Datei nach dieser Callback-API fügen wir sie nach dieser Callback-API einfach hier Hängen Sie diesen API-Punkt auf Facebook mit Schrägstrich und authentifizieren Sie sich mit Passport Dot bei Facebook, und für den Umfang müssen wir hier ein öffentliches Profil und eine E-Mail mit Unterstrich angeben Schritt Nummer drei: Wir müssen den Pass-Strategiecode für Facebook hinzufügen Pass-Strategiecode Gehen Sie also erneut zur Passport-Website und kopieren Sie diesen Strategiecode. Zurück zur viscodeopen passport dot js-Datei und einfach unten fügen wir diesen Jetzt müssen wir einige Korrekturen vornehmen. Zuallererst müssen Sie die Facebook-Strategie aus dem Paket importieren . Duplizieren Sie also diese Google-Strategielinie und ändern Sie diesen Variablennamen einfach in Facebook-Strategie. So wie sie es hier verwenden, und wir ändern auch den Paketnamen in Passport Facebook. Gut. Jetzt müssen wir hier diese Felder Facebook-ID und Facebook-Geheimnis hinzufügen Facebook-ID und Facebook-Geheimnis , was der vierte Schritt ist. die App-ID und das App-Geheimnis zu generieren, Um die App-ID und das App-Geheimnis zu generieren, müssen wir zur Facebook-Entwicklerseite gehen. Erwähnen Sie alle Details der Passwortdokumentation für jede Plattform. Mach dir darüber keine Sorgen. Der neue Tab, suche hier, Facebook, Entwickler, Konsole und öffne diesen ersten Link. Klicken Sie hier auf Anmelden. Ich melde mich mit meinem Konto an. Gut. Nach dem Einloggen erhalten wir hier die Option Erste Schritte. Möglicherweise werden Sie nach dem Register und der Bestätigung gefragt. Führen Sie die grundlegenden Schritte aus und Sie werden dann zu dieser Apps-Seite weitergeleitet. Klicken Sie auf App erstellen. Hier schreiben wir den Namen unserer App, nämlich Cardwis. Dies sind dieselben Details, die wir in die Google Console eingeben Fügen Sie nun Anwendungsfälle hinzu, damit wir uns authentifizieren und Daten von Benutzern mit Facebook-Login anfordern möchten Daten von Benutzern mit Facebook-Login Das gefällt uns und wir klicken auf Weiter. Wählen Sie hier, Ich möchte kein Geschäftsportfolio verbinden. Möglicherweise steht Ihnen diese Option nicht zur Verfügung, da Facebook in letzter Zeit diesbezüglich strikt vorgeht. Es tut mir leid, wenn du die Option hier nicht bekommst, aber mach dir keine Sorgen, schreibe einen Code, während ich schreibe. In Zukunft müssen Sie nur noch die Facebook-App-ID und das App-Secret hinzufügen . Klicken Sie hier auf Weiter und Weiter und fertig, gehen Sie hier zu Deskboard Wir müssen diese Schritte ausführen Klicken Sie also auf Anpassen und fügen Sie eine Facebook-Anmeldeschaltfläche hinzu. Hier hatten wir die Erlaubnis. E-Mail hinzufügen und öffentliches Profil ist bereits hinzugefügt. Klicken Sie jetzt auf diesen Schnellstart. Hier wählen wir direkt hier Web aus, unsere Frontend-URL. Schreiben Sie vorerst einfach hier, STTP, Spalte mit doppeltem Schrägstrich, Lokaler Host, Spalte In der Realität müssen Sie hier Ihre Frontend-URL schreiben und auf Speichern und fortfahren klicken Klicken Sie auf Weiter, klicken Sie auf Weiter, klicken Sie auf Weiter und fertig. Gehen Sie nun einfach unten zur App-Einstellung und dann zur Grundeinstellung. Hier bekommen wir Apid und App Secret. Kopieren Sie diese APD und in unserer DOT-ENV-Datei fügen wir eine weitere Variable namens Facebook, underscore-App, underscore-ID Hinter der App-ID. Danach fügen wir eine weitere Variable namens Facebook Underscore App Underscore Secret entspricht Zurück zum Browser, und hier klicken wir auf Show it may frage dein Facebook-Passwort, schreiben das und sehen wir hier, wo wir den Geheimcode sehen können Kopieren Sie das und fügen Sie es einfach in die ENV-Datei ein. Speichern Sie die Datei und kehren Sie zur Passport Dot JS-Datei zurück. Hier unterstreichen wir bei process.nw Facebook die App Und hier verarbeiten wir auch dot nwt Facebook Danach kopieren wir einfach diese beiden Eigenschaften aus dem vorherigen Code, der Callb-URL, und leiten die Anfrage an den Rückruf weiter und fügen sie hier für Facebook Genau hier müssen wir die Callback-URL in Slash API Oath und Slash Facebook Callback ändern API Oath Außerdem müssen wir eine weitere Eigenschaft hinzufügen, da Facebook nicht wie Google ist Facebook sendet nicht viele Daten, also müssen wir eine Eigenschaft namens Profilfelder für das Array angeben namens Profilfelder für das Array und in diesem Array die Namen aller Felder von Facebook hinzufügen Wir fügen die ID hinzu, die eindeutige Facebook-ID, und sie ist für jeden Facebook-Nutzer einzigartig, genau wie die Google-ID. Außerdem geben wir E-Mails für E-Mails, Namen und Anzeigenamen weiter. Komma, Bild, Punkt, Typ, und in der Klammer Dies dient zum Abrufen eines Profilbilds. Die meisten Anwendungen verwenden diese Daten. Hier zum Rückruf, wir wollen das Gleiche wie bei dieser Google-Strategie tun Also kopieren wir einfach diesen Strategie-Callback und stützen ihn auf die Facebook-Strategie Hier ist unser vierter Schritt abgeschlossen. Speichern Sie diese Datei. Jetzt letzter Schritt Nummer fünf, wir müssen nur diese Rückrufroute für Facebook definieren diese Rückrufroute für Facebook Öffnet eine Punkt-GS-Datei. Hier können wir diesen Google-Callback einfach kopieren und unten einfügen Ebenfalls oben stelle ich fest, dass wir diese App Dot GAD auf Router Dot Gat ändern müssen Gut. Zuallererst ändern wir die API und zeigen auf den Schrägstrich Facebook Slash Callback und auch im Passport Punkt Authenticate an der Stelle von Google Jetzt müssen wir im API-Callback diese Google-ID mit der Facebook-ID ändern Wir müssen also ein weiteres Feld in unserem Benutzerschema hinzufügen , das der Google-ID entspricht Wählen Sie hier Google ID aus und drücken Sie Control plus T oder Command Plus und wählen Sie alle Google-IDs in dieser Facebook-API aus. Stattdessen fügen wir die Facebook-ID hinzu und müssen nichts ändern. Speichern Sie die Änderungen und vergessen Sie nicht, das Facebook-ID-Feld zum Benutzerschema hinzuzufügen. Öffnen Sie die Punkt-GS-Datei des Benutzers und duplizieren Sie einfach das Google-ID-Feld und ändern Sie seinen Namen in Facebook-ID, und schon kann es losgehen. Speichern Sie die Änderungen, weniger ist das. Öffnen Sie den Browser und gehen Sie zum lokalen Host, Spalte 3.000 Schrägstrich API OT Slash Facebook Sehen Sie hier, dass die App nicht aktiv ist. Auf diese App kann derzeit nicht zugegriffen werden. Der Grund dafür liegt in dieser App, dass wir das Unternehmen nicht hinzugefügt oder verifiziert haben. In letzter Zeit wird Facebook diesbezüglich strikt, aber das spielt keine Rolle, weil wir sehen können, wann wir das machen. Get API with APIs Orth, Schrägstrich Facebook, wir bekommen die Facebook-Seite, was bedeutet, dass unsere API bei uns einwandfrei funktioniert Unser Hauptziel ist es, die Funktion „ Anmelden mit“ zu implementieren. Wenn dein Kunde eine Anmeldung bei Facebook benötigt, kannst du sein Unternehmen nutzen und deine App verifizieren. Danach funktioniert diese Funktion genauso wie unsere Anmeldung bei Google. So implementieren wir Auth für unsere Backend-Anwendung Es ist wirklich einfach. Wir müssen diese fünf Schritte befolgen. 107. Vereinfachung des Codes: Wie wir nun wissen, ist unser Code in diesem Rückruf für beide derselbe Wir ändern nur die Google-ID mit der Facebook-ID. Als bessere Methode können wir eine gemeinsame wiederverwendbare Funktion definieren eine gemeinsame wiederverwendbare Funktion , bei der am Ende einfach ein Token geschrieben wird. Lassen Sie uns diese Logik vom Endbenutzer bis zur Token-Generierung unterbrechen . Unten erstellen wir eine neue Funktion. Der Callback const, handle oder both entspricht der Pfeilfunktion In den Gly-Klammern fügen wir diesen Code und am Ende geben wir einfach das Token diesen Avid verwenden zu können, müssen wir diese Funktion nun zunächst asynchron machen Was wollen wir jetzt hier ändern? Hier benötigen wir diese Profildaten und wir benötigen auch diese Eigenschaft , die wir ändern möchten, Google ID oder Facebook-ID. Wir können hier also zwei Parameter übergeben: das Profil, das sind die vollständigen Profildaten, und danach die Anbieter-ID. Wir können diese Anbieter-ID nicht hinzufügen , weil wir beim Aufrufen dieses Handles oder dieser Callback-Funktion Google-ID oder die Facebook-ID als Zeichenfolge übergeben und diese Zeichenfolge hier nicht hinzufügen können Es wird nicht funktionieren. Wir können hier einfach die Anbieter-ID in eckigen Klammern verwenden. Außerdem können wir an der Stelle des Benutzerpunkts Google-ID die Anbieter-ID des Benutzers in eckigen Klammern schreiben. Dies ist die zweite Möglichkeit, hier und auch im Else-Blog auf den Wert von Objekt A zuzugreifen Wert von Objekt A und fertig. In der Google Callback API nennen wir dieses Handle jetzt die Callback-Funktion. Und übergeben Sie hier das Profil als ersten Parameter, und für die Provider-ID, was wir übergeben werden, schreiben wir hier, Zeichenfolge, Google-ID Stellen Sie sicher den gleichen Feldnamen eingeben, den Sie im Benutzerschema festgelegt haben. Die Ausführung dieser Funktion wird nun einige Zeit in Anspruch nehmen. Also können wir hier await verwenden und diese Funktion gibt Token zurück. Wir können es also in einem variablen Token speichern. Machen wir dasselbe für den Facebook-Callback. Kopieren Sie diese Token-Zeile und im Facebook-Callback vom Let-Benutzer bis zu diesem Token entfernen wir das und fügen hier einfach diesen Funktionsaufruf Vergessen Sie hier nicht, diese Anbieter-ID in eine Facebook-ID zu ändern diese Anbieter-ID in eine Facebook-ID zu Das haben wir gesagt, vollständiger Name? Ja, es ist eine Facebook-ID. Siehst du, jetzt sieht unser Code sauber aus. Im nächsten Abschnitt werden wir nun APIs für Produktkarten- und Benutzerbestellungen erstellen . Das macht wirklich Spaß. 108. Problem mit Einzel-Token [UPDATE]: Sehen wir uns nun an, wie große Unternehmen wie Google, Microsoft und Netflix eine sichere und nahtlose Authentifizierung implementieren, und auf diese Weise implementieren auch andere Anwendungen auf Produktionsebene die Authentifizierung. Sie verwenden zwei Arten von JWT-Token: Zugriffstoken und Aktualisierungstoken Mach dir keine Sorgen über diese großen Worte. Lassen Sie mich Ihnen das in sehr einfachen Worten erklären. Derzeit haben wir in unserer Anwendung eine API für die Registrierung eines neuen Benutzers und dann eine API für die Protokollierung dieses Benutzers erstellt. diesen beiden APIs senden wir JWT-Token an das Frontend und unser Frontend sendet dieses Token im Anforderungsheader mit Trägerpräfix. Mithilfe dieses Headers erhalten wir Benutzerinformationen in unserer Middleware. Nun gibt es zwei Probleme mit diesem Ansatz. Das erste ist das Problem mit dem Ablauf des Tokens. Wir legen die Ablaufzeit des Tokens auf 2 Stunden fest. Nach 2 Stunden muss sich unser Benutzer erneut anmelden, um ein neues Token zu erhalten. Dies ist eine schlechte Benutzererfahrung , da sie sich jedes Mal, wenn das Token abläuft, erneut anmelden müssen. Jetzt könnte man sagen, dass wir die Ablaufzeit erhöhen können , wodurch unsere Benutzererfahrung verbessert wird. Ja, das stimmt, aber auf diese Weise gibt es ein weiteres Problem, das mit dem Sicherheitsrisiko zusammenhängt. Stellen Sie sich vor, wir erhöhen für eine gute Benutzererfahrung die Ablaufzeit auf zehn Tage. Wenn das JWT-Token nun von einer anderen Person gestohlen wird, kann der Angreifer oder Hacker dieses Token so verwenden, wie wir es verwenden, bis das Token In diesem Fall haben wir keine Möglichkeit, uns abzumelden oder das Token zu widerrufen Wir müssen nur warten, bis das Token abläuft. Wie wir also sehen können, können wir die Ablaufzeit nicht verlängern. Diese Ablaufzeit muss auf 5 Minuten oder 10 Minuten festgelegt werden. Um das Nutzererlebnis zu verbessern, Google zunächst diese beiden Token-Konzepte entwickelt, nämlich Zugriffstoken und Repress-Token In der nächsten Lektion werden wir sehen, wie dieses Konzept funktioniert 109. Token zugreifen und Token-Logik aktualisieren [AKTUALISIERT]: Lassen Sie uns nun das Konzept von überschüssigem Token und Aktualisierungstoken verstehen . Anstatt also ein Token zu erstellen, erstellen wir zwei Token in unserer Registrierungs- oder Login-API. Das erste Token haben wir als Excess-Token und das zweite Token als Refresh-Token bezeichnet. beiden handelt es sich um JWT-Token, genauso wie wir am Ende unserer API ein Token generiert haben Aber der einzige Unterschied besteht darin, dass wir bei überschüssigen Token die Ablaufzeit als etwa 5 Minuten oder 10 Minuten oder maximal in Stunden für Referenz-Token festlegen, wir legen die Ablaufzeit so lang fest, zum Beispiel für fünf Tage oder zwei Wochen, überschüssiges Token und Referenz-Token, beide sind JWT-Token Wir können sie mit der JWT-Punktzeichenmethode generieren, aber nur ihre Ablaufzeit ist unterschiedlich Jetzt fragst du dich vielleicht, was einen Unterschied machen würde, wenn du zwei Tokens getrennt erstellst Um es einfach zu machen, erkläre ich Ihnen Ihren vollständigen Arbeitsablauf, damit alle Zweifel geklärt sind. Stellen Sie sich vor, das ist Frontend und das ist Backend. Der Benutzer füllt das Anmeldeformular wie E-Mail und Passwort aus und sendet es ab Im Backend überprüfen wir die Details und vergleichen das Passwort. Wenn die Informationen korrekt sind, erstellen wir zuvor ein Token. Bei diesem Ansatz erstellen wir zwei Token. Eines ist überschüssiges Token und das zweite ist ein Aktualisierungstoken. Wir geben die Ablaufzeit für überschüssiges Token auf sagen wir 5 Minuten und für Aktualisierungstoken geben wir die Ablaufzeit auf fünf Tage an. Wir speichern dieses Aktualisierungstoken in der Sammlung des Benutzers und senden diese beiden Token dann an das Frontend. unserem Frontend setzen wir überschüssiges Token in den globalen API-Header mit einem besseren Präfix, genau wie zuvor. Wenn der Benutzer nun zu viele geschützte APIs verwendet, erhalten wir am Backend ein überschüssiges Token aus dem Anforderungsheader und können die Daten senden, die unser Benutzer benötigt. Stellen Sie sich nun vor, dass unser Zugriffstoken nach 5 Minuten abgelaufen ist. Unser Benutzer hat die API-Anfrage erneut gesendet. Hier prüft unser Backend, ob dieses Zugriffstoken gültig ist oder nicht Hier ist es nicht gültig, vom Backend aus senden wir die Antwort mit dem 401-Fehler in einem gültigen Token Jetzt wird der Entwickler im Frontend Code schreiben. Wenn im Frontend der Fehler 401 angezeigt wird, ruft der Entwickler eine andere API um ein neues Zugriffstoken zu erhalten. Sagen wir OT Slash Refresh. In dieser API können wir jetzt auf das Aktualisierungstoken zugreifen Aber hier müssen wir überprüfen, ob dieses Aktualisierungstoken für diesen Benutzer gültig ist oder nicht. Denken Sie daran, dass wir das Aktualisierungstoken in der Datenbank speichern, wenn wir ein neues Zugriffstoken und ein neues Aktualisierungstoken generieren Aktualisierungstoken in der Datenbank speichern, wenn wir ein neues Zugriffstoken und . Wir können diese beiden Aktualisierungstoken vergleichen , wenn sie übereinstimmen, was bedeutet, dass der Benutzer gültig ist. Zu diesem Zeitpunkt generieren wir erneut ein neues Zugriffstoken, ein neues Aktualisierungstoken, aktualisieren das Aktualisierungstoken in der Sammlung des Benutzers und senden diese beiden Token wie zuvor an das Frontend. Auf diese Weise muss sich der Benutzer nicht immer wieder anmelden. Wenn der Benutzer kein Aktualisierungstoken oder wenn ein Token abgelaufen ist, müssen Sie sich erst dann erneut anmelden. So einfach ist das. Die Frage, die Sie sich vielleicht stellen, ist, was ist, wenn dieses Zugriffstoken gestohlen wird? Damit kann sich der Angreifer leicht Zugriff verschaffen. Ja, das ist möglich, und aus diesem Grund speichern Frontend-Entwickler heutzutage keine überschüssigen Token im lokalen Speicher. Sie speichern es in der Apsis wie JavaScript-Variable oder einen RxTate- oder Redux-Speicher Und selbst wenn ein Angreifer das überschüssige Token immer noch hat, halten wir die Ablaufzeit des überschüssigen Tokens Jetzt fragt ihr vielleicht, dass Angreifer das Refresh-Token auch weiterhin nutzen können. Was ist damit? Und es hat auch ein langes Verfallsdatum. Um dieses Problem an der Stelle zu lösen, an der Refrestocan an das Frontend gesendet wird, können wir refrestocen im SDTPoly-Cookie setzen Was ist nun das SDTPoly-Cookie? Ein SDDPoly-Cookie ist ein spezieller Cookie-Typ , das im Browser ausgeführt wird, nicht zugegriffen werden kann zugegriffen werden Auf dieses reine SDDP-Cookie kann nicht über unseren Browser zugegriffen werden. Unser Browser kann dieses Cookie nur mit dem API-Aufruf senden. JavaScript auf der Seite oder das im Browser ausgeführte JavaScript kann ein Cookie jedoch nicht lesen, ändern oder löschen, wodurch unser Aktualisierungstoken vor Angreifern geschützt ist. Jetzt könnten Sie fragen, ob dieses SDDPoly-Cookie nur an unsere API-Aufrufe gesendet wird oder dass es zusammen mit anderen API-Aufrufen gesendet wird Das ist eine wirklich gute Frage. SDDPoly Cookie verfügt über eine Funktion , die wir als dieselbe Site to Street bezeichnet haben Wir setzen Property, Selbe Site auf Street, sodass dieses reine SDDP-Cookie nur unsere Backend-Domain-APIs sendet, nicht an das Backend an unsere Backend-Domain-APIs sendet, nicht an das Backend einer anderen Person. diesem Grund hat das Referrs-Token ein hohes Maß an Sicherheit, da es nicht per JavaScript darauf zugreifen kann Lassen Sie uns nun das Konzept des Zugriffstokens und des Referenz-Tokens zusammenfassen Konzept des Zugriffstokens und des Referenz-Tokens zusammenfassen Wenn sich ein Benutzer an der Stelle eines Tokens registriert oder einloggt, erstellen wir zwei Token erste Token ist ein überschüssiges Token, dessen Ablaufzeit angefragt wird, und das zweite Token ist ein Aktualisierungstoken, dessen Ablaufzeit lang ist. Wir speichern das Aktualisierungstoken in der Sammlung des Benutzers für diesen Benutzer und senden dann das überschüssige Token an das Frontend. Wir legen das Aktualisierungstoken im SDDPolyoki Das Tolle an SDTPoly Cookie ist, dass es nicht über den JavaScript-Code des Browsers darauf zugreifen kann Freund und Browser können dieses SDTP-Cookie nur mit SddprQuest senden dieses SDTP-Cookie Dies macht unser Aktualisierungstoken sicherer, und wie wir wissen, ist unser Zugriffstoken im Anwendungsstatus verfügbar, nicht im Unsere Bootstoken sind also sicher, und so können wir unseren Benutzern eine bessere Erfahrung und mehr Sicherheit bieten. So einfach ist das. Wir verwenden also ein Zugriffstoken für den Zugriff auf die Daten vom Backend aus und nennen es deshalb Zugriffstoken. Außerdem verwenden wir das Aktualisierungstoken , um unser Zugriffstoken zu unterdrücken, und deshalb nennen wir es Refresh-Token Dieser Workflow ist sehr wichtig für Ihre Anwendung, und viele Entwickler wissen nicht wirklich über diesen vollständigen Workflow Aber ich bin mir sicher, dass Sie jetzt davon wissen , was wirklich großartig ist. In der nächsten Lektion implementieren wir diese Logik in unseren Code. Es wird Spaß machen. 110. Implementieren von Zugriffstoken und Aktualisieren von Token [AKTUALISIERT]: Um nun den Ansatz für überschüssiges Token und Aktualisierungstoken zu implementieren, müssen wir in unserem Backend nur sehr wenige Gebote abgeben Wenn wir einen Benutzer registrieren oder anmelden, müssen wir zunächst zwei Token generieren und Aktualisierungstoken in der Sammlung des Benutzers speichern Danach müssen wir das überschüssige Token zurückgeben, genauso wie wir es zuvor in der Antwort gesendet haben. Und dann müssen wir das Aktualisierungstoken im reinen SGDP-Cookie platzieren, sodass unser Browser-JavaScript nicht auf das Token zugreifen oder es aktualisieren kann Keine Sorge, es ist wirklich einfach. Lass uns das machen. Hier haben wir also eine Funktion zum Generieren von Token erstellt, und wir geben das Token direkt zurück. Anstatt also ein einzelnes Token zu generieren, können wir hier zwei Token generieren. Also ändern wir zuerst diesen Funktionsnamen, um Token zu generieren. Und an der Stelle, an der das geschrieben wurde, speichern wir es in einer Variablen namens Zugriffstoken. Danach duplizieren wir diese Zeile und möchten ein Aktualisierungstoken generieren, z. B. den Variablennamen für das Aktualisierungstoken Außerdem müssen wir den Ablauf des überschüssigen Tokens auf 5 Minuten und den Ablauf des Tokens auf sieben D für sieben Tage aktualisieren . Außerdem möchten wir im Aktualisierungstoken nicht alle Benutzerdaten senden , die wir im überschüssigen Token haben möchten. Also hier an der Stelle der Daten fügen wir einfach ein Objekt mit ID, Spalte und Passierdaten hinzu. Außerdem verwenden viele Entwickler aus Sicherheitsgründen gerne unterschiedliche geheime Schlüssel als Zugriffstoken und Repress-Token Auch hier öffnen wir die DOT-ANV-Datei, und hier an der Stelle des JWT-Schlüssels schreiben wir das Zugriffstoken, schreiben wir das Zugriffstoken Danach erstellen wir eine Variable für Umformulierung, Token und Schlüssel und geben Ihnen jeden Schlüssel, den Sie hinzufügen möchten Speichern Sie das und in unserer Benutzerroute ändern wir in unserer Funktion JWTK in Excess Token, K, und dieses JWTK, um Token umzuformulieren, K. Großartig Jetzt, am Ende dieser Funktion, geben wir ein Objekt mit zwei Eigenschaften zurück: überschüssiges Token, Zugriffstoken, oder wir können dieses Zugriffstoken entfernen und danach das Aktualisierungstoken zurückgeben, um das Aktualisierungstoken zu aktualisieren. Gut. Lassen Sie uns nun sehen, was wir im Register tun müssen, eine neue Benutzer-API. Unten können wir sehen, dass wir diese Funktion zum Generieren von Tokens aufrufen und hier unter quadratischer ID und Namenseigenschaft übergeben . Wie wir wissen, geben wir hier kein einzelnes Token von dieser Funktion zurück. Wir geben ein Objekt zurück, also können wir dieses Objekt hier destrukturieren Zugriffstoken und ein Aktualisierungstoken erhalten In der Antwort geben wir jetzt, wie zuvor, überschüssiges Token zurück Außerdem senden einige Unternehmen in der Antwort auch ein Aktualisierungstoken, aber das werden wir nicht tun. Wir implementieren hier Code auf Produktionsebene. Also werden wir dieses Aktualisierungstoken nur im SDP-Cookie festlegen. Dafür schreiben wir den Antwortpunkt Cookie. Stellen Sie sicher, dass Sie den Antwortpunkt Cookie angeben, bevor Sie den Antwortpunkt senden oder den Antwortpunkt jSn schreiben Antwortpunkt senden oder den Antwortpunkt jSn da wir nach dem Senden der Antwort kein Cookie setzen können Wenn Sie es nach der Antwort Punkt Json schreiben , erhalten Sie eine Fehlermeldung Mit dem ersten Parameter schreiben wir unseren Eigenschaftsnamen. Nehmen wir an, es bezieht sich auf das Token. Danach übergeben wir das Refresh-Token. Beim dritten Parameter müssen wir ein Objekt mit einigen wichtigen Eigenschaften übergeben. Zuerst schreiben wir SGDP nur auf true. Das bedeutet, dass JavaScript im Browser dieses Cookie nicht lesen kann Danach fügen wir secure zu true hinzu, um sicherzustellen, dass das SDP als Anfrage Derzeit testen wir es für lokale STDP-Anfrage und deshalb machen wir es hier Aber zur Erinnerung: Wir schreiben hier den Befehl change this secure to true für die Produktion Danach haben wir denselben Standort wie die Straße. Dadurch beenden wir unser Cookie, um einen weiteren Domain-API-Aufruf durchzuführen. Aber hier müssen Sie sicherstellen, dass sich Ihr Frontend und Ihr Backend auf derselben Domain Zum Beispiel gobleu.com für das Frontend und cola.com für das Backend Wenn Ihr Backend und Frontend auf einer anderen Domain gehostet werden, können wir diese Einstellung auf Keine setzen, was bedeutet, dass unser Cookie auf was bedeutet, dass unser Cookie Hier möchten wir, dass unser Browser Cookies nur für unsere Backend-Plattform sendet Dafür schreiben wir hier Domain-Eigentum in unsere Bend-Domain wie api dotben.com Durch diese Eigenschaft erhält nur diese Domain dieses Cookie, keine andere Derzeit betreiben wir unser Backend auf Local Host 3.000 und im Domain-Feld können wir den lokalen Host 3.000 nicht hinzufügen, können wir den lokalen Host 3.000 nicht hinzufügen da wir hier nur eine echte Domain hinzufügen müssen. Wir kommentieren diese Eigenschaft ebenfalls aus und fügen schließlich maxH zur Ablaufzeit unseres Repress-Tokens Hier vergehen sieben Tage, genau wie die Ablaufzeit unseres Aktualisierungstokens Sieben bis 24 Stunden bis 60 Minuten bis 60 Sekunden bis 1.000 Millisekunden Das bedeutet einfach, dass nach sieben Tagen auch dieses reine STP-Cookie abläuft und entfernt wird und fertig Wir haben das Aktualisierungstoken für SDTPoly Cookie festgelegt. Jetzt müssen wir dasselbe für die Login-API tun. Also kopieren wir diesen Antwortpunkt in die Cooke-Methode und fügen ihn vor diesem Antwortpunkt Jason Also hier an der Stelle dieses Tokens destrukturieren wir das Objekt und bekommen hier das überschüssige Token und das Repress-Token Ändern Sie auch den Funktionsnamen, um Token zu generieren, und hier geben wir überschüssiges Token in der Antwort zurück Wenn wir ein Aktualisierungstoken erstellen, müssen wir dieses Token außerdem in unserer Benutzersammlung speichern, da wir nur damit wissen, ob das Aktualisierungstoken gültig ist oder nicht. Zuallererst fügen wir in unserem Benutzerschema am Ende Refrescen zwei Carly-Klammern hinzu und geben zwei Speichern Sie dies und kehren Sie zur Benutzerroute zurück . Hier in der Anmelderoute fügen wir vor dem Senden des überschüssigen Tokens ein Benutzerpunkt-Aktualisierungstoken hinzu, das dem Aktualisierungstoken entspricht. Und dann fügen wir ein Gewicht Benutzerpunkt s). Nun, hier ist eine Sache. Viele Entwickler speichern aus Sicherheitsgründen gerne ihr eigenes oder verschlüsseltes Aktualisierungstoken in verschlüsseltes Aktualisierungstoken in der Datenbank, und das ist auch eine bewährte Methode. Also können wir auch hier Cost, New Hed, Refresh Token ist gleich await, crypt dot a, hier übergeben wir das Aktualisierungstoken und setzen SALT auf zehn So wie wir das Passwort abhören, übernehmen wir auch das Aktualisierungstoken Hier an der Stelle des Aktualisierungstokens speichern wir das neue Hesed-Aktualisierungstoken Kopieren Sie auch diese Zeilen und in unsere Register-API fügen wir sie hier Außerdem müssen wir dies in ein neues Benutzerpunkt-Aktualisierungstoken ändern und auf Nwuser Punkt CV warten Das ist es. Lass uns überprüfen, ob das funktioniert oder nicht. Speichern Sie die Änderungen und stellen Sie sicher, dass unser Backend läuft. jetzt Postman, öffnen Sie die Login-API und senden Sie die Anfrage Siehst du, hier bekommen wir das neue Token, das unser Zugriffstoken ist Und wenn wir hinter diesem Body-Tab sehen, bekommen wir einen Cookie. Wenn wir das überprüfen, sehen Sie, hier erhalten wir den Namen des Cookies , der ein Aktualisierungstoken ist. Wir geben also Wert, Domain, Pfad abgelaufen, STP nur auf True und Secure auf False zurück, was großartig ist Also haben wir erfolgreich das Aktualisierungstoken im SDDPolygoGI gesetzt. In der nächsten Lektion werden wir nun eine Route erstellen, in der unser Frontend dieses Aktualisierungstoken sendet. Wir überprüfen dieses Token und senden ihnen dann 111. Route für neues Zugriffstoken aktualisieren [AKTUALISIERT]: Wie wir jetzt wissen, sendet das Frontend, wenn unser Zugriffstoken abgelaufen ist, ein Aktualisierungstoken an unser Backend, um ein neues Zugriffstoken zu erhalten. Die Frage ist jedoch, auf welchem Endpunkt das Frontend das Aktualisierungstoken sendet. Wir müssen diesen Endpunkt definieren. In der Autorenroute fügen wir also am Ende den äußeren Punkt, den Endpunkt zur Schrägstrich-Aktualisierung und die Rückruffunktion mit Anfrage und Das ist auch nicht verpflichtend. Wir müssen eine Route namens Refresh definieren. Es ist nur eine übliche Konvention, die Entwickler verwenden. In dieser Funktion müssen wir jetzt kleine Dinge tun. Zunächst prüfen wir, ob das Aktualisierungstoken im Cookie verfügbar ist oder nicht. Um also auf das Cookie zuzugreifen, verwenden wir Request Dot Cookies Dot auf unseren Cookie-Namen, wir so einstellen, dass er das Token unterdrückt Lass es mich dir zeigen. Siehst du, das ist unser Cookie-Name. Jetzt müssen wir diesen Wert in einer Variablen namens User Repress Token speichern Variablen namens User Repress Token Und danach fügen wir einfach eine Bedingung hinzu. Wenn das Benutzer-Repress-Token nicht verfügbar ist, geben wir die JSON-Nachrichteneigenschaft „ Response Dot Status 2401 Dot“ zurück JSON-Nachrichteneigenschaft „ Response Dot Status 2401 Dot kein Aktualisierungstoken angegeben wurde Was ist nun, wenn wir ein Aktualisierungstoken erhalten? Wir müssen dieses Aktualisierungstoken einfach mit dem Token vergleichen , das wir in der Sammlung unseres Benutzers speichern. Nun stellt sich die Frage, woher wir wissen, welcher Benutzer dieses Aktualisierungstoken gesendet hat. Denken Sie dabei daran, wenn wir ein Aktualisierungstoken erstellen, zu dem Zeitpunkt, zu dem wir hier die ID im Token übergeben. Mit dieser ID können wir also das gespeicherte Aktualisierungstoken übergeben. Dafür schreiben wir JWT dot Verify. Zuerst übergeben wir das Aktualisierungstoken, danach müssen wir den geheimen Schlüssel übergeben, nämlich den Prozessdotenv Punkt Refresh-Token-Schlüssel Stellen Sie sicher, dass wir hier den Aktualisierungstoken-Schlüssel hinzufügen , nicht den überschüssigen Andernfalls kann ein Token nicht verifiziert werden. Nun, dieser Ausdruck gibt die Nutzdaten zurück , oder wir können sagen, die Daten Also speichern wir es in der Variablen Decoded User. Angenommen, dieses Token ist nicht gültig. Jemand hat etwas an diesem Token geändert, sodass dieser Ausdruck einen Fehler zurückgeben kann. Also können wir uns daran halten, versuchen, Blog zu fangen und diese Zeile einfach in Dr. Blog und im Cache-Blog hinzufügen , wir bekommen hier einen Fehler und wir geben einfach Antwort, Punkt Status 403, Punkt Jason und Messet Property auf invalid, repress token zurück Punkt Status 403, Punkt Jason und Messet Property auf invalid, repress Nehmen wir nun an, wir bekommen einen dekodierten Benutzer aus dem Token und müssen nun, indem wir das verwenden, das gespeicherte Benutzertoken finden des Benutzers entspricht also einer Gewichtung, der Benutzer sucht nach der ID und übergibt hier die dekodierte Benutzerpunkt-Unterstrich-ID Hier fügen wir auch eine Bedingung hinzu. Wenn der Benutzer nicht verfügbar ist, geben wir den Antwortstatus, den 404-Punkt-Json und die Nachricht an den Benutzer nicht gefunden zurück. Außerdem müssen wir hier, um Await zu verwenden, async für unseren Callback hinzufügen Gut. Wenn der Benutzer jetzt verfügbar ist, müssen wir nur das Token vergleichen. Wie wir wissen, haben wir es in unserer Sammlung als Token gespeichert, also müssen wir es auf die gleiche Weise vergleichen , wie wir unser Passwort vergleichen. Dafür schreiben wir await, decrypt dot compare. Zuerst übergeben wir das Benutzer-Aktualisierungstoken, das wir vom Cookie erhalten, und dann wollen wir es mit dem Benutzer-Punkt-Aktualisierungstoken vergleichen mit dem Benutzer-Punkt-Aktualisierungstoken Dieser Ausdruck gibt zurück, ob es gültig ist oder nicht. Also speichern wir es in einer Variablen. Die Kosten sind gültig. Stellen Sie außerdem sicher, dass wir B-Krypt in diese Datei importieren. Obendrein fügen wir also die Kosten hinzu. B crypt entspricht require, hier fügen wir Wikip hinzu. Jetzt zurück zu unserer Route. Jetzt, danach, müssen wir ihren Zustand bestehen. I is valid ist false, dann geben wir den Antwortstatus 403 Punkt jSn zurück und die Nachricht zum Aktualisieren des Tokens ist nicht gültig Und wenn das Token gültig ist, müssen wir genau den gleichen Vorgang wiederholen , den wir nach erfolgreicher Anmeldung ausführen Wir öffnen hier die Login-API, nachdem wir das Passwort C verglichen haben. Wir generieren ein neues Zugriffstoken und ein neues Aktualisierungstoken als neues Aktualisierungstoken, aktualisieren das Benutzerpunkt-Aktualisierungstoken mit dem neuen Stoken, dann setzen wir das Aktualisierungstoken im Cookie und am Ende geben wir das Zugriffstoken zurück Wir kopieren einfach diesen Code. Und füge ihn in unsere Repress-Route ein. Hier brauchen wir zunächst diese Generate-to-Cs-Funktion Wir können unsere Funktion aus der Routendatei des Benutzers eingeben, aber dafür müssen wir die Eingabe in der Indexpunkt-JS-Datei ändern . Ich möchte Sie damit nicht verwirren, also können wir diese Generate-to-C-Funktion einfach von hier aus kopieren und sie einfach in die Outhoute-Datei einfügen , und fertig Hier ist unsere Refresh-Route-Implementierung abgeschlossen. Lassen Sie uns diese API verwenden, die Änderungen speichern und einen Blick darauf werfen. Öffnen Sie Postman, hier erstellen wir eine neue Anfrage namens Refresh-Token-Methode zum Posten, und hier schreiben wir unsere URL, STP, Spalte Double für Slash Local Host, Spalte 3.000 Schrägstrich-APIs OT, weil sie in der Outthoute ist Slash-Aktualisierung. Senden Sie jetzt einfach die Anfrage. Siehst du, hier bekommen wir die Fehlermeldung, Eigenschaften von undefined können nicht gelesen Ich denke, wir werden mit dem Benutzer-Aktualisierungstoken nicht verrückt Lassen Sie mich versuchen, Dot Log zu konsolen. Der Benutzer repres Token, speichert die Änderungen und sendet die Anfrage Sehen Sie, hier erhalten wir den gleichen Fehler, und wenn wir unseren VIA-Code öffnen, sehen Sie, erhalten wir das Aktualisierungstoken nicht im Konsolenprotokoll, was bedeutet, dass wir das Benutzer-Aktualisierungstoken nicht im Cookie erhalten das Benutzer-Aktualisierungstoken nicht im Cookie Der Grund, warum wir kein Cookie erhalten , ist, dass wir in Node js nicht direkt auf Cookie zugreifen können, genauso wie wir nicht direkt auf die Textdaten der Anfrage zugreifen können. Denken Sie daran, für den Zugriff auf die Textdaten der Anfrage die Express Dot JN-Middleware hinzuzufügen Auch für Cookie müssen wir eine Middleware hinzufügen, die uns hilft, Cookies aus der Anfrage abzurufen Dafür installieren wir also ein weiteres Paket, den Cookie-Parser, NPM, das Cookie und den Parser und drücken die Eingabetaste. Gut. Jetzt geben wir in unserer Js-Datei mit dem Indexpunkt zuerst ein, dass der Cost-Cookie-Parser dem erforderlichen Cookie-Parser entspricht Und dann fügen wir unten App Dot UG und Cookie Parser hinzu und rufen diese Ohne diese Cookie-Parser-Funktion können wir nicht auf Cookie in Request Dot Cookies zugreifen Außerdem stelle ich in unserer Represe-API fest, dass dieser dekodierte Benutzer abgestuft Das liegt daran, dass wir ihn im trockenen Blog mit Cst definieren und aus Kostengründen ist dieser dekodierte Benutzer nur in diesem trockenen Blog zugänglich Hier wollen wir auf dekodierte Benutzer außerhalb des Dri-Blogs zugreifen dekodierte Benutzer außerhalb des Aus diesem Grund definieren wir vor diesem Tyblog Benutzer dekodieren lassen“ und entfernen dann Jetzt können wir hier auf den dekodierten Benutzer zugreifen, die Änderungen speichern und einen Blick Senden Sie die Anfrage und sehen Sie hier, dass der Benutzer nicht gefunden wurde, was bedeutet, dass wir keine Benutzerdaten erhalten. Lass mich nachschauen. Hier übergeben wir die dekodierte Benutzerpunkt-Unterstrich-ID. Lassen Sie mich überprüfen, ob es sich um eine Unterstrich-ID-Eigenschaft handelt oder nicht. Ja, sehen Sie, im generierenden Aktualisierungstoken übergeben wir die ID-Eigenschaft, nicht die Underscore-ID Also aktualisieren wir dies, um die ID zu unterstreichen und auch dieselbe Generierung von Tokens für die Route des Benutzers Speichern Sie die Änderungen und schauen Sie sich das an. Wenn das Token abgelaufen ist, können Sie hier die Anmelde-API aufrufen , die das neue Token auf Koki setzt Lassen Sie uns nun die Aktualisierungsanfrage erneut senden. Als Antwort erhalten wir nun unser neues Überschuss-Token, und außerdem wird ein neues Aktualisierungstoken im Anforderungs-Cookie gesetzt. Wenn wir dieselbe Anfrage erneut senden, dann sehen Sie hier, dass wir beide neuen Token erhalten. Das ist vergleichbar mit der Aktualisierung unserer Frontend-Seite. Wenn überschüssiges Token abgelaufen ist, ruft unser Frontend diese Aktualisierungs-API auf, und dann erhält unser Frontend das neue überschüssige Token und das Aktualisierungstoken 112. OAuth mit zwei Token [AKTUALISIERT]: Lassen Sie uns nun schnell den Oth-Code aktualisieren , auch weil wir hier auch nur ein Token senden Wie Sie sehen können, generieren wir Token innerhalb dieser Handle-OT-Callback-Funktion Jetzt, wo das Token hier generiert wird, können wir unsere Funktion zum Generieren von Tokens verwenden und hier dieselben Daten übergeben Und jetzt bekommen wir hier Const-CLI-Klammern, überschüssiges Token und Aktualisierungstoken Jetzt brauchen wir diese Token-Variable nicht mehr und danach geben wir einfach das Objekt mit überschüssigem Token an das überschüssige Token zurück , oder wir können dieses entfernen und das Token aktualisieren, um das Token zu aktualisieren Jetzt haben wir hier eine Sache. Hier haben wir bereits Benutzerdaten. Es ist gut. Wir speichern das Aktualisierungstoken in den Benutzerdaten, sodass wir keine weiteren Daten per Abfrage senden müssen. Also kopieren wir diesen Verschlüsselungscode von der Anmelde-Benutzer-API kopieren wir diesen Verschlüsselungscode und speichern das Token auch im Benutzerpunkt Refresh Token Und fügen Sie diesen Code in das Handle oder die Callback-Funktion ein. In unserer Google Callback-API erhalten wir jetzt ein Objekt an der Stelle des Tokens und wir destrukturieren überschüssiges Token und unterdrücken das Token Bevor wir den Benutzer mit dem Token zum Frontend weiterleiten, müssen wir nun das Aktualisierungstoken im reinen SDP-Cookie festlegen Also gehen wir erneut zur Login-API und kopieren diese Antwortpunkt-Cookie-Methode und fügen sie in die Google Endlich übergeben wir einfach überschüssiges Token an der Stelle von Togan, jetzt machen wir dasselbe für die Facebook-Callback-API Hier erhalten wir ein Objekt mit überschüssigem Token und drücken auf Token und fügen hier Dann ändern wir einfach dieses Token mit überschüssigem Token und das war's In der nächsten Lektion sehen wir nun, was wir tun müssen, um den Benutzer zu kennzeichnen. 113. Pfad zum Abmelden eines Benutzers [AKTUALISIERT]: Können Sie mir jetzt sagen, was passiert ist, als sich der Benutzer abgemeldet hat? Wenn wir überschüssiges Token vom Frontend ablaufen lassen, im reinen SCTP-Cookie bereits ein Aktualisierungstoken, haben wir im reinen SCTP-Cookie bereits ein Aktualisierungstoken, das lange abläuft. Unser Frontend kann die Refresh-API erneut ausführen und die neuen Token abrufen, aber das wollen wir nicht Wir möchten den Benutzer vollständig abmelden. Dazu müssen wir also nur das Aktualisierungstoken aus dem reinen SDDP-Cookie und aus der Sammlung des Benutzers entfernen aus dem reinen SDDP-Cookie und aus der Sammlung des Benutzers Lassen Sie uns hier also eine neue Route, einen Schrägstrich mit dem äußeren Punkt, einen Log-Hut und eine ASN-Callback-Funktion Zum Entfernen von Cookies verwenden wir nun die Methode Response Dot Clear Hier übergeben wir unseren Cookie-Namen , den wir entfernen möchten. Wir übergeben hier ein Aktualisierungstoken. Stellen Sie sicher, dass Sie Ihren Cookie-Namen überprüfen , während Sie ihn generieren. Diese Methode entfernt nun den Refrestken-Cookie und funktioniert bei der lokalen Verkostung Aber wenn wir das in der Produktion implementieren wollen, müssen wir auch Objekte mit Eigenschaften hinzufügen Dieser Ausdruck funktioniert für die Produktion, kann aber manchmal zu Problemen bei der Produktion führen. Es ist besser, wenn wir Eigenschaften weitergeben. Stellen Sie sicher, dass es sich um dieselben Eigenschaften wir bei der Erstellung von Cookies hinzugefügt haben. Kopieren Sie dieses Objekt und in unserem Clear-Cookie übergeben wir es. Gut. wir einfach den Antwortpunkt Json Object mit der Nachrichteneigenschaft zurück , die erfolgreich abgemeldet wurde. Bevor wir das Cookie entfernen, ist es besser. Wir entfernen auch das Aktualisierungstoken aus der Sammlung des Benutzers. Dazu müssen wir das Token aus dem Cookie aktualisieren, die Benutzer-ID aus dem Token dekodieren, das Token aus der Datenbank abrufen und dann müssen wir es entfernen Das haben wir bereits in unserer Refresh-API gemacht. Denken Sie daran, dass wir diesen Code einfach von getting Cookie to decode user kopieren können , bis wir den Benutzer erhalten Kopieren Sie dies und fügen Sie es einfach vor der Methode zum Löschen von Cookies Jetzt haben wir hier Benutzer. Wir müssen nur angeben, dass der Benutzerpunkt das Aktualisierungstoken gleich Null ist. Und dann warten wir auf das Speichern des Benutzerpunkts und fertig. Lassen Sie uns diese Abmelde-API testen. Sagen wir die Änderungen KEIN Postbote, duplizieren Sie diese Aktualisierungstoken-Anfrage Gut, ändern Sie den Namen der Anfrage, um einen Benutzer zu kennzeichnen. Ändern Sie die API und zeigen Sie auf Slash-Logout. Derzeit überprüfen wir unser Cookie. Sehen Sie, dass es hier verfügbar ist. Wenn wir nun diese Abmeldeanfrage senden, sehen Sie, hier erhalten wir die Abmeldung erfolgreich, und wenn wir das Cookie erneut überprüfen, ist es von hier aus weg So funktionieren Registrierung, Anmeldung, Abmeldung und Token auf Produktionsebene Anmeldung, Abmeldung und Außerdem handelt es sich bei den letzten sechs Lektionen um aktualisierte Lektionen. Wenn Sie diesen Code also in den kommenden Lektionen nicht sehen, Sie sich darüber keine Sorgen. Sie können diesen Lektionen folgen. Ich möchte diese Wunden nur auf den neuesten Stand bringen. Derzeit probieren wir dieses Projekt. Wenn wir also den Überschuss auf ein Verfallsdatum von 5 Minuten festlegen, dann ist es sehr schwer zu probieren. Deshalb setzen wir das Verfallsdatum nur für die Verkostung auf einen Tag fest. Außerdem ändern wir in der Routendatei des Benutzers unten den Wert für Überschreitung in ein Verfallsdatum von einem Tag. In der Produktion können wir den Wert auf 5 Minuten aktualisieren. 114. Abschnitt 10 - Erstellen des Kategoriemodells: Willkommen im damaligen Abschnitt des ultimativen Node JS-Kurses. In diesem Abschnitt werden wir weiter an unserem zweiten E-Commerce-Anwendungs-Backend arbeiten unserem zweiten E-Commerce-Anwendungs-Backend Wir werden einige coole Funktionen hinzufügen, wie Hinzufügen von Produktbildern im Backend, rollenbasierte Autorisierung, einfache und schnelle Suchabfragen und vieles mehr Fangen wir also mit diesem Abschnitt an. Zunächst möchten wir in unserer E-Commerce-Anwendung Produkte nach Kategorien hinzufügen. Wenn Sie Kopfhörer der Kategorie Kopfhörer auswählen, versenden wir nur Produkte, deren Kategorie Kopfhörer ist Dafür müssen wir das Kategoriemodell definieren. Also erstellen wir im Modellordner eine neue Datei namens category dot JS. Nun, in dieser Datei entspricht Const Mongoose zunächst einmal Require Mongoose Danach entspricht das Kostenkategorieschema dem Punktschema von Nu Mangos In diesem Objekt werden wir unser Schema hinzufügen. Nun, was möchtest du zu dieser Kategoriesammlung hinzufügen ? Zuerst benötigen wir den Namen der Kategorie. Dann benötigen wir vielleicht das Symbol der Kategorie. Diese Eigenschaften hängen vom UI-Teil des Frontends ab. Wir wollen Kategorien wie diese mit Symbolen anzeigen, dann müssen wir den Namen der Cn-Datei in unserer Datenbank speichern. Jetzt wollen wir in unserer Anwendung eine Sache tun. Nur der Administrator kann Kategorien zu unserer Datenbank hinzufügen. Ein einfacher Benutzer kann keine Kategorie hinzufügen oder eine Kategorie löschen. A: Wenn wir in unserer Anwendung mehrere Admins haben, können wir hier das Feld Admin ausfüllen Ist die ID dieses Admins. Aber hier wollen wir die Admin-Daten nicht speichern , damit wir diese Füllung entfernen können Wir haben also nur zwei Füllungen für diese Kategorie, Modell oder Kollektion. Also fügen wir hier dem Objekt den Namen, den Typ und die Zeichenfolge hinzu, die für true erforderlich und auch für true eindeutig sind. Als Nächstes wollen wir, dass der Icon-Bildname zum Objekt, zum Typ und zur Zeichenfolge wird, weil wir den Bildnamen hier und required auf true speichern wollen , und das war's. Jetzt sind viele Schüler verwirrt , wenn es darum geht, Bilder im Backend zu speichern Lassen Sie mich Ihnen die Logik erklären. In der Datenbank können wir Bilder nicht direkt speichern. Also machen wir so etwas. Angenommen, der Benutzer lädt dieses eine Bild vom Frontend hoch. Auf dem Backend-Server erstellen wir einen Ordner namens Uploads, in dem wir das Bild speichern Jetzt haben wir eine Datei mit dem Namen, den wir dem Bild geben möchten, auf unseren Server hochgeladen mit dem Namen, den wir dem Bild geben möchten, auf unseren Server wir dem Bild geben möchten, auf Danach speichern wir einfach den Namen des Bildes in der Datenbank. Manche Leute möchten auch den gesamten Pfad des Bildes speichern, aber das ist in diesem Fall nicht erforderlich, da wir dieses Bild auf unserem eigenen Server speichern. Wir müssen also nur den Namen der Kategorie und das Bild eingeben , was der Bildname ist. Danach können wir ein Modell erstellen, das auf diesem Schema basiert. Die zweite Kategorie entspricht dem Punktmodell von Mongos. Zunächst übergeben wir den einzigartigen Namen unserer Kategorien-Sammlung , nämlich Kategorie Und zweitens übergeben wir das Schema und am Ende modulieren wir, dass Punktexporte dieser Kategorie entsprechen. Erledigt. In der nächsten Lektion werden wir nun eine API zum Erstellen einer neuen Kategorie mit Bild-Upload hinzufügen . 115. Erstellen einer neuen Kategorie-API mit Image-Upload: Lassen Sie uns nun eine neue API für die Kategorie erstellen. Dafür erstellen wir im Ordner Routes eine neue Datei mit dem Namen category dot js. Was machen wir in dieser Datei? Schreiben Sie, wir müssen den Router mit Express erstellen. Const Express entspricht also require Express. Und next const Router entspricht Express Dot Router. Und zuletzt müssen wir diesen Router exportieren Das Modul Dot Exports entspricht dem Router. Gut. Bevor wir vergessen, diese neue Route zur Indexpunkt-JS-Datei hinzuzufügen, machen wir das. Ich habe diesen Fehler gemacht und versucht, meine APIs zu testen. Speichern Sie diese Datei, gehen Sie zur Indexpunkt-JS-Datei. Hier importieren wir Kategorierouten nach Bedarf, hier gehen wir zum Routenordner und in dieser Kategorie. Unten verwenden wir App Dot G. Hier definieren wir das Präfix, also die API-Slash-Kategorie Danach übergeben wir beim zweiten Parameter die Routen der Kategorie Speichern Sie diese Datei und kehren Sie zur Datei mit den Kategorienrouten zurück. Gut. Lassen Sie uns nun die API zum Erstellen einer neuen Kategorie definieren. Hier definieren wir eine neue Route mit Router Dot Post. 8.2 Schrägstrich, und hier übergeben wir Callback-Funktion mit Anforderungs- und Antwortpfeilfunktion Hier wollen wir das Symbolbild mit dem Namen der Kategorie speichern das Symbolbild mit dem Namen der Kategorie das Bild zu speichern, benötigen wir also ein Paket namens Multer Dies ist ein sehr beliebtes Paket zum Speichern aller Arten von Dateien in der Express-Anwendung Viele Entwickler haben Multer verwechselt , aber es ist wirklich einfach. Lass es mich dir zeigen Öffnen Sie das Terminal und schreiben Sie NPM install Multer auf 1.4 0.5 Dash ts Punkt eins und drücken Gut, minimiere dieses Terminal. Jetzt fügen wir in unserer Datei zuerst Const ulter hinzu, was Require Multer entspricht. Danach erstellen wir eine Variable namens st upload is equal wie here, wir nennen diese Multer-Methode, wir nennen diese Multer-Methode, und innerhalb der Klammern müssen wir das Objekt mit der Eigenschaft dest übergeben, müssen wir das Objekt mit der Eigenschaft dest übergeben st upload is equal wie here, wir nennen diese Multer-Methode, und innerhalb der Klammern müssen wir das Objekt mit der Eigenschaft dest übergeben, was das Ziel ist. Hier müssen wir angeben, in welchem Ordner oder Pfad wir unser Bild speichern möchten Wir schreiben eine Upload-Kategorie. Dadurch bleiben unsere Kategoriebilder in einem separaten Ordner. Jetzt müssen wir diese Upload-Methode als Middleware unserer Post-API hinzufügen als Middleware unserer Post-API Hier fügen wir den Upload-Punkt hinzu. Hier haben wir viele Methoden wie Single. Dies akzeptiert nur eine einzelne Datei. Keine, es werden keine Dateien akzeptiert. A akzeptiert mehrere Dateien. N akzeptiert alle Dateien und Füllungen, was bestimmte Mehrfachfüllungen akzeptiert. Wenn Sie sich eingehender mit diesen befassen möchten, können Sie sich die Dokumentation ansehen. Machen Sie sich darüber vorerst keine Sorgen. Hier möchten wir nur eine einzelne Datei akzeptieren und speichern. Wir verwenden hier eine einzige Methode. In dieser Klammer müssen wir nun den Feldnamen übergeben Nehmen wir an, wir kommen hier vorbei, Icon. Jetzt müssen wir vom Frontend aus das Eingabe-Tag verwenden, die Datei eingeben und im Namensfeld den gleichen Namen übergeben , nämlich C. Durch diesen ausgefüllten Namen weiß Malta, welche Datei es speichern muss, und das war's. Multer speichert unser Dateisymbol in der Upload-Kategorie für den Zielpfad, und wir erhalten die Informationen zu dieser Datei in der Anforderungspunktdatei und die restlichen Formulardaten wie zuvor im Hauptteil der Anfrage. Lassen Sie uns nun den Rest des Codes für diese API schreiben. Zuallererst fügen wir hier die I-Bedingung hinzu, und dies überprüft, ob der Punktname der Anfrage nicht verfügbar ist oder die Punktdatei der Anfrage nicht verfügbar ist. Dann geben wir hier den Antwortstatus zurück, 400 für fehlerhafte Anfrage, Punkt JSON, und hier übergeben wir Objekt mit Nachrichteneigenschaft und übergeben hier Fehlermeldung, Name und Symbol sind erforderlich. Was ist, wenn wir beides haben? Wir erstellen eine neue Kategorie, const, new category entspricht new Hier brauchen wir ein Kategorienmodell. Also ganz oben ist die Kostenkategorie gleich der Kategorie „ Erforderliche Modelle“, hier geht es um eine Kategorie zusammengeklappter Modelle. Gut. Jetzt fügen wir unten eine neue Kategorie hinzu, und hier übergeben wir ein Objekt mit Eigenschaften dieser Sammlung. Zuerst fügen wir einen Namen hinzu, um den Punktkörper anzufordern. Wir haben nur eine Füllung im Körper, und deshalb destrukturieren wir diese Füllung nicht wie zuvor Als Nächstes übergeben wir das Bild an die angeforderte Punktdatei. Und hier wollen wir den Dateinamen speichern, also schreiben wir filename. Wenn Sie den vollständigen Pfad der Füllung speichern möchten, müssen Sie den Punktpfad der angeforderten Punktdatei einhalten . Wir können uns auch an das Punktprotokoll der Konsole halten und eine Punktdatei anfordern, um zu sehen, was wir in die Punktdatei aufnehmen, damit wir nicht verwirrt werden. Danach fügen wir Await hinzu, neuen Kategoriepunkt C, und Sie wissen, was wir jetzt tun müssen. Ja, wir müssen diese Funktion für die Verwendung von Await einrichten. Ganz am Ende senden wir eine Antwort mit Statistiken an 01 für den neuen Datenpunkt Json. Hier fügen wir ein Objekt mit Messet-Eigenschaft hinzu, die Kategorie wurde erfolgreich hinzugefügt Wenn wir die Kategorie an die neue Kategorie übergeben. Lassen Sie uns nun diese API testen. Es ist ein bisschen anders , weil wir hier eine Datei senden müssen. Wir können keine Datei im JSON-Format senden, daher müssen wir das Formular hier verwenden, und wir können auch keine Datei mit dem Thunder Client hochladen , da diese Funktion nur für bezahlte Benutzer verfügbar ist Viele Entwickler mögen Postman und Thunderclient aus diesem Grund nicht Wir werden hier Postman verwenden. Wenn Sie Postman nicht kennen, gebe ich Ihnen mein vorheriges Tutorial Kurzanleitung für den Um den Postman herunterzuladen, gehen wir zu postman.com gehen wir Hier können wir diese Anwendung herunterladen . Installieren Sie einfach diese Anwendung. Es ist wirklich einfach. So sieht es aus, wenn wir es zum ersten Mal öffnen. Wir haben zwei Möglichkeiten Erstellen Sie ein neues Konto oder melden Sie sich mit einem Konto an. Ich melde mich hier schnell mit meinem Konto an. Wenn du dich registrierst oder einloggst, kannst du hier eine Sammlung erstellen genau wie beim Thunder-Client Hier erstellen wir eine neue leere Sammlung. Caris und in unserem Cartws-Projekt fügen wir einen neuen Ordner Wenn Sie die Ansicht vergrößern möchten, drücken und Plus oder Befehl Plus In diesem Ordner fügen wir eine neue Anfrage hinzu und erstellen eine neue Kategorie. Jetzt wählen wir zunächst die Post-Methode, die URL zu STP, die Spalte mit doppeltem Schrägstrich, den lokalen Host und die ABI-Kategorie Spalte 3.000 Um nun eine Datei im Körper zu senden, gehen wir zum Hauptteil. Hier wählen wir die Formulardaten aus. Hier erhalten wir den Schlüssel , der den vollständigen Namen, den Wert und die Beschreibung enthält. Zunächst fügen wir unseren Schlüssel hinzu , der der vollständige Name ist , sagen wir Laptops. Als Nächstes geben wir unseren vollständigen Namen für die Datei ein, und was war das? Denken Sie daran, wir schreiben hier ein Symbol. Also müssen wir auch hier Icon schreiben. Für das Hochladen der Datei auf der rechten Seite des Schlüssels erhalten wir Text und ein Dropdownmenü, was der Inhaltstyp ist. Hier wählen wir Datei aus, klicken auf Datei auswählen und wählen eine neue Datei vom lokalen Computer aus. nun für Laptop-Symbole Gehen Sie nun für Laptop-Symbole zum Ressourcenordner , den Sie zuvor heruntergeladen haben, oder Sie können ihn auch direkt unter dieser Lektion herunterladen. Ressourcenordner, ich habe einen Ordner für Projekt zwei hinzugefügt. In diesem Ordner gehen wir zum Kategorieordner, und dort erhalten Sie alle Symbole für die Kategorie. Wählen Sie die PNG-Datei Laptop Dot aus und öffnen Sie sie. Lassen Sie uns nun diese Anfrage senden. Hier erhalte ich eine Fehlermeldung. Entschuldigung, ich habe vergessen, diese Anwendung zu starten. Also gut, Hinweis auf die Indexpunkte. Außerdem merke ich hier, dass ich diesen Fehler mache , Antwortpunktstatus. Speichern Sie die Änderungen und kehren Sie zu Postman zurück und senden Sie die Anfrage Siehst du, hier bekommen wir die neue Kategorie, Laptops und Bild zu diesem zufälligen Namen Lassen Sie uns auch überprüfen, ob unsere Datei im Upload-Ordner gespeichert wird oder nicht. Siehst du, hier bekommen wir die Datei mit diesem zufälligen Dateinamen. Es funktioniert also, es gibt einige Probleme. Speichern Sie diese Datei ohne ihre Erweiterung wie Punkt-PNG oder Punkt-JPG usw. Ohne Erweiterung ist unser Bild im Browser nicht sichtbar Dies ist das Problem Nummer eins. nächste Ausgabe ist da, wir können jede Art von Datei hochladen, nicht nur Bilder. Nehmen wir an, jemand lädt hier versehentlich eine Punkt-PDF-Datei hoch, was werden wir dann tun. Also hier muss auch ein Filter dafür hinzugefügt werden. nur Punkt-PNG oder Punkt-JPG oder Für diese Bildfüllung können nur Punkt-PNG oder Punkt-JPG oder Punkt-GIF hochgeladen werden Wir werden diese Probleme in der nächsten Lektion lösen. 116. Dateinamen und Filter in multer festlegen: In der vorherigen Lektion haben wir zwei Probleme. Wir erhalten keine Erweiterung für unsere Bilddatei und auch für die Datenbank. Zweitens können wir nicht nur Bilder filtern. Lass uns das lösen. Das ist wirklich einfach. Lassen Sie mich diese Kategorie über den Multer verschieben , damit wir das klar erkennen können Hier übergeben wir nur die Eigenschaft dest in der Multer-Funktion. Aber in Multer haben wir kaum mehr Eigenschaften als Desk. Wenn Sie dieses Ziel entfernen können wir hier die Speichereigenschaft übergeben , mit Ausnahme der Festplattenspeichereigenschaft von Multer Anstatt den Code hier zu überladen, können wir ihn in einer separaten Variablen definieren Der Kostenspeicher entspricht dem Multer-Dot-Festplattenspeicher. Darin können wir definieren, wie und wo Dateien auf unserem Server gespeichert werden sollen Wir übergeben Object und die erste Eigenschaft ist das Ziel, in dem wir unsere Datei speichern möchten. Mit Ausnahme der Callback-Funktion, die drei Eigenschaften hat, ist die Anforderungsdatei Dies ist das hochgeladene Dateiobjekt, und CB ist eine Callback-Funktion zur Angabe des Zielpfads Fehlerfunktion hier, wir rufen diese Callback-Funktion einfach an der ersten Position auf, wir übergeben Null, was für einen Fehler steht Danach übergeben wir unseren Zielpfad, die Upload-Kategorie ist Dieser Rückruf legt das Ziel als Upload-Kategorie Wenn dieses Verzeichnis nicht existiert, müssen wir es manuell erstellen Aber wir haben diesen Ordner schon hier. Wenn nicht, müssen Sie diesen Pfad erstellen, hochladen und in diesem Ordner einen Ordner mit der Kategorie hinzufügen. Andernfalls gibt Ulter uns eine Fehlermeldung. Jetzt, nach dem Ziel, können wir hier auch die Eigenschaft des Dateinamens angeben Dies akzeptiert auch die Callback-Funktion mit den gleichen drei Eigenschaften: Request-Datei, CB für Callback und Pfeilfunktion In dieser Funktion wollen wir nun den spezifischen und eindeutigen Dateinamen für unsere Datei definieren den spezifischen und eindeutigen Dateinamen für unsere Datei Eindeutiger Dateiname, denn wenn zwei Dateinamen identisch sind, ersetzt der letzte das erste Bild. Anstelle eines weiblichen Bildes wird dem Benutzer ein männliches Bild angezeigt, und das wollen wir nicht. Als gängige Praxis speichern wir den Zeitstempel im Dateinamen wie folgt Zuerst Zeitstempel und dann Dateiname mit Erweiterung. Dies sind fast alle Dateien, die einen eindeutigen Namen erhalten. secCtttMP entspricht jetzt dem Datum Punkt. Dadurch erhalten wir die aktuelle Uhrzeit . Danach wollen wir auch etwas im Dateinamen machen. zweite Originalname entspricht der Datei. Ursprünglicher Name des Punktes Auf diese Weise erhalten wir den ursprünglichen Namen der hochgeladenen Datei, z. B. Laptop Dot PNG. Jetzt gibt es im Dateinamen vielleicht Leerzeichen, also ist es besser, dieses Leerzeichen durch den Bindestrich zu ersetzen. Dadurch wird unser Dateiname URL-freundlich. Wir fügen die Plex-Methode hinzu. Hier fügen wir zuerst einen regulären Ausdruck hinzu, dessen Syntax ein doppelter Schrägstrich zwischen diesen ist Wir fügen einen umgekehrten Schrägstrich wie für Leerzeichen und ein Plus für ein oder mehrere am Ende des regulären Ausdrucks Fügen Sie am Ende des regulären Ausdrucks G für das globale Flag hinzu. Dadurch wird sichergestellt , dass alle Treffer in der Zeichenfolge ersetzt werden, nicht nur Hier übergeben wir Bindestriche in einzelnen Codes, das bedeutet, dass alle Leerzeichen durch Bindestriche ersetzt werden. Was ist nun, wenn wir im Dateinamen auch die Sonderzeichen bekommen? Wir müssen sie auch entfernen. Wir fügen eine weitere Ersetzungsmethode hinzu. Erstens, was bestehen wir? Regulärer Ausdruck, und wie lautet die Syntax, doppelter Schrägstrich Dazwischen erhalten wir regulären Ausdruck zum Abrufen der Sonderzeichen Hier fügen wir A bis Z hinzu, Alt A bis Z Null bis Neun, außerdem wollen wir jetzt andere Zeichen bekommen, die nicht Teil davon sind, und das werden unsere Sonderzeichen sein. das umzukehren, setzen wir es in die eckigen Klammern und nach der ersten eckigen Klammer fügen wir am Ende Garret hinzu, wir fügen auch G für globale Jetzt wollen wir diese Sonderzeichen durch nichts ersetzen diese Sonderzeichen durch Wir wollen es nur entfernen. Also fügen wir hier nur Codes ohne irgendetwas hinzu. Machen Sie sich keine Sorgen, wenn Sie nicht viel über reguläre Ausdrücke wissen , es ist okay. Nun, mit diesen beiden Methoden, wenn unser Dateiname so lautet, dann wird es so aussehen. Am Ende werden wir diesen Zeitstempel und den ursprünglichen Dateinamen mischen diesen Zeitstempel und den ursprünglichen Dateinamen CB: Zuerst übergeben wir Null für einen Fehler und zweitens schreiben wir Tags zurück Hier fügen wir Dollar Cully Brackets, Timestamp, Dollar Cully-Klammern , Originalname Originalname Wir definieren das Ziel und auch den Dateinamen für unsere Jetzt können wir diese Speichervariable einfach hier in der Multifunktion übergeben . Unser erstes Problem ist gelöst. Jetzt gehen wir zu Ausgabe zwei über, um den Filter für die Datei anzuwenden. In der Multer-Funktion haben wir eine weitere Eigenschaft namens Dateifilter Auch hier müssen wir die Callback-Funktion übergeben, damit wir sie in einer separaten Variablen definieren können Kosten: Der Dateifilter entspricht der Callback-Funktion mit den drei Parametern Anfrage, Datei und CB-Fehlerfunktion In dieser Funktion entscheiden wir, ob die Datei akzeptiert oder abgelehnt werden soll Hier definieren wir zuerst eine Variable, erlaubte Typen, das ist das Array, und hier fügen wir alle Typen hinzu, die wir akzeptieren Zuerst Bilder GPG, was sowohl Punkt-JPG als auch Punkt-JPG ist. Dann Bild PNG für Punkt-PNG und Bild-GIF für Punkt-GIF Hier können wir einfach eine Bedingung setzen. Wenn der Mime-Typ von While ist, dann lassen wir ihn zu, andernfalls lehnen wir ihn ab. Wenn Typen erlaubt sind, wird Punkt eingeschlossen und in Klammern wird der Dateipunkt Mme übergeben Jetzt fragen Sie sich vielleicht, was ist der Typ Mme? Mime-Typ steht für Multipurpose Internet Mail Extensions Type. Dabei handelt es sich um eine Bezeichnung, die verwendet wird, um das Format der Datei oder der Daten zu identifizieren Anwendungen oder Browser wissen, wie man damit umgeht. Wenn wir eine PNG-Datei hochladen, der MME-Typ ein Bild-Schrägstrich-PNG, oder wenn wir eine PDF-Datei hochladen, MME-Typ ein Anwendungs-Slash-PDF wie folgt Wenn der Typ Mme im erlaubten Typ verfügbar ist, rufen wir die CB-Funktion auf. Zuerst übergeben wir Null für Fehler und übergeben für außer der Datei Wenn nun der Typ M etwas anderes ist, dann diese Typen, dann halten wir uns an die Bedingung und rufen die Cb-Funktion auf, und bei dem Fehler geben wir einen neuen Fehler weiter, und hier geben wir die Fehlermeldung, ungültiger Dateityp, nur JPEG , PNG und GIF sind erlaubt. Und um diese Datei abzulehnen, fügen wir hier false hinzu. D. Jetzt müssen wir hier Dateifilter zu Dateifilter hinzufügen . Hier lösen wir beide Probleme. Lassen Sie mich Ihnen eine weitere nützliche Eigenschaft von Ulter zeigen. Hier in der Multifunktion haben wir Grenzen, die uns helfen, die Dateigröße zu begrenzen Stellen Sie sich vor, jemand lädt hier umständlich ein 10-Megabyte-Symbol hoch hier umständlich ein 10-Megabyte-Symbol Wir brauchen keine 10 Megabyte für ein kleines Symbol. Wir können die Dateigröße begrenzen. Hier übergeben wir die Größe der Objektdatei. Hier müssen wir die Dateigröße in Byte übergeben. Für unser Kategoriesymbol können wir ein Limit von zwei MB festlegen, das ist mehr als genug, und um es in Byte umzurechnen, addieren wir 10 bis vier. Auf diese Weise erhalten wir Kilobyte oder KB und dann wieder 104. Auf diese Weise werden wir diese KB in Byte umwandeln. Und fertig. Lassen Sie uns nun diese API testen. Also geh zu Postman und hier haben wir schon unsere Daten für Laptops. Senden Sie diese Anfrage Sehen Sie hier, wir erhalten keine Antwort. Aber wenn wir unseren Upload-Kategorieordner überprüfen, erhalten wir eine neue Datei mit unserem eindeutigen Namen Erweiterung, unser Bild wird gespeichert. Lassen Sie uns nun den Fehler überprüfen. Wenn wir unser Terminal überprüfen, können wir hier sehen, dass bei Name-Laptops ein Fehler mit doppeltem Schlüssel angezeigt wird. Denken Sie daran, dass wir in der vorherigen Lektion die Laptop-Kategorie mit diesem zufälligen Dateinamen gespeichert haben. Außerdem haben wir im Kategorieschema die Eigenschaft name auf unique gesetzt. Wir müssen diese vorherige Kategorie aus Mongo Di B Compass entfernen aus Mongo Di B Compass Hier, entfernen Sie einfach dieses Dokument. Außerdem entfernen wir beide Bilder von unserem Server. Wir brauchen es nicht. Jetzt senden wir die Anfrage erneut. Siehst du, hier bekommen wir eine Erfolgsmeldung. Wir erhalten einen guten Bildnamen und auch ein Bild, das ordnungsgemäß auf unserem Server gespeichert ist. Großartig. Lassen Sie uns nun weitere Kategorien hinzufügen. Der zweite Kategoriename ist also Smartphones. Und dafür laden wir das Icon of Mobilephone Dot PNG hoch. Stellen Sie sicher, dass Sie das erste Bild entfernen. Andernfalls werden zwei Bilder gesendet. Senden Sie die Anfrage. Als nächstes haben wir die Kategorie, Smartwatches und das Symbol, das wir hier auswählen, Watch Dot PNG. Und sende es. Als nächstes haben wir Kopfhörer und Icon to Headphone Dot PNG und senden die Anfrage. Zu guter Letzt haben wir noch Spielekonsolen und für das Icon-Videospiel Punkt PNG und abschicken und fertig In der nächsten Lektion werden Sie nun eine API erstellen, mit der Sie alle Kategorien aus unserer Sammlung abrufen 117. API für alle Kategorien abrufen: Lassen Sie uns eine API erstellen, um alle Kategorien abzurufen. Es ist wirklich einfach. Nach der Post-API erstellen wir eine neue API, einen Router-Punkt-Gate-Schrägstrich für den Endpunkt, Callback-Funktion mit Anforderungsantwort und eine Pfeilfunktion Und innerhalb dieser Funktion erhalten wir zunächst alle Kategorien aus dem Modell C-Kategorien entsprechen also einem Gewicht, Kategorie Punkt finden. Und wenn Sie eine Kategorie kurz nach dem Namen der Kategorie angeben möchten, fügen wir hier die Aufnahmemethode hinzu, und hier geben wir den vollständigen Namen ein, nach dem wir fotografieren möchten, nämlich Name, und senden einfach die Antwort Punkt JCN-Kategorien Auch hier müssen wir diese Funktion aktivieren. Speichern Sie die Änderungen und lassen Sie uns diese API probieren. Gehen Sie also zum Postboten oder zum Ausschreibungskunden. Wir fügen hier eine neue Anfrage hinzu. Aber für alle Kategorien schreiben wir im Endpunkt die API-Kategorie Local Host 3.000. Wählen Sie die Get-Methode und senden Sie einfach die Anfrage. Siehst du, hier bekommen wir Kategorien, die nach ihren Namen abgekürzt sind. Ziemlich cool Wenn Sie nun weitere APIs hinzufügen müssen , z. B. die Kategorie aktualisieren oder löschen, können Sie das auch tun. Im Moment hängt es wirklich von dir ab, wir brauchen es hier nicht, also erstelle ich sie nicht. 118. Freigeben statischer Images vom Server: Derzeit speichern wir das Bild für Kategoriendaten in unserem Upload-Slush-Kategorieordner Aber wie kann unser Browser auf diese Bilder zugreifen? Sie sind nur auf unserem Server verfügbar. über den Browser auf die Bilder zugreifen zu können, müssen wir die statischen Bilddateien von unserem Server teilen. Habe das bereits in Abschnitt fünf, Lektion vier getan. Es ist wirklich einfach. Also index dot js file hier nach Express Dot J und Middleware, wir fügen App Dot U hinzu. Hier hatten wir das Präfix des statischen Dateipfads, also haben wir es auf Upload-Kategorie gesetzt nun die statischen Dateien vom Server aus zu teilen, müssen wir eine weitere integrierte Middleware namens Express Dot Static verwenden Middleware namens Und in dieser Funktion müssen wir den Ordnernamen übergeben, den wir teilen möchten Laden Sie weniger Kategorien hoch. Denken Sie daran, dass dies das Präfix für die URL ist und dass dies der Ordnerpfad unserer statischen Dateien ist. Speichern Sie die Änderungen und versuchen wir, auf dieses Laptop-Image zuzugreifen. Kopieren Sie den vollständigen Namen dieses Bildes. Gehen Sie jetzt zum Browser. Hier in der URL schreiben wir unser Backend, Lokaler Host, Spalte 3.000 Hier müssen wir das Präfix für die statische Datei hinzufügen, die Upload-Slash-Kategorie Wir übergeben hier die Kategorie Bilder, dann müssen wir auch die Kategorie Bilder in die Browser-URL schreiben Kategorie Bilder in die Browser-URL Im Moment bleiben wir bei der Upload-Kategorie, und auch hier übergeben wir die Upload-Kategorie, und hier fügen wir den vollständigen Namen des Bildes ein. Siehst du, hier bekommen wir das Bild. So zeigt das Frontend bei Verwendung dieser URL diese Symbole an. In der nächsten Lektion werden wir nun ein neues Modell für Produkte erstellen . Das wird Spaß machen. 119. Übung - Definieren des Produktmodells: Jetzt ist es Zeit für ein wenig Bewegung. Sie müssen das Modell eines Produkts definieren. In diesem Modell haben wir die Füllungen, und dies sind die Beispieldaten eines einzelnen Produkts. Sie müssen ein eigenes Schema für diese Füllungen entwerfen, sich Zeit nehmen, diese Übung lösen und dann die Lösung finden. Ich hoffe, Sie lösen diese Übung oder versuchen, sie zu lösen. Machen Sie sich das selbst zu eigen. Lassen Sie uns nun diese Übung lösen. Für das Produktmodell erstellen wir im Modellordner eine neue Datei mit dem Namen products dot js. Gut. Zuallererst entspricht der Preis von Mangos dem Bedarf von Mangos Danach definieren wir, dass das Kostenproduktschema dem Punktschema von Nu Mongoose entspricht Darin übergeben wir das Objekt, in dem wir das Schema definieren. Die erste Eigenschaft ist der Titel , den wir auf type auf string und required auf true setzen und required auf true Außerdem halten wir die maximale Länge auf hundert fest. Nun folgt die nächste Beschreibung, für die wir den Typ string required auf true setzen wollen Typ string required auf true und deren Mindestlänge 50 Zeichen beträgt. Danach benötigen wir einen Verkäufer , der dieses Produkt anbietet. Hier speichern wir die Verkäufer-ID, also Objekttyp auf Mongoose-Punktschema Punkttypen Punkt Objekt-ID, Referenz auf Benutzer muss auf true gesetzt werden Jetzt fragen Sie sich vielleicht, warum wir hier nicht den hybriden Ansatz verwenden Warum betten wir keine Daten für Verkäufer ein? Warum speichern wir die Verkäufer-ID. Hier im Frontend wird unsere Produktkarte so aussehen. In der Produktliste möchten wir die Details des Verkäufers nicht anzeigen. Wenn wir die Verkäuferinformationen hier anzeigen möchten, können wir hier auch den Namen des Verkäufers und einige erforderliche Details hinzufügen , aber das ist hier nicht der Fall. Sie müssen so denken, wenn wir mehrere Daten in einem einzigen API-Aufruf haben möchten Mehrere Daten bedeuten Produktdaten in einem einzigen API-Aufruf. In diesen Daten müssen wir die Referenzdaten anzeigen oder nicht. Wenn wir in diesen Daten Referenzdaten anzeigen möchten, ist es besser, diese Daten in die Sammlung einzubetten. Aus diesem Grund muss unsere API nicht für alle eingebetteten Daten eine Auffüllabfrage ausführen Zu diesem Zeitpunkt können wir einen hybriden Ansatz verwenden. Danach brauchen wir eine Kategorie. Sagen Sie mir jetzt, welchen Ansatz wir hier verwenden , eingebettet oder referenziert. Richtig, wir verwenden Ihre Referenz weil wir keine Kategorie mit mehreren Daten anzeigen möchten . Wir benötigen nur eine Kategorie zum Filtern von Produkten. Also verwenden wir wieder Ihren Referenztyp für Mongos Punktschema Punkttypen Punkt ObjectID Verweist auf Kategorie und muss auf true gesetzt werden. Als Nächstes haben wir den Preis. Hier setzen wir type auf Zahl, required auf true und Mean auf Null. Offensichtlich. Als Nächstes duplizieren wir diese Zeile und ändern diesen Preis in „Lagerbestand“, was der Anzahl der auf Lager verfügbaren Produkte entspricht. Als Nächstes haben wir Bilder, das ist das Array, und auch hier speichern wir den Bildnamen als Zeichenfolge. Der Grund, warum wir ein Array hinzugefügt , dass Produkte mehrere Bilder haben können Da wir wollten, dass Bilder wahr sind. Dadurch wird sichergestellt, dass unser Produkt mindestens ein Bild hat. Danach haben wir die letzten Immobilienbewertungen, also die Reihe der Bewertungsobjekte. Das ist jetzt interessant. In der Bewertungsmatrix wollen wir ein Objekt mit mehreren Bewertungen haben. Wir müssen das Schema für dieses Objekt definieren. Hier übergeben wir einfach das Objekt, und damit können wir das Schema für dieses Objekt definieren, genau wie wir es zuvor getan haben. In diesem Objekt wollen wir drei Informationsbenutzer haben , die diese Bewertung einreichen. Also ich widerspreche, wir übergeben type, Mongos Punktschema, Punkttypen Punkt, Objekt-ID, f an den Benutzer und required an True Als Nächstes benötigen wir für die Überprüfung die Bewertung, also das Verhältnis von Typ zu Zahl, und außerdem müssen wir den Wert „Wahr“ und den Mittelwert auf Null Schließlich benötigen wir einen Befehl , der eine Zeichenfolge sein kann, aber wir fügen hier nicht required zu true hinzu, da nicht alle Benutzer den Befehl hinzufügen werden. Sie fügen einfach gerne Sterne hinzu. Jetzt haben Sie vielleicht Fragen, wenn wir ein neues Produkt hinzufügen, ist es obligatorisch? Müssen wir diese Bewertungen hinzufügen? Denn hier benötigen wir zwei. Die Antwort lautet also nein. Wir müssen keine obligatorischen Bewertungen hinzufügen. Dies ist für dieses einzelne Objekt erforderlich. Wenn wir versuchen, ein neues Bewertungsobjekt einzugeben, sollte es eine Benutzer-ID und die dazugehörige Bewertung haben. Andernfalls wird es nicht benötigt. Im Grunde fügen wir ein Schema für dieses einzelne Objekt hinzu. Sie fragen sich vielleicht auch, können wir hier Benutzerdaten einbetten? Ja, wir können hier Daten einbetten, aber stellen Sie sich vor, Benutzer ändern den Benutzernamen, dann wird es wirklich schwierig, mit diesen Daten konsistent zu bleiben und sich nicht zu viele Gedanken über das Design der Datenbank zu machen. Fast alle Unternehmen haben ein Team für das Entwerfen der Datenbank, oder ein erfahrener Entwickler wird die Datenbank entwerfen. Ich erkläre Ihnen nur, warum wir den Referenzansatz verwenden und warum wir keinen eingebetteten Ansatz verwenden. Ich denke, es wird Ihre Zweifel ausräumen. Hier ist unser Schema vollständig. Jetzt können wir daraus ein Modell erstellen. Das Kostenprodukt entspricht dem Mongoose-Punktmodell. Hier übergeben wir den singulären Namen unserer Kollektion, nämlich Produkt, und danach übergeben wir das Produktschema, und schließlich exportieren wir Modulexporte entsprechen also dem Produkt. 120. Rollenbasierte Autorisierung: Lassen Sie uns nun eine API für die Erstellung eines neuen Produkts erstellen. Im Ordner Routes erstellen wir eine neue Datei namens products dot js. Jetzt müssen wir mit Express einen neuen Router erstellen. SecStePress entspricht Require Express. Als nächstes, was die Kosten angeht, entspricht Router dem Express Dot Router. Außerdem müssen wir diesen Router endlich exportieren. Der Export von Modulpunkten entspricht dem Router. Fügen wir nun diesen neuen Router zur Indexpunkt-JS-Datei hinzu. Speichern Sie diese Datei und gehen Sie zur Indexpunkt-JS-Datei. Hier importieren wir die Kosten für Produktwege, die dem Bedarf entsprechen. Wir gehen zum Ordner Routes und dort zu den Produkten. Jetzt fügen wir unten den App-Punkt g hinzu. Hier definieren wir das Präfix, nämlich API-Slash Products Und beim zweiten Parameter geben wir Produkte aus, speichern die Änderungen und kehren zurück zu unserer Produkt-Routen-Datei Hier möchten wir eine API zum Hinzufügen neuer Produkte erstellen. Also Router-Punkt-Post, API und Point-to-Forward-Folie. Hier stellen wir sicher, dass nur angemeldete Benutzer auf diese API zugreifen können. Also können wir hier Osmalware hinzufügen. Sehen Sie hier, ich erhalte einen automatischen Vorschlag und außerdem wird Omdalware oben automatisch eingegeben Jetzt fügen wir Anfrageantwort und Pfeilfunktion hinzu. Gut. Bevor wir uns mit dem Speichern von Produktbildern befassen, müssen wir überprüfen, ob nur Verkäufer Produkte hinzufügen können, nicht einfache Benutzer, sondern nur Verkäufer, und wie können wir das tun? Wir werden Middleware verwenden. Im Middleware-Ordner erstellen wir eine neue Datei namens Wie wir wissen, ist Middleware nun eine Funktion. Wir definieren const, überprüfen, ob der Verkäufer der Antwort auf die Anfrage entspricht, und die Funktionen next und arrow In dieser Funktion müssen wir überprüfen, ob die Benutzerregel Verkäufer lautet oder nicht Wenn es sich nicht um einen Verkäufer handelt, geben wir einen Fehler zurück. Wenn ich anfordere, dass der Punkt-Benutzer nicht verfügbar ist, oder die Punkt-Rolle des Punktbenutzers nicht dem Verkäufer entspricht, geben wir als Antwort den Punktstatus 403 für verbotenes X-Punkt-JSON zurück 403 für verbotenes X-Punkt-JSON Und hier übergeben wir das Objekt mit meSetPerty, das nur Verkäufern verweigert wurde. Wenn Sie diese Bedingung erfüllen, können wir sie nur dann an den nächsten Middleware - oder API-Callback weiterleiten nächsten Middleware - oder API-Callback Lassen Sie uns diese Funktion nun von hier aus exportieren. Das Modul Dot Exports entspricht also Check Seller. Also die Änderungen. diese Middleware nach der Nord-Middleware in der API unserer Produkte Lassen Sie uns diese Middleware nach der Nord-Middleware in der API unserer Produkte einrichten. Sehen Sie noch einmal, die automatische Eingabe funktioniert. Großartig. Nun, hier sind zwei Dinge für dich. Der erste ist in unserem Benutzerschema, wir haben nur die Option mit zwei Werten für die Rolle festgelegt. Lassen Sie mich Ihnen die DOT-JS-Datei für geöffnete Benutzer zeigen. Hier können wir sehen, dass wir nur Benutzer und Admin haben. Wir müssen hier auch den Verkäufer hinzufügen und diese Datei speichern. Die zweite Sache ist nun, wie können wir Benutzerrolle in die Punktrolle des Anforderungspunkts aufnehmen? Denn im Request-Punkt-Benutzer erhalten wir nur die Daten, erhalten wir nur die Daten die wir bei der Generierung des Tokens übergeben. Denken Sie daran, dass wir nur zwei Eigenschaften übergeben ID und den Namen unterstreichen. Sehen wir uns das auch Ein Benutzer gibt in der Anmeldung am Ende die Route hierher ein, C, wir übergeben nur die Unterstrich-ID und den Hier müssen wir auch die Rolle weitergeben. Wechseln Sie zu einer neuen Benutzerrolle. Gut. Auch beim Login am Ende fügen wir hier die Rolle hinzu und hier müssen wir die Benutzerpunktrole verwenden , da wir hier bereits einen Benutzer haben. Sehen Sie sich die Änderungen an. Was ist nun Authentifizierung auf Google- und Facebook-Basis Auch dort geben wir nur die Unterstrich-ID und den Namen weiter. Wir müssen auch die Regel bestehen. Andernfalls gibt Ihnen unser Kellerzähler Fehler. Also pothjs-Datei, die wir hier ändern müssen, wir erstellen diese gemeinsame Funktion. Das ist nett. Siehst du, oben finden wir den Benutzer, das ist also einfach für uns. Hier unten generieren wir das Token, generieren wir das Token, also fügen wir hier die Rolle der Benutzerpunktrolle hinzu. Und fertig. Wir haben hier alle Änderungen vorgenommen. Speichern Sie die Änderungen und lassen Sie mich andere Dateien in der Produkt-API schließen andere Dateien in der Produkt-API Wir geben hier einfach die Antwort Punkt SN Verkäufer ist hier zurück. Lassen Sie uns diese API testen. Lassen Sie uns zunächst die Login-API in Postman hinzufügen, da ich nicht denke, dass wir auch für Produkte den Tundar-Client verwenden werden In unserer Cardwih-Sammlung fügen wir einen neuen Und wir fügen hier eine Anfrage hinzu, die als Benutzeranmeldung bezeichnet wird. Zunächst wählen wir die API-Benutzeranmeldung aus und verweisen auf diese. Stellen Sie sicher, dass diese Methode auf Posten eingestellt ist. Nun zu den Daten, ich kopiere sie einfach vom Thunder-Client zurück nach Postman, wähle hier Body, Raw und einfach die Daten aus und sende die Anfrage Siehst du, hier erhalte ich ein neues Token, kopiere es und um die Produkt-API zu probieren, erstellst du in cartwdg einen neuen Ordner namens products erstellst du in cartwdg einen neuen Ordner Ich denke, wir müssen dauerhaft auf den Postman umsteigen. Als ich zu der Zeit mit der Recherche nach den Ergebnissen begann, ist die Funktion zum Hochladen von Dateien in der kostenlosen Version des Tender-Clients verfügbar Aber was wir jetzt tun können, wir wechseln zu Postman. Das tut mir leid Hier hatten wir die Anfrage „Neues Produkt erstellen“ genannt. Wählen Sie den Endpunkt für API-Slash-Produkte aus, Anfrage wird gepostet und die Anfrage gesendet Sehen Sie, hier erhalten wir die Fehlermeldung, Autorisierungstoken erforderlich. Entschuldigung, wir haben das Token nicht im Header übergeben, gehen Sie zu den Headern. Hier fügen wir die Autorisierung hinzu, und in dem Wert, wir zuerst übergeben müssen, fügen wir Fehlerraum hinzu und fügen unser JWT-Token Lassen Sie uns nun diese Anfrage senden. Siehst du, jetzt erhalten wir eine weitere Fehlermeldung, nur Verkäufern wurde der Zugriff verweigert. Um es kurz zusammenzufassen: Wir fügen nach der Othmdalware eine Middleware für Verkäufer hinzu, weil wir bei Orthomdalware die Benutzerdaten in der Anfrage als Punkt user abrufen Wenn das Token verifiziert ist und die Benutzerregel Verkäufer lautet, nur mit der Seller Moware-Funktion wir Auf diese Weise können wir eine regelbasierte Autorisierung durchführen. Um an dieser API teilnehmen zu können, müssen wir unser Girokonto mit dem Konto des Verkäufers verknüpfen. Wenn Mongo Di also hier in der Sammlung des Benutzers Pass wird , suchen Sie Ihr Konto, mit dem Sie sich angemeldet haben, und ändern Sie dessen Regel auf Verkäufer Stellen Sie sicher, dass Verkäufer, nicht Verkäufer. Jetzt müssen wir ein Press-API-Token generieren , weil wir unsere Daten ändern. Senden Sie die Anmeldeanfrage und kopieren Sie dieses Token zurück zur Produkt-API. Hier in der Kopfzeile ersetzen wir das alte Token durch das neue Barrer Space Token Lassen Sie uns jetzt die Anfrage senden. Siehst du, hier sind wir, der Verkäufer ist hier. Wunderbar. 121. Benutzerdefinierte rollenbasierte Autorisierung: Zuvor haben wir die Kategorien-API hinzugefügt. Hier haben wir die Rolle des Benutzers beim Hinzufügen einer neuen Kategorie nicht überprüft . Hier wollen wir auch. Nur Admin kann Kategorien hinzufügen. Es gibt also zwei Möglichkeiten für uns. Wir können eine neue Middleware erstellen, genau wie diese Check-Seller-Middleware, oder wir können eine neue Middleware erstellen die jede Rolle des Benutzers überprüft Wenn wir in dieser Middleware admin übergeben, sollte wir in dieser Middleware admin übergeben Wir übergeben den Verkäufer, dann sollte es nur Verkäufer zulassen. Beide Optionen sind gut. Es hängt wirklich von dir ab , was du wählen möchtest. Lass mich dir beiden zeigen. Für Admin kopieren wir einfach den gesamten Code aus der Check-Seller-Datei und erstellen im Middleware-Ordner eine neue Datei namens check admin dot gs und fügen diesen Code einfach Jetzt müssen wir hier kleine Änderungen vornehmen. Zuerst ändern wir diesen Funktionsnamen. Wählen Sie dies aus und drücken Sie F zwei und schreiben Sie check admin. Danach müssen wir diese Bedingung ändern , die Rolle auf admin und auch in der Fehlermeldung admin only, und schon sind wir mit unserer Admin-Middleware fertig Wir können diese Middleware nach der Osmalware zu unserer API hinzufügen nach der Osmalware Lassen Sie mich Ihnen nun zeigen, wie wir eine allgemeine Regelprüfung oder Middleware erstellen können allgemeine Regelprüfung oder Middleware erstellen Es ist wirklich einfach. Im Middleware-Ordner erstellen wir eine neue Datei namens check role dot js Auch hier können wir einfach denselben Code einfügen und diesen Funktionsnamen ändern , um die Regel zu überprüfen Jetzt fragen Sie sich vielleicht, wie können wir die Regel in dieser Funktion übergeben? Denn wie wir wissen, müssen wir an der Stelle der Middleware nur diese Funktion hinzufügen und dann rufen wir diese Callback-Funktion Hier können wir einfach eine Sache tun. Wir können hier eine weitere Pfeilfunktion hinzufügen. also nach dem Gleichheitszeichen Fügen Sie also nach dem Gleichheitszeichen den Rollenparameter und dann die Pfeilfunktion hinzu. Bevor wir also diese Pfeilfunktion hinzufügen, für den Zugriff auf diesen Anforderungsantwort-Callback müssen wir für den Zugriff auf diesen Anforderungsantwort-Callback die Jack-Regelfunktion aufrufen Nachdem wir nun diese Pfeilfunktion für den Zugriff auf diesen Anforderungsantwort-Callback hinzugefügt haben, müssen wir die Jack Rule Function aufrufen Hier übergeben wir die Regel des Benutzers, sagen wir admin. Und danach rufen wir es einfach noch einmal an. diese Weise können wir auf diesen Rückruf zur Beantwortung von Anfragen zugreifen Dies wird als Funktion höherer Ordnung bezeichnet. Eine Funktion höherer Ordnung ist eine Funktion, die eine andere Funktion zurückgibt oder eine andere Funktion als Argument verwendet. Hier geben wir diese Callback-Funktion in dieser Prüfregelfunktion zurück In einfacher Syntax sieht es ungefähr so aus. Hier ist die Check-Rule-Funktion, und sie gibt einfach diese Callback-Funktion zurück Aus diesem Grund rufen wir die Prüfregel zuerst auf und müssen sie dann erneut aufrufen, um auf diese Rückgabefunktion zuzugreifen Ich hoffe, es klärt deine Zweifel. Hier können wir diese Verkäuferzeichenfolge durch den Regelparameter ersetzen . Und hier, für eine benutzerdefinierte Fehlermeldung, konvertieren wir diese Codes in Backdigs, und beim Verkäufer fügen wir die Dollar-Rolle hinzu und das war's Jetzt können wir diese benutzerdefinierte Middleware zur Regelprüfung jede Art Es hängt also wirklich von Ihnen ab, ob Sie die Middleware Check Seller und Check und Mid verwenden möchten oder ob Sie die Middleware Check Rule verwenden möchten Ich verwende gerne diese Check Rule-Middleware. In der Produkt-API am Ort des Scheckverkäufers müssen wir die Check Rule-Middleware aufrufen Und hier bestehen wir Rule Seller. Dieser Check-Rulle-Verkäufer ist derselbe wie Check-Seller-Middleware Beide nennen diesen Request Response Nun zu den Kategorien möchte ich auch die Rolle als Administrator überprüfen. In der Kategorie Route möchten wir Middleware hinzufügen, um eine neue Kategorie zu erstellen Jetzt ist hier eine Frage. Warum sollten wir Middleware mit Prüfrolle hinzufügen Vor diesem Multer-Upload oder danach? Richtig, wir fügen es vor dieser Multer-Upload-Methode , weil wir zuerst die Regel überprüfen Wenn es admin ist, speichern wir das Symbolbild auf unserem Server Wir fügen Jack Roll-Middleware nach der Ulter-Methode hinzu, dann speichert sie zuerst das Bild unserem Server und überprüft dann Also fügen wir vorher Check-Roll-Middleware und übergeben hier Bevor wir die Roll-Middleware überprüfen, müssen wir außerdem die Auth-Middleware hinzufügen, denn wie können wir ohne diese die Benutzerinformationen im Request-Punkt-Benutzer abrufen ? Speichern Sie die Änderungen und lassen Sie uns unsere Produkt-API probieren . Senden Sie diese Anfrage und hier erhalte ich eine Fehlermeldung. Lass mich nachschauen. Es ist ein Fehler in der Check-Role-Datei. Oh, tut mir leid, ich habe vergessen, diesen Funktionsaufruf zu entfernen. Sehen Sie sich die Änderungen an und lassen Sie uns die Anfrage erneut senden. Siehst du, hier haben wir den Verkäufer. Das bedeutet, dass unsere Middleware funktioniert. diese Weise können wir diese Middleware für Prüfregeln für jede Art von regelbasierter Autorisierung verwenden diese Middleware für Prüfregeln für jede Art von regelbasierter jede Art von 122. Verarbeiten mehrerer Images von Produkten: Bevor wir die eigentlichen Produktdaten in der Datenbank speichern, erstellen wir eine Multi-Upload-Methode zum Speichern mehrerer Produktbilder. Hier kann der Verkäufer also mindestens ein Bild oder maximal acht oder zehn Bilder hochladen . Aus der Kategorienroute kopiere ich einfach diesen Speicherdateifilter, lade Variablen hoch und füge ihn vor unsere Produkt-API ein. Gut. Jetzt müssen wir zunächst das Multar-Paket importieren Die Kosten von Multer entsprechen also der Anforderung von Multer. Außerdem können wir diesen Jag Seller-Middleware-Import entfernen . Wir brauchen ihn nicht Jetzt müssen wir hier ein paar Änderungen vornehmen. Zuerst ändern wir das Ziel, um Slash-Produkte hochzuladen Auf diese Weise können wir sicherstellen, dass Produktbilder vom Kategoriesymbol getrennt sind Und wie wir wissen, erstellt Multer kein Verzeichnis von selbst, also müssen wir es erstellen Im Upload-Ordner erstellen wir einen neuen Ordner namens Products Hier werden wir das Bild unserer Produkte speichern. Dies sind kleine Details , die wir bei der Arbeit mit Nod Jas berücksichtigen müssen wir bei der Arbeit mit Nod Jas berücksichtigen Wenn Sie mehr in Nod Jaz arbeiten, werden Sie all diese Dinge wissen Mach dir darüber keine Sorgen . Danach ist der Dateiname okay. Der Dateifilter ist auch in Ordnung. Wenn Sie auch Videos speichern möchten, müssen wir diese MM-Typen in das Array der zulässigen Typen aufnehmen. Im Moment wollen wir es nicht, und auch die Größenbeschränkung liegt bei zwei MB, was auch in Ordnung ist. Hier fragen Sie sich vielleicht, dass dieses Limit von zwei MB für die kombinierte Größe aller Bilder gilt. Nein, es gilt für jede Bildgröße, nicht für die kombinierte Größe. Fügen wir nun diese Upload-Methode zu dieser API hinzu. Fügen Sie nach der Jackrll-Middleware den Upload-Punkt Wir möchten mehrere Bilder speichern, also können wir hier Array Dot Single für eine einzelne Datei und Dot Array für mehrere Dateien verwenden und Dot Array Jetzt müssen wir hier den Dateinamen für diese Bilder angeben. Hier setzen wir es auf Bilder. Sie müssen also vom Frontend aus alle Produktbilder in den ausgefüllten Einzelbildern senden . Wir werden sehen, dass wir, wenn wir diese API testen, jetzt, nachdem wir den Feldnamen übergeben haben, das Limit der Dateien überschreiten können. Was ist die maximale Anzahl von Dateien, die wir speichern möchten? Für E-Commerce-Anwendungen sind acht mehr als ausreichend, aber Sie können diese Anzahl auch an Ihre Bedürfnisse anpassen. Wenn Sie das Höchstlimit nicht festlegen möchten, müssen wir auch den zweiten Parameter nicht übergeben. Aber hier wollen wir acht Bilder. Wie wir bereits gesehen haben, erhalten wir die Dateiinformationen in der Anforderungspunktdatei, da es eine einzige Datei gibt. Aber hier haben wir es mit mehreren Dateien zu tun, also werden wir die Daten dieser Datei im Plural der Anforderungspunktdateien abrufen Plural der Anforderungspunktdateien Auf diese Weise werden wir jeden Dateinamen in der Datenbank abrufen. Wir können hier auch eine allgemeine Ulter-Funktion erstellen, aber das wird zu unnötiger Verwirrung führen Deshalb lassen wir es so wie es ist. In der nächsten Lektion werden wir nun die Produktdaten in der Datenbank speichern . 123. Erstellen neuer Produkte: Lassen Sie uns die Produktdetails in der Datenbank speichern. Zuallererst erhalten wir in diesem Callback alle Felder, die wir im Hauptteil der Anfrage übergeben werden im Hauptteil der Anfrage übergeben Die Kosten für CLI-Pakete entsprechen also dem Hauptteil der Anfrage. In diesem Hauptteil erhalten wir nun zunächst den Titel, Beschreibung und die Kategorie, also die Kategorie-ID, den Preis und den Lagerbestand. Danach müssen wir ein Bilderarray erstellen, das ist das Array von Bildnamen, und wie können wir das bekommen? Wir erhalten also alle Bilddetails im Array mit den Anforderungspunktdateien, und alle Bilddaten sind im Objekt auf diese Weise verfügbar. Und hier bekommen wir einen Dateinamen. Also können wir das machen. Die Kosten für Bilder entsprechen den Anforderungspunktdateien Dot MAP. Hier erhalten wir die Pfeilfunktion für jedes Bildobjekt und geben einfach den Namen der Bildpunktdatei zurück. Dieser Dateiname ist das, was wir oben generiert haben. Mit dieser Kartenmethode erhalten wir nun das Array der Bildnamen. Außerdem haben Verkäufer manchmal vergessen, Bilder hinzuzufügen. Wir können hier eine Bedingung angeben, wenn Punktlänge der Bilder gleich Null ist. Wenn es wahr ist, geben wir einfach den Antwort-Punktstatus, 400-Punkt-JSON, zurück . Und hier übergeben wir einen Fehler in einem Objekt mit unordentlicher Eigenschaft. Es ist mindestens ein Bild erforderlich. Jetzt haben wir hier alle Informationen. Lassen Sie uns diese Informationen schnell in der Produktkollektion speichern . Kosten, neues Produkt entspricht neuem Produkt. Siehst du, hier bekommen wir die Autorisierung, Produkte vom Modell, gut, und hier übergeben wir ein neues Produktobjekt. In diesem Objekt, Titel zu Titel, und wie wir wissen, , wenn Objekteigenschaft und Wertname identisch sind können wir das einfach entfernen, wenn Objekteigenschaft und Wertname identisch sind. Beides funktioniert gleich. Als nächstes die Beschreibung, Kategorie, Preis, Bestand, Bilder. Und jetzt müssen wir endlich den Verkäufer einlagern. Wie können wir diesen Verkäufer finden? Richtig, wir können die Punkt-Unterstrich-ID für die Anfrage verwenden, da unsere Osmitalware die Nutzungsdetails im Anforderungspunkt-Benutzer Punkt-Unterstrich-ID für die Anfrage verwenden, da unsere Osmitalware festlegt Lassen Sie uns die Füllungen zählen, um zu sehen, ob Ihnen Füllungen fehlen oder nicht Eins, zwei, drei, vier, fünf, sechs und sieben. Das Produktschema, wir haben auch ein, zwei, drei, vier, fünf, sechs, sieben und 80er-Jahre-Rezensionen, die wir jetzt nicht hinzufügen werden, also sind wir auf dem richtigen Weg. Lassen Sie uns nun diese Daten speichern. Await new product dot c für die Verwendung von await müssen wir dafür sorgen, dass diese Funktion jetzt ganz unten ist. Lassen Sie uns den Antwortpunktstatus auf 01 Punkt GSN zurücksetzen und hier senden wir neue Produktdaten Speichern Sie die Änderungen, weniger ist diese API. Das ist wirklich aufregend. Im Ressourcenordner habe ich ein Projekt zum Ordner hinzugefügt, und dort finden Sie den Ordner Produkte, und darin habe ich Produktbilder nach Kategorien hinzugefügt, und Sie erhalten auch die Datenpunkt-GSN-Datei Darin habe ich Titel, Beschreibung und alle anderen Details hinzugefügt , Beschreibung und alle anderen Details Öffnen Sie diesen Datenpunkt jsnFle im VS-Code. Sehen Sie hier Ich habe den Kategorienamen oben hinzugefügt und in der Produktreihe habe ich alle Produktdaten mit Titel, Beschreibung, Preis, Lagerbestand, Bild ist Name hinzugefügt , sodass Sie das Bild danach suchen können Der Grund, warum ich hier keine Kategorie-ID hinzufüge, ist, dass für jede Kategorie-ID eine andere sein kann, weil wir zuvor die Kategorie manuell hinzugefügt haben. Hier ist meine Smartphone-Kategorie und hier ist es die ID. Sie können es mit Ihrer Kategorie-ID vergleichen . Es kann nicht dasselbe sein. Kopieren Sie diese ID, gehen Sie zu Postman, hier, gehen Sie zuerst zu den Formulardaten Hier fügen wir einfach die Schlüsselkategorie und den Wert hinzu, der über die Kategorie-ID von Smartphones hinausgeht Als Nächstes müssen wir den Titel, dann die Beschreibung, den Preis und den Lagerbestand hinzufügen . Ich kopiere alle Details nacheinander aus der JSON-Datei und füge sie hier ein. Wählen Sie zuerst den Titel aus, fügen Sie ihn hier ein, Beschreibung. Der Preis beträgt 1299€ und der Lagerbestand beträgt acht €. Also weiter mit der Beschreibung, Preis 1299, also USD und Aktie auf acht Jetzt müssen wir nur noch Bilder für dieses Produkt hinzufügen. Unten fügen wir weitere wichtige Bilder hinzu. Hier wählen wir den Dateityp aus, und jetzt wählen wir unsere iPhone 14-Bilder aus. Gehen Sie also zum Ordner Produkte, Smartphones, und wir gehen zum Ordner iPhone 14 Pro. Wählen Sie hier alle Bilder 1-4 aus. Lassen Sie uns nun diese Daten senden. Siehst du, hier bekommen wir diese neuen Produktdaten. Hier haben wir die Verkäuferkategorie, Bildnamen im Array und auch in unserem Backend im Ordner „Produkte hochladen erhalten wir diese Bilder. Wir haben einen tollen Job gemacht. Ich füge all diese Produktdetails in meine Datenbank ein. Wenn wir die GD-Produktabfrage mit Paginierung ausführen, erhalten wir mehr Daten Sie können auch alle Produkte in Ihre Datenbank aufnehmen, wenn Sie möchten Andernfalls können Sie diesen Teil einfach überspringen. Jetzt kopiere ich den nächsten Produkttitel und füge ihn hier ein. Berühren Sie nicht die Kategorie-ID , da wir uns immer noch in derselben Kategorie befinden. Beschreibung. Fügen Sie es hier ein und Preis beträgt 399€ und der Lagerbestand 50€. Lassen Sie uns nun Bilder für Samsung a 54 auswählen. Senden Sie diese Anfrage. Gut. Auf diese Weise können Sie alle Produkte oder mindestens zehn Produkte hinzufügen. Ändern Sie einfach die Kategorie-ID , wenn Sie die Kategorie des Produkts ändern. Ich weiß, das ist langweilig, aber wir können diese Daten verwenden, um unsere Get-Products-API auszuprobieren. Also mach etwas gruselige Musik und kreiere diese Produkte. Ich mache das auch, wir sehen uns in der nächsten Lektion. 124. Alle Produktdaten abrufen: In der vorherigen Lektion haben wir also Produkte zur Datenbank hinzugefügt. Siehst du, ich habe alle 24 Produkte in der Datenbank hinzugefügt. Lassen Sie uns diese Produkte nun über die API abrufen , denn so erhält Front Ten diese Daten. Nach der Post-API fügen wir also den Router-Punkt Get hinzu und zeigen auf den Schrägstrich Jetzt fügen wir hier keine Middleware weil wir wollen, dass jeder Benutzer alle Produkte sehen kann, nicht nur angemeldete Also fügen wir hier direkt einen letzten Rückruf mit Anfrage Gut. Hier bekommen wir zuerst alle Produkte, also const products ist gleich products dot find Wir stellen hier keine Bedingung weil wir alle Produkte haben wollen Und hier müssen wir Await für die Anfrage hinzufügen. Und für await fügen wir hier async hinzu und am Ende geben wir einfach den Antwortpunkt jCNPducts zurück Also die Änderungen, lasst uns diese Implementierung testen. Im Postman erstellen wir eine neue Anfrage in der Produktkollektion G A-Produkte Hier geben wir den Endpunkt für APIs Products ein, wählen Methode bis G aus und senden die Anfrage einfach Sehen Sie hier, wir erhalten alle Produktdaten im Array. Und in diesem Array erhalten wir ein Objekt für jedes Produkt mit allen Feldern. Jetzt ist meine Frage, brauchen wir hier alle Details? Können wir die Größe der Daten, die wir vom Backend senden, reduzieren ? Wenn wir den Mauszeiger über diese Größe bewegen, erhalten wir die Antwortgröße, wobei Header und Hauptteil getrennt Beachten Sie die aktuelle Datengröße 14,39 KB. Lassen Sie mich Ihnen nun zeigen, wie unsere Produktseite im Frontend aussehen sollte Sehen Sie, hier haben wir die Liste aller Produkte, und sie ist Amazon oder einer E-Commerce-Anwendung fast ähnlich . Wenn Sie auf die Produktkarte achten, benötigen wir nicht wirklich alle Details. Schreiben wir die Füllungen, die wir anzeigen möchten, auf die Produktkarte. erste ist die ID, um den Titel des Produktpreises zu identifizieren, Lagerbestand, wenn Produkte auf Lager sind, erst dann zeigen wir die Schaltfläche „ Kopf zur Karte“ an. Als nächstes wird natürlich das Bild angezeigt, das das erste Bild aus dem Bildarray sein wird. Als Nächstes benötigen wir Details zu den Bewertungen, und das ist alles. In unserer Abfrage fügen wir die Select-Methode zur Auswahl der Füllungen hinzu. Anstatt die Namen aller Füllungen hinzuzufügen, können wir jetzt schreiben, welche Füllungen wir nicht möchten. Dafür fügen wir vor dem Feldnamen einfach ein Minuszeichen oder ein Minuszeichen hinzu. Wir brauchen keine Beschreibung. Außerdem möchten wir den Verkäufer nicht anzeigen. Auch keine Kategorie, und wir wollen auch keinen Unterstrich V. Das ist nicht notwendig. Hier sind die Änderungen und werfen Sie einen Blick darauf. Lassen Sie uns dieselbe Anfrage erneut senden und die Größe überprüfen. Siehst du, es wird um ein Drittel reduziert weil die Beschreibung mehr Daten enthält als jedes andere Feld, und deshalb entfernen wir unnötige Füllungen. Lassen Sie uns diese Daten nun eingrenzen. Hier wollen wir auch nicht alle Bilder haben. Wir möchten nur, dass das erste Bild auf dem Cover angezeigt wird. Dafür gibt es jetzt zwei Lösungen. Erstens können wir in unserem Produktmodell eine separate Füllung wie ein Displaybild oder ein Titelbild erstellen . Wenn wir das neue Produkt speichern, speichern wir in diesem Feld den Namen des ersten Bildes. Das ist eine Lösung. Eine andere Lösung besteht darin, dass wir den ersten Bildnamen von jedem Produkt extrahieren und ihn demselben Produktobjekt hinzufügen können jedem Produkt extrahieren und ihn demselben Produktobjekt hinzufügen demselben Produktobjekt , das wir vom Backend senden. Auf diese Weise haben wir kein Problem mit der Datenduplizierung. Sehen Sie, beide Lösungen sind großartig. Hier können wir die erste Lösung nicht anwenden , da wir alle Produkte hinzugefügt haben. Ich zeige Ihnen die zweite Lösung, die auch großartig ist. Zuallererst schreiben wir hier Produkte Dot Map. Jetzt bekommen wir hier einzelnes Produktobjekt und eine Pfeilfunktion. Wie wir nun wissen, wird alles, was wir von dieser Funktion zurückgeben, das Element des neuen Arrays sein. Die Logik ist, dass wir alle Daten zurückgeben , die wir in einem einzigen Produkt haben, und dann wollen wir das Bilderarray nicht senden, also werden wir diese Eigenschaft images durch das erste Element images ersetzen . Wir wollen ein Bilderarray . Wenn wir keine neue Eigenschaft mit demselben Namen hinzufügen, können wir dafür sorgen, dass ein Bild oder etwas anderes angezeigt wird, aber hier wollen wir kein Bildarray senden. Deshalb geben wir den gleichen Namen. Lass es mich dir zeigen. Hier geben wir das Objekt zurück. Darin werden wir zunächst alle Eigenschaften des einzigen Produktverbreitungsbetreibers hinzufügen . Wir fügen alle Eigenschaften eines einzelnen Produkts so hinzu, wie es ist. Danach fügen wir, um die Eigenschaft images zu ersetzen, hier Bilder hinzu und hier als Wert setzen wir den Produktpunkt Images, erste Element, was Index Null ist. Erledigt. Jetzt gibt diese Map-Methode ein neues Array mit allen aktualisierten Einzelproduktobjekten zurück. Wir speichern es in einer Variablen, die als aktualisierte Produkte bezeichnet wird. An der Stelle der Produkte wir einfach aktualisierte Produkte als Antwort auf Punkt JSO zurück Speichern Sie die Änderungen und lassen Sie uns sehen, ob wir das richtig hinbekommen oder nicht Siehst du, hier bekommen wir ein seltsames Objekt und am Ende jedes Objekts erhalten wir diese Eigenschaft images, was bedeutet, dass unsere Map-Methode funktioniert. Aber warum bekommen wir dieses seltsame Objekt. Lassen Sie uns einfach dieses Produkt-Array und Al in der Antwort-Punkt-JSON-Datei mit Punkt protokollieren , wir senden erneut das Produktobjekt Speichern Sie die Änderungen und lassen Sie uns die Anfrage senden. Sehen Sie, hier bekommen wir das reguläre Produktarray und zurück zum VS-Code, öffnen das Terminal und sehen Sie, hier bekommen wir das gleiche Produktarray. Versuchen wir nun, diese Konsolenlinie in der Map-Methode zu verschieben . Und an der Stelle der Produkte protokollieren wir das einzelne Produkt in der Konsole. Speichern Sie die Änderungen und lassen Sie uns die Anfrage senden. Ein Terminal, S, hier bekommen wir wieder das reguläre Einzelproduktobjekt. Ich denke, wenn wir den Spread-Operator hinzufügen, dass wir, wenn wir die Eigenschaften eines Objekts erhalten, statt eines einzelnen Produkts, es in das Objekt einbinden und hier den Spread-Operator hinzufügen. Also die Änderungen und sende die Anfrage. Zurück zu VSCode. Siehst du, hier bekommen wir dieses seltsame Objekt. Was passiert hier. Das passiert also, wenn wir Daten mit Mangos abrufen, wir bekommen kein einfaches Javascript-Objekt. Wir erhalten ein Mongoose-Dokumentobjekt, das sowohl die Rohdokumentdaten im Dog als auch zusätzliche Eigenschaften und Methoden wie Dollar Underscore Underscore, Dollar is new von mongoose für die Verwaltung des Dokuments enthält zusätzliche Eigenschaften und Methoden wie Dollar Underscore Underscore, Dollar is new von mongoose Jetzt ist das Problem, dass wir diese Eigenschaften und Methoden nicht wollen . Willst du ein einfaches JavaScript-Objekt aus der Datenbank, kein Mangos-Dokumentobjekt Um dieses Problem zu lösen, fügen wir einfach eine Eigenschaft am Ende dieser Abfrage Dadurch werden alle zusätzlichen Mangos-spezifischen Eigenschaften entfernt. Jetzt können wir hier aktualisierte Produkte in der Antwort zurücksenden. Speichern Sie die Änderungen und schauen Sie sich das an. Senden Sie diese Anfrage und sehen Sie, hier ersetzen wir das Bildarray durch den ersten Bildnamen, und wenn wir unsere Datengröße überprüfen, reduzieren wir mehr. Wunderbar. So debuggen und finden wir den Fehler Jetzt ist hier auch die eine Sache. Hier senden wir eine vollständige Bewertungsmatrix , in der wir ein Objekt haben , das Nutzungsdetails, die Bewertung und auch einen Kommentar hat . Derzeit liegen uns für alle Produkte keine Bewertungen vor. Aus diesem Grund können wir diese großen Datenmengen nicht sehen. Außerdem wollen wir im Frontend nur den Bewertungsdurchschnitt und die Gesamtzahl der Bewertungen anzeigen . Wir können das Bewertungsfeld auch durch nur zwei Eigenschaften ersetzen . Lass es mich dir zeigen. Wir entfernen diese Konsole. Wir brauchen sie nicht. Erstellen Sie zunächst eine neue variable Kostenzahl. Die Anzahl der Bewertungen entspricht dem Produkt Dot Rev Dot LNT Hier, Jack, du hast Bewertungen oder eine Bewertung. Ich habe eine Bewertung, also bleibe ich bei der Produktbewertung. Wie können wir nun den Durchschnitt ermitteln? Durchschnitt bedeutet im Grunde, dass wir alle Bewertungszahlen summieren und durch die Gesamtzahl der Bewertungen teilen müssen. Wir definieren eine neue Variable Cast sum of ratings is equal to now. Um die Bewertungen zu summieren, verwenden wir Reduce, das ist die Array-Methode. Badu Dot Review, das heißt Array Dot Reduce. Jetzt haben wir hier zwei Parameter. Der erste ist der Gesamtwert, oder wir können Summe sagen, und der zweite ist der aktuelle Wert , also eine einzelne Bewertung. Und was möchten Sie in diesem Rückruf tun? Einfach Summe plus Prüfpunkt lesen. Danach können Sie im zweiten Parameter den Standardwert dieser Summe festlegen , den wir auf Null setzen. Diese reduzierte Methode benötigt zwei Argumente. Die erste ist die Callback-Funktion , mit der wir einige mathematische Operationen ausführen, und die zweite ist der Standardwert des Summenparameters Jetzt haben wir die Summe der Bewertungen Die durchschnittliche Kostenbewertung entspricht der Summe der geteilt durch die Anzahl der Nun, hier ist eine Sache. Wenn die Anzahl der Bewertungen Null ist, was dann? 0/0 gibt uns undefiniert. Wenn die Anzahl der Bewertungen Null ist, ASiR oder Betreiber eins Dadurch wird dieser Fehler verhindert. Lassen Sie uns nun das Review-Array durch diese beiden Eigenschaften ersetzen. Nach den Bildern ordnen wir die Bewertung dem Objekt, der Anzahl der Bewertungen der Anzahl der Bewertungen zu. Der Einfachheit halber entfernen wir die zweite Eigenschaft, Durchschnittsbewertung zur Durchschnittsbewertung. Speichern Sie die Änderungen und sehen Sie sich das an. Senden Sie die Anfrage erneut und sehen Sie, ob wir sie als Objekt überprüfen können. Aus der Anfrage heraus senden wir also nur das, was das Frontend benötigt. So müssen wir also denken, wenn wir Daten vom Backend senden. 125. Paginierung oder unendliche Abfrage: Aktuell versenden wir alle 24 Produkte aus der Datenbank Stellen Sie sich vor, wir haben 100 oder tausend Produkte in unserer Datenbank. Wenn wir haben 100 oder tausend Produkte Sie dann alle Produkte in einer einzigen Antwort senden , wird unsere API langsamer. Sag mir, was sollen wir in dieser Situation tun? Richtig, wir können Daten Seite für Seite senden, sodass unser Frontend Funktionen für Seitennummerierung oder unendliches Scrollen implementieren kann Seitennummerierung oder unendliches Scrollen Das haben wir bereits in Abschnitt 7 gesehen. Lassen Sie uns eine Paginierung oder eine Abfrage mit unendlichem Scrollen implementieren. Das Backend ist für beide Funktionen gleich. Zunächst ermitteln wir die aktuelle Seitennummer aus dem Abfrageparameter, und wie können wir darauf zugreifen? Richtig, auf Anfrage Punktabfrage. Die Kostenseite entspricht der Punktseite der Anfrage. Nun, diese Punktabfrage mit Punktabfrage ist eine Zeichenfolge, denn was auch immer wir aus dem Abfrageparameter erhalten , es ist eine Zeichenfolge. Wir müssen diese Seite in eine Ganzzahl umwandeln, sie mit Klammern umschließen und die Ganzzahl analysieren Als Nächstes müssen wir definieren, wie viele Produktdaten wir auf einer Seite senden möchten Const pro Seite entspricht also acht. Jetzt müssen wir unserer Abfrage einfach zwei Methoden hinzufügen. erste ist Punkt Skip und hier übergeben wir Klammerseite minus eine pro Wenn Seite eins ist, dann eins minus eins, aus Null wird acht, was ebenfalls Null ist In unserer Anfrage werden keine Produkte übersprungen. Wenn Seite zwei ist, dann zwei minus eins, was eins zu acht ergibt, was acht ist. Also unsere Query Überspringe die ersten acht Produkte. Jetzt, nach Skip, müssen wir die Eigenschaft Limit hinzufügen, und zwar pro Seite. Limit gibt also an, wie viele Daten wir aus der Datenbank abrufen möchten So einfach ist das. Lassen Sie uns diese Implementierung testen und die Anfrage senden. Siehst du, wir bekommen nur acht Produkte. Jetzt fragen Sie sich vielleicht, dass wir die Seite im Abfrageparameter nicht übergeben haben. Wir bekommen immer noch acht Produkte. Ja, wir erhalten acht Produkte, weil diese Punktabfrage-Punktseite für Anfragen nicht definiert ist. der Skip-Methode werden also keine Artikel übersprungen, und dann setzen wir das Limit auf acht. Deshalb bekommen wir acht Produkte. Was ist, wenn wir diese Abfrage stärker an das Frontend anpassen möchten? Stellen Sie sich vor, unser Frontend möchte die Produkte pro Seite im Abfrageparameter aufsteigen Nehmen wir an, zehn Produkte auf einer Seite. Wir können so etwas machen. Anstelle dieses hartcodierten Ed erhalten wir den Abfrageparameter Request Query Dot Perpge Auch hier konvertieren wir ihn mit Parse Integer in eine Ganzzahl. Auch wenn das Frontend nicht pro Seitenparameter übergeben möchte, übergeben Sie hier den Standardwert, also Operator 8. Und wir können diese Seite bearbeiten, indem wir einen Operator hinzufügen und der Standardwert ist eins. Sehen Sie sich die Änderungen an und lassen Sie uns Daten von Seite zwei abrufen. Also stellen wir das Fragezeichen am Ende der URL für die Übergabe des Abfrageparameters in Frage. Seite ist gleich zwei. Außerdem geben wir pro Seite zehn weiter und senden die Anfrage ab. Sehen Sie, unsere Anfrage, überspringen zuerst zehn Datensätze und senden dann Seite zwei , also 11 bis 20 Produkte. Nun, hier ist eine Sache. Im Frontend benötigen sie oft mehr Details wie die Gesamtzahl der Produkte. diese Weise entscheiden sie, wie viele Seiten sie anzeigen müssen oder wie oft sie die Daten vom Backend abrufen können. Sie wollen also die aktuelle Seitennummer und einige andere Details. Lassen Sie uns diese Details schnell abrufen und sie in der Antwort weitergeben. Zuallererst können wir nach diesen Update-Produkten so etwas tun. Die Kosten, die Gesamtzahl der Produkte entspricht den Dokumenten, die auf das Produkt warten. Damit werden alle Produkte gezählt. Danach können wir auch die Gesamtzahl der Seiten zählen, die Kosten, die Gesamtzahl der Seiten entspricht der Gesamtzahl der Produkte, dividiert durch pro Seite. Nehmen wir an, wir haben 50 Produkte und pro Seite sind es acht, dann erhalten wir 6,25, was ganze sechs Seiten bedeutet, und wir benötigen eine weitere Seite, um zwei Produkte anzuzeigen Es ist also besser, wir versiegeln diese Nummer immer. Dafür müssen wir diese Gleichung einfach mit der mathematischen Punkt-SL-Funktion umschließen . Dadurch werden diese 6,25 in sieben umgewandelt. An der Stelle, an der wir dieses aktualisierte Produktarray senden, übergeben wir hier das Objekt. Zuerst ordnen wir Produkte aktualisierten Produkten zu, Produkte insgesamt, Produkte insgesamt, oder wir können dies auch entfernen. Außerdem geben wir die Gesamtzahl der Seiten weiter. Außerdem können wir Seite, also die aktuelle Seite, von Seite zu Seite senden und Beiträge pro Seite pro Seite senden. Ich habe hier alle Informationen hinzugefügt, aber Sie können sie nach Ihren Bedürfnissen hinzufügen. Speichern Sie die Änderungen und lassen Sie uns dieselbe Anfrage senden. Siehst du, wir bekommen eine Reihe von Produkten und damit erhalten wir diese Details. Das ist alles, was wir für Paginierung oder unendliche Abfragen tun Paginierung oder unendliche Abfragen 126. Versenden von Produkten nach Kategorie: Produkte erhalten, möchten wir vielleicht nur Produkte nach Kategorien erhalten. Dafür müssen wir keine neue API erstellen. Wir können das einfach auch in dieser Abfrage implementieren. Zuerst erhalten wir den Kategorienamen im Abfrageparameter. Die Kategorie der Kostenabfrage entspricht der Punktkategorie der Anfrage. Wenn wir die Kategorie nicht übergeben, geben wir hier oder Null weiter. Danach fügen wir für query die Variable let query hinzu. Wir setzen es auf ein leeres Objekt. Hier übergeben wir dieses Abfrageobjekt in dieser feinen Methode. Jetzt können wir diese Abfrage nach unseren Bedürfnissen ausfüllen. Diese Abfrage ist das Vergleichsobjekt. Wir übergeben hier, ob die Kategorie der Bedingungsabfrage verfügbar ist, müssen dann zuerst die Kategorieeigenschaft zur Kategorie-ID in diesem Abfrageobjekt hinzufügen . Wenn wir nun vom Frontend direkt die Kategorie-ID erhalten, können wir diese ID direkt in das Abfrageobjekt übergeben. Aber meistens bekommen wir den Kategorienamen vom Frontend. Wir müssen die Kategorie-ID aus unserer Datenbank finden. Die Kostenkategorie entspricht der Gewichtsklasse Punkt Fein Vn. Hier übergeben wir den Namen des Vergleichsobjekts an die Abfragekategorie. Stellen Sie sicher, dass wir dieses Kategoriemodell oben importieren. Die Kostenkategorie entspricht also der Kategorie „Erforderlich“. Hier geht es einen Ordner nach oben in der Modellkategorie. Was ist nun, wenn wir die Kategorie nicht finanzieren? Hier prüfen wir, ob die Kategorie nicht verfügbar ist. Wir geben einfach eine Antwort mit dem Statuscode 404 zurück, in der Jason-Methode nicht gefunden wurde, übergeben das Objekt mit der Nachrichteneigenschaft, Kategorie, nicht gefunden. Am Ende legen wir einfach fest, dass Abfragekategorie der Unterstrich-ID der Kategorie entspricht Jetzt sieht unser Abfrageobjekt so aus. Wenn wir das in unserer feinen Methode übergeben, dient es als Vergleichsobjekt. Lassen Sie uns das jetzt von Mongoi Become Pass testen, gehen wir zur Kategoriensammlung und kopieren Sie eine beliebige Kategorie Angenommen, ich kopiere die Kategorie Smartwatches. Nun zurück zu Postman in der URL, wir fügen einen weiteren Abfrageparameter und die Kategorie entspricht Stellen Sie sicher, dass Sie den gleichen Namen eingeben, den wir in der Kategoriensammlung haben , und senden Sie diese Anfrage Und hier bekommen wir ein leeres Array. Oh, hier geben wir an, dass Seite gleich zwei ist, und in dieser Kategorie haben wir nicht so viele Daten , die wir auch auf der Seite anzeigen können. Also ändern wir diese Seite in eine und senden die Anfrage. Siehst du, hier bekommen wir alle Uhrenprodukte. 127. Produkt per Suche senden: In unserer Anwendung kann der Benutzer auch nach Produkten suchen und möchte alle Produkte entsprechend seiner Suche sehen . Wir können das auch in dieser einzigen Abfrage implementieren. Es ist nicht zwingend erforderlich, alle Funktionen in dieser Abfrage hinzuzufügen, aber ich zeige Ihnen die Praxis in der Praxis. Nach dieser Kategorie entspricht die Kostenabfragesuche dem Anforderungsabfragepunkt SRG, oder wir setzen sie auf Null Nach dieser Kategoriebedingung fügen wir eine weitere If-Bedingung hinzu, Abfragesuche ist verfügbar, dann legen wir eine weitere Eigenschaft im Abfrageobjekt Der Titel des Abfragepunkts entspricht dem Objekt. Hier fügen wir Dollar jx hinzu, um Surge abzufragen und damit bei dieser Abfrage nicht zwischen Groß- und Kleinschreibung , übergeben wir eine weitere Eigenschaft Dollar-Optionen, an die Zeichenfolge I. Außerdem müssen wir unten in diesen Tutor-Produkten in diesen Tutor-Produkten das Query-Objekt in der Methode count document übergeben in der Methode count Ich habe in der vorherigen Lektion vergessen, es zu bestehen , und das war's Speichern Sie die Änderungen und sehen Sie sich das an. Fügen Sie hier einen weiteren Abfrageparameter hinzu, und Surge entspricht dem, wenn wir hier eine App hinzufügen und die Anfrage senden. Siehst du, wir bekommen nur eine einzige Information , weil der Titel Apple enthält. So können wir diese Gtquery anpassen , um alle Produkte zu erhalten Außerdem fällt mir eine Sache auf. Wir speichern die Bilder unserer Produkte erfolgreich in unserem Serverordner, können aber nicht darauf zugreifen. Wir müssen diese statischen Dateien so einrichten, wie wir es für Kategorienbilder getan haben. In der Datei index dot js nach dieser Kategorie static fügen wir nach dieser Kategorie static app dot ug hinzu. Hier fügen wir das Präfix für den statischen Dateipfad hinzu. Wir leiten Uploads an Produkte weiter. Danach verwenden wir Express Dot Static Middleware, um die statischen Dateien vom Server aus zu teilen . In dieser Funktion müssen wir den Ordnernamen übergeben, den wir teilen möchten Lädt also Produkte hoch. Denken Sie daran, das ist das Präfix für die URL, und das ist der Ordnerpfad unserer statischen Dateien und fertig 128. Übung - Einzelproduktdaten abrufen: Wenn nun jemand im Frontend auf die Produktkarte klickt, sollten wir ihm alle Details zu diesem einzelnen Produkt zeigen . Hier ist die Übung für dich. Sie müssen eine neue API definieren um einzelne Produktdetails abzurufen. Unsere API sollte also so aussehen. Schrägstrich-API-Produkte, Schrägstrich-Produkt-ID. Diese ID, du musst das Produkt finden. Versuchen Sie außerdem, tatsächliche Verkäuferdaten wie Verkäufer-ID, Verkäufername und E-Mail-ID zu erhalten , nicht die einfache Verkäufer-ID. Versuchen Sie es zu lösen, und falls Sie vergessen haben, mit Populate zu arbeiten, können Sie sich die Lektion Sechs und Sieben zum Ausfüllen ansehen und dann versuchen, das Problem zu lösen Ich hoffe also, du löst diese Aufgabe oder versuchst, sie zu lösen. Machen Sie sich keine Sorgen, wenn Sie irgendwann einen Fehler bekommen oder nicht weiterkommen. Es ist der Teil des Lernens. Ich bin auch oft dort hängen geblieben , wo ich Node zum ersten Mal gelernt habe. Mach dir darüber keine Sorgen. Sehen wir uns jetzt die Lösung an. Also schreiben wir Router Dot Gt. Was übergeben wir in der URL? Wie können wir wissen, welche Produktdetails wir wollen? Richtig. Hier fügen wir die Spalten-ID als Stammparameter hinzu, und dies ist die eindeutige ID eines einzelnen Produkts. Auch hier fügen wir keine Middleware hinzu, da jeder Benutzer einzelne Produktdetails sehen kann Wir geben die Rückruffunktion mit Anfrage und Antwort direkt weiter mit Anfrage Zuallererst benötigen wir diese ID, sodass die Const-ID der Punkt-ID der Anforderungspunkt-VM entspricht Anhand dieser ID können wir dieses Produkt jetzt finden. C product entspricht also await product dot find nach ID. Hier übergeben wir die Produkt-ID. Außerdem machen wir diese Funktion asynchron. Danach können wir die Bedingung I, das Produkt ist nicht verfügbar, setzen I, das Produkt ist nicht verfügbar, dann die Antwort mit dem Statuscode 404 Punkt JsObject mit der Nachricht property, product, not found zurückgeben Statuscode 404 Punkt JsObject mit der Nachricht property, product, not found Wenn wir nun das Produkt aus der Datenbank abrufen, antworten wir einfach mit Punkt Json Sagen Sie die Änderungen und lassen Sie uns diese API testen. Kopieren Sie diese erste Produkt-ID, weil wir sie benötigen. Im Postman erstellen wir eine neue Anfrage mit dem Namen Get single product Gut, wählen Sie das URL-API-Produkt aus. Und hier fügen wir unsere Produkt-ID ein. Stellen Sie sicher, dass die Anfrage G ist und senden Sie die Anfrage. Sehen Sie, hier erhalten wir die vollständigen Einzelproduktdaten. Wenn wir hier eine zufällige ID übergeben und die Anfrage senden, erhalten wir die Daten nicht. Und wenn wir unser Terminal überprüfen, stellen wir fest, dass unsere Anwendung abgestürzt Das passiert, weil wir Fehler in unserer API nicht behandeln. Keine Sorge, das werden wir im nächsten Abschnitt tun. Derzeit müssen wir diese Anwendung mit Node Mod neu starten . Lassen Sie uns erneut die ursprüngliche ID übergeben und die Anfrage senden. Nett. Jetzt haben wir hier ein kleines Problem. Auf der Seite mit den einzelnen Produkten möchten wir die Informationen des Verkäufers wie Name und E-Mail-Adresse anzeigen . Aber hier erhalten wir die Verkäufer-ID, also müssen wir diese Daten aus der Sammlung des Benutzers eingeben Außerdem möchten wir nicht, dass diese Kategorie gefüllt wird. Andere Dinge sind okay. Zuallererst, nach der Fine-Methode, übergeben wir dot populate. Als ersten Parameter übergeben wir, welches Feld wir füllen möchten Richtig, es ist der Verkäufer, in dessen Daten wir den Unterstrich ID, Name, E-Mail eingeben möchten Unterstrich ID, Name, Jetzt möchten wir auch den Benutzer eintragen, der im Bereich der Bewertungen verfügbar sein wird Hier müssen wir die NASD-Daten auffüllen. Es ist auch sehr einfach. Wir übergeben eine andere Populate-Methode. Als ersten Parameter fügen wir review hinzu, das ist das Array für den Zugriff auf den Benutzer Wir müssen den Punkt user schreiben Jetzt beim zweiten Parameter wollen wir wieder die gleichen Füllungen. Unterstreichen Sie ID, Name und E-Mail. Gut. Speichern Sie die Änderungen und schauen Sie sich das an. Senden Sie die Anfrage. Siehst du, jetzt bekommen wir das Objekt des Verkäufers mit ID, Name und E-Mail-Adresse ausgefüllt. Derzeit haben wir keine Bewertungen. Deshalb können wir es nicht sehen. Außerdem haben wir vergessen, diese Kategorie zu löschen. Am Ende übergeben wir die Punktauswahlmethode und hier minus Kategorie und minus Unterstrich Unterstrich-ID Also die Änderungen und schauen Sie sich das an. Senden Sie diese Anfrage, C, wir entfernen die Eigenschaft Kategorie und unterstreichen den Unterstrich V. So einfach ist Node JS. Am Anfang hast du das Gefühl, dass es schwierig ist. Wenn Sie die Implementierung jedoch Schritt für Schritt durchführen, können Sie sie richtig beherrschen. Und deshalb erkläre ich dir den Code Zeile für Zeile. In der nächsten Lektion werden wir nun eine API zum Löschen des einzelnen Produkts erstellen . 129. Übung. - Löschen des Produkts: Lassen Sie uns nun eine API zum Löschen des einzelnen Produkts erstellen. Also hier schreiben wir Router Dot Delete. Hier bekommen wir wieder ID als Routenparameter. Jetzt brauchen wir hier Middleware oder nicht. Richtig, wir brauchen Middleware, weil nur angemeldete Benutzer das Produkt löschen können und wir auch Details über diesen Benutzer erhalten möchten Zuallererst übergeben wir die Middleware von Oath. Dann übergeben wir die API-Callback-Funktion mit Jetzt erhalten wir zunächst die Produkt-ID aus dem Routenparameter Kosten, Produkt-ID entspricht der Punkt-ID der Anfrage, Parameter, Punkt-ID. Jetzt müssen wir das Produkt anhand dieser ID finden. gegossene Produkt entspricht dem Warten auf Produktpunkt anhand der ID , indem wir die Produkt-ID übergeben. Für diese Abfrage benötigen wir nun nur noch die Verkäufer-ID. Fügen Sie die Auswahlmethode hinzu, und hier geben wir Verkäufer ausgefüllt weiter und machen diese Funktion auch oben verfügbar. Jetzt geben wir hier die Bedingung ein, ob das Produkt gefunden wurde oder nicht. Also kopieren wir einfach diese Bedingung aus der vorherigen API und fügen sie hier ein. Gut. Wenn wir nun ein Produkt gefunden haben, überprüfen wir Benutzer Administrator oder der Benutzer der Verkäufer dieses Produkts ist. Wir schreiben „Ich fordere einen Benutzer an“, die Punktregel entspricht „Admin“ oder „ Anfrage: Punkt-Benutzer“, Punkt-Unterstrich-ID“ entspricht „Produkt“, „Punkt Verkäufer Wenn eine dieser Bedingungen zutrifft, können wir dieses Produkt löschen Nun stellt sich die Frage, wie können wir dieses Produkt entfernen? In diesem Produktobjekt, das wir aus der Datenbank beziehen, übergibt Mongoose auch eine Methode, nämlich Dot Delete One nämlich Dot Delete Und das ist es. Dadurch wird das Produkt aus der Datenbank entfernt. Außerdem verwenden wir hier eine Methode zum Löschen , da wir das Produkt zuvor aus der Datenbank abgerufen haben. Wenn wir dieses Produkt direkt entfernen müssen, verwenden wir die Methode Find by ID und Delete. Außerdem müssen wir hier eine Wartezeit hinzufügen , da es sich um einen asynchronen Vorgang handelt Danach geben wir einfach den Antwortpunkt Json mit der Nachrichteneigenschaft, das Produkt wurde erfolgreich gelöscht zurück Antwortpunkt Json mit Nachrichteneigenschaft, das Produkt wurde erfolgreich gelöscht Derzeit kommentieren wir diese Löschlogik, um diese Implementierung zu überprüfen. Wir werden es nach einiger Zeit aktivieren. Wenn diese Bedingung nicht zutrifft, geben wir hier die Antwort mit dem Statuscode 403, 44 Biden Punkt Json mit der Eigenschaft Mesa, Excess Denied, zurück 44 Biden Punkt Json mit der Eigenschaft Mesa, Excess Denied, Nur der Administrator oder Verkäufer kann dieses Produkt löschen. Lassen Sie uns nun diese Implementierung ausprobieren und eine beliebige Produkt-ID aus unserer Produktliste kopieren. Ich kopiere diese letzte ID, jetzt in der Post Win, erstelle eine neue Anfrage namens Tilt, ein Produkt in dieser Methode, das gelöscht werden soll Hier schreiben wir URL, API-Produkte, und hier übergeben wir unsere Produkt-ID und stellen sicher, dass die Methode Löschen ist und sende die Anfrage. Oh, tut mir leid, wir müssen auch das JWT-Token im Header senden, zur Login-API gehen mit Ihren Benutzerdaten anmelden, wer der Verkäufer dieses Produkts ist Sehen Sie, hier erhalte ich den JWT-Schlüssel, kopiere ihn und in der Delete API gehen wir zu den Headern und fügen hier die Autorisierung Als Wert übergeben wir Fehler, Leerzeichen und fügen den JWT-Schlüssel Senden Sie jetzt die Anfrage. Siehst du, hier wird uns der Zugriff verweigert, also kommen wir nicht in diesen Zustand. Deshalb bekommen wir diesen Fehler. Das Problem liegt in diesem Zustand Lassen Sie uns einfach den Zustand der Kabine protokollieren Kopiere diese erste Bedingung und füge sie hier ein, Komma, kopiere die zweite Bedingung und füge sie Sagen Sie die Änderungen und senden Sie die Anfrage erneut. Nun zurück zum VS-Code, habe hier ein Terminal für die erste Bedingung geöffnet, wir erhalten false, was wahr ist, weil wir kein Administrator sind. Danach erhalten wir für eine zweite Bedingung ebenfalls false. Warum dieses Konto der Verkäufer dieses Produkts ist. Wählen Sie diese beiden Eigenschaften separat abrufen aus. Entfernen Sie diese erste Bedingung, und an der Stelle von Gleichheit fügen wir ein Komma hinzu Sehen wir uns die Änderungen an und lassen Sie uns erneut dieselbe Anfrage an den VS-Code zurücksenden Im Terminal sehen Sie, zuerst erhalten wir die Objekt-ID in einer Zeichenfolge und dann die neue Objekt-ID, die Mongoose-Objekt-ID die Mongoose-Objekt-ID Aus diesem Grund stimmen die Zeichenfolge und die Objekt-ID nicht überein. Also müssen wir entweder beide in Objekt-ID konvertieren oder wir können beide in eine Zeichenfolge konvertieren. Beides wird funktionieren. Also konvertieren wir beide in Zeichenketten. In JavaScript haben wir die Punkt-Zwei-String-Methode , um Daten in Zeichenketten umzuwandeln. Übergeben Sie diese Punkt-Zwei-Zeichenfolge für beide IDs und entfernen Sie diese Konsole. Speichern Sie die Änderungen und lassen Sie uns die Anfrage erneut senden. Siehst du, jetzt haben wir das Produkt erfolgreich gelöscht. Wenn Sie möchten, können Sie jetzt diese Methode zum Löschen einer Option aktivieren. Nachdem wir das Produkt aus der Datenbank gelöscht haben, ist es besser, auch die Bilder dieser Produkte vom Server zu löschen . Zum Löschen der Datei vom Server können wir das FS-Modul verwenden. An oberster Stelle steht Fs also für Require Fs Promises. Und wir brauchen auch das Pfadmodul. Const Path entspricht also dem Require Path-Modul. Jetzt unten, nachdem wir eine Methode gelöscht haben, fügen wir fs unlin Bei dieser Methode müssen wir nun den vollständigen Pfad der Datei übergeben , die wir entfernen möchten Aber im Bildarray haben wir nur den Dateinamen, aber wir brauchen hier den vollständigen Pfad. Dafür müssen wir das Path-Modul verwenden , ein weiteres integriertes Modul von Node Jazz. Lassen Sie mich Ihnen zeigen, dass Const full path gleich Path Dot Join ist Zuerst übergeben wir Disco und Discord ihren Namen , der der gesamte Verzeichnispfad unseres Projekts ist Als Nächstes schreiben wir unseren Ordner, in dem wir die Bilder speichern. Hier gehen wir einen Ordner oben, weil wir uns gerade im Routenordner befinden, laden Slash-Produkte hoch und fügen dann beim dritten Argument unseren Bildnamen Jetzt haben wir hier nicht nur ein einziges Bild. Wir haben Arrays von Bildern, also müssen wir dafür eine Schleife laufen lassen Vorher fügen wir Produktpunktbilder hinzu. also auf Bilder zuzugreifen, hier in der Select-Methode müssen wir hier in der Select-Methode Bilder übergeben. Gut. Jetzt sind Produktpunktbilder für jeden Punkt. Hier erhalten wir den Namen jedes Bildes Pfeilfunktion, und dabei werden wir diese beiden Zeilen verschieben. Nun, hier in fs dot unlink übergeben wir diesen vollständigen Pfad, übergeben wir diesen vollständigen Pfad, und das als Punkt unlink ist eine asynchrone Operation Also müssen wir eine Gewichtung festlegen, und dafür müssen wir diese Farbfunktion asynchron machen. Bevor Sie diese Seite aufrufen, sollten Sie überprüfen, ob wir ein Bildarray haben oder nicht. I Produktpunktbilder ist verfügbar und die Punktlänge der Produktpunktbilder ist größer als Null. Erst dann laufen wir diese Schleife ab. Verschiebe diesen Code hierher. Bei diesem Vorgang zum Aufheben der Verknüpfung kann ein Fehler auftreten. Bevor wir die Verknüpfung mit fs dot unlink aufheben, fügen wir einen Try-and-Cache-Blog hinzu Verschieben Sie diese Methode zum Aufheben der Verknüpfung in den TR-Blog, und im Cache-Blog erhalten wir diese Ausnahme Wir fragen einfach nach einem Punktfehler in der Metrik, Fehler, Löschen, Datei, Dollar-Klammern, vollständigem Pfad, Komma, Fehlerobjekt hinzufügen Sehen Sie sich die Änderungen an und werfen Sie einen Blick darauf. Lassen Sie uns diese Implementierung testen und die ID des letzten Produkts kopieren. Sehen Sie sich auch den Bildnamen an. Diese Bilder sollten gelöscht werden. Ersetzen Sie diese Produkt-ID durch diese ID und senden Sie diese Löschanfrage. Sehen Sie, hier wurde das Produkt erfolgreich gelöscht, und wenn wir unseren Produktordner, siehe in diesem Ordner, überprüfen siehe in diesem Ordner, erhalten wir diese Bilder nicht. So löschen wir das Produkt und seine Bilder. Fügen wir nun auch das Produkt hinzu, das wir gerade gelöscht haben. Also und erstelle eine neue Produkt-API und hier ändere ich diesen Titel in einen neuen Produktnamen. Wählen Sie hier Bilder aus. Und senden Sie einfach diese Anfrage. Hier erhalte ich ein gültiges Token, da das vorherige abgelaufen ist. Wir gehen zur Login-API, kopieren das Token und fügen dieses Token in die Header fügen dieses Token Lassen Sie uns nun diese Anfrage senden. Siehst du, hier bekommen wir neue Daten. Wunderbar. Wir sehen uns in der nächsten Lektion. 130. Produkt nach Titel suchen [OPTIONAL]: Jetzt haben wir in allen E-Commerce-Anwendungen die Suchfunktion, haben wir in allen E-Commerce-Anwendungen die Suchfunktion der wir unten in der Suchleiste Vorschläge anzeigen können. Also müssen wir dafür eine API definieren. Außerdem wird diese API aufgerufen, wenn jedes Zeichen in die Suchleiste eingegeben wird. Also äußerer Punkt, Katze, Vorschläge mit zwei Schrägstrichen am Endpunkt, asynchrone Callback-Funktion mit Anfrage Dabei erfahren wir zunächst, was der Benutzer sucht Die Kostensuche entspricht hier also der Anfrage Dot Query Dot Sarge. Wir müssen reguläre Ausdrücke verwenden, um die Zeichenfolge im Titel zu vergleichen und zu finden Const products entspricht also await product dot find passier condition Object, title to object Hier verwenden wir Dollar Regex, die neueste Methode, reguläre Ausdrücke in Mongo Dib zu schreiben reguläre Ausdrücke Hier übergeben wir unseren Suchtext und um Groß- und Kleinschreibung zu deaktivieren, übergeben wir hier Dollar-Optionen an die Zeichenfolge I. Hier vergleichen wir unsere Suchzeichenfolge mit unserem Titel Dadurch erhalten wir Produkte , die dieses Wort oder diese Zeichenfolge enthalten. Außerdem möchten wir in der Folge nicht alle Details wie Beschreibung und alles zeigen wie Beschreibung und Also können wir hier die Selec-Methode hinzufügen und erhalten nur die Unterstrich-ID und die Titeleigenschaft Außerdem können wir diese Daten im Frontend auf zehn beschränken Wir schlagen nur zehn Produkte am unteren Rand der Suchleiste Am Ende antworten wir einfach mit Punkt Json auf diese Produkte. Speichern Sie die Änderungen und lassen Sie uns diese API probieren. Öffnen Sie Postman und erstellen Sie eine neue Anfrage mit dem Namen Vorschläge abrufen URL zu API-Produkten, Schrägstrich-Vorschläge, Fragezeichen für die Übergabe des Abfrageparameters, Suche entspricht IP Stellen Sie sicher, dass wir die Methode Get auswählen und die Anfrage senden. Siehst du, hier bekommen wir keine Produkte. Mal sehen, was wir im Terminal bekommen. Sehen Sie, hier haben wir einige Probleme mit der Objekt-ID. In unserer Vorschlags-API haben wir jedoch keine Objekt-ID. Warum kommen wir also hierher, Objekt-ID-Fehler. Tatsächlich erreicht dieser API-Aufruf nicht die Vorschlags-API. Es bewegt sich innerhalb dieser API für ein einzelnes Produkt. Lass mich dir das erklären. Hier ist die erste API-URL für das einzelne Produkt. Wir haben API-Produkte mit einem Schrägstrich der Produkt-ID. Wir fügen weitere API-API-Produkte hinzu, Slash-Vorschläge. Jetzt wird Express verwirrt. Diese Vorschlagszeichenfolge ist Objekt-ID oder was auch immer. Aus diesem Grund läuft unsere API für ein einzelnes Produkt. Was ist hier die Lösung? Nichts, wir müssen nur unsere Vorschlags-API vor diese einzelne Produkt-API verschieben . diese Weise vergleicht Express unsere API mit der Vorschlagszeichenfolge, und wenn diese nicht übereinstimmt, wechselt Express nur dann zur API für ein einzelnes Produkt. Ändern Sie die Phase und stellen Sie sicher, dass der Server ordnungsgemäß läuft. Lassen Sie uns im Postman dieselbe Anfrage senden. Siehst du, jetzt bekommen wir Produktvorschläge. Ich habe diesen Fehler absichtlich erstellt, um Ihnen zu zeigen , was passieren kann, wenn Sie ein eigenes Projekt erstellen. Im nächsten Abschnitt werden wir nun lernen, wie man professionell mit Fehlern umgeht. C im nächsten Abschnitt. 131. Abschnitt 11 - Warum behandeln wir Fehler?: Derzeit führen wir unsere Anwendung in der idealen Welt aus. Alles funktioniert perfekt. Aber in der realen Welt kann alles schief gehen. Jeder Fehler kann auftreten. Zum Beispiel wurde eine Datei nicht gefunden oder unsere Verbindung mit dem Mongo Deb-Server nicht erfolgreich oder der Benutzer gibt die gültigen Informationen nicht weiter oder es kann etwas schief gehen In diesen Fällen müssen wir mit Fehlern umgehen, und hier sind einige Gründe für die Behandlung von Fehlern Zuallererst können wir bei der Behandlung von Fehlern eine freundliche Fehlermeldung senden und diesen Fehler auf der Webseite anzeigen , als ob der Server einige Probleme hat Bitte versuchen Sie es später erneut, so wie hier. Der zweite Grund für die Behandlung von Fehlern ist, wir sie protokollieren oder, in einfachen Worten , wir können die Fehler in einer separaten Datei speichern und dann diese Fehler untersuchen, welche Fehler sehr häufig auftreten, dass wir sie protokollieren oder, in einfachen Worten, wir können die Fehler in einer separaten Datei speichern und dann diese Fehler untersuchen, welche Fehler sehr häufig auftreten, und auf diese Weise können wir diese Fehler in unserer Anwendung beheben. Der Umgang mit Fehlern kann also auch unsere Anwendung verbessern. Lassen Sie mich Ihnen jetzt einen Fehler zeigen. Lassen Sie uns unsere Anwendung mit Nodemon Index Dot JS ausführen. Jetzt im Postman bekommen wir auch Vorschläge Nehmen wir nun an, der Mongoib-Server ist abgestürzt. Um das zu demonstrieren, können wir den Verbindungscode aus der JS-Datei mit dem Indexpunkt auskommentieren den Verbindungscode aus der JS-Datei mit dem Indexpunkt Speichern Sie die Änderungen und gehen wir zurück zum Postboten. Senden Sie dieselbe Anfrage erneut. Sehen Sie hier, wir werden geladen, geladen und geladen. Und nach 10 Sekunden erhalten wir eine Fehlermeldung. Und wenn wir unser Anwendungsterminal überprüfen, sehen wir hier, dass wir nach 10.000 Millisekunden den Punkt Find Buffering Time von Mongoose Error Operation Products out bekommen Punkt Find Buffering Time von Mongoose Error Operation Products nach 10.000 Millisekunden den Punkt Find Buffering Time von Mongoose Error Operation Products out Und danach könnte unsere Anwendung abstürzen. Angenommen, in der realen Welt unser Mongo Deb-Server sogar für zwei bis drei Minuten ausgeschaltet, dann kann unsere App in der Produktion abstürzen Nach einiger Zeit wird der Mongo Di B-Server wieder live geschaltet. Selbst wenn es live ist, stürzt unsere App weiterhin ab und wir können keine Daten an den Client senden. Es ist wichtig, diese Art von Fehlern zu behandeln Außerdem bedeutet die Behandlung von Fehlern nicht, dass Fehler nicht passieren. Behandlung von Fehlern bedeutet, dass unser Server nicht abstürzt Derzeit läuft diese Anwendung, aber vor dieser Version von Node Jaz wurden Knotenanwendungen abgestürzt. In diesem Abschnitt werden wir sehen, wie man mit Fehlern umgeht und sie protokolliert 132. Umgang mit abgelehnten Versprechen: Lassen Sie uns zunächst mit Fehlern umgehen, die auftreten, wenn wir es mit API-Versprechen zu tun haben. In dieser Vorschlags-API nennen wir hier diese Produktsammlung. Und wie wir wissen, handelt es sich um einen asynchronen Vorgang Deshalb verwenden wir await für die Antwort Wir haben hier also ein Versprechen und dieses Versprechen wird abgelehnt. Aber hier haben wir uns nicht mit Fehlern im Trockenen und Auffangen befasst, was wir in Abschnitt sechs erfahren. Denken Sie daran, dass wir hier bei Try and Catch Block, hier im Cache-Blog, hier im Cache-Blog, ein Fehlerobjekt erhalten. Nun, was wollen wir in diesem Cache-Blog machen? In der realen Welt protokollieren wir im Cache-Blog zuerst den Fehler oder die Ausnahme irgendwo in der Datei oder in der Datenbank und geben danach eine Antwort mit dem entsprechenden Statuscode und der Fehlermeldung zurück . Derzeit protokollieren wir den Fehler nur in der Konsole. In Zukunft werden wir diesen Fehler oder diese Ausnahme in einer separaten Datei speichern . Nachdem wir den Fehler protokolliert haben, geben wir nun die Antwort mit dem Statuscode 500 zurück, was ein Serverfehler ist. Danach geben wir auch das JSON-Objekt mit der Nachrichteneigenschaft Internal Server Error zurück. Oder Sie können schreiben, dass auf dem Server etwas schief gelaufen ist. Wir können jede beliebige Fehlermeldung schreiben. Gut. Jetzt können wir unseren gesamten Code in diesen trockenen Blog verschieben. Mal sehen, was passiert, sehen wir uns die Änderungen an und hier wird unsere Anwendung neu gestartet. Unsere Mongoib-Datenbank ist jedoch immer noch nicht verbunden. Lassen Sie uns nun die Anfrage nach Vorschlägen senden . Lass es laden. Nach 10 Sekunden, seht ihr, hier bekommen wir die Antwort mit dem Statuscode 500 und mit unserer Fehlermeldung. Schauen wir uns auch an, was wir in der Konsole bekommen. Siehst du, hier bekommen wir diesen Mungo-Fehler, genau wie zuvor, und auch unsere Anwendung wird durch diesen Fehler nicht abgestürzt Trotzdem läuft unsere Anwendung, wir haben unseren Fehler mit dem abgelehnten Versprechen erfolgreich behoben Hier konsultieren oder protokollieren wir diesen Fehler nicht, dann wissen wir in unserem Terminal nicht einmal, dass wir einen Fehler bekommen haben. Wenn wir nun beispielsweise versuchen, auf unsere anderen APIs zuzugreifen , senden wir diese Anfrage für alle Produkte. Nach 10 Sekunden erhalten wir hier einen Fehler und im Terminal stürzt unsere Anwendung nicht So können wir sehen, wie wir mit Fehlern bei der Ablehnung von Zusagen umgehen können , indem wir den Block try and catch verwenden Auf diese Weise stürzt unsere Anwendung nicht ab, und deshalb ist die Behandlung von Fehlern wichtig Für alle Routen müssen wir unseren gesamten Code mit einem Try- und Cache-Block umschließen unseren gesamten Code mit einem Try- und Cache-Block Aber hier in unserer Anwendung haben wir fast zehn bis 15 API-Routen. Wir müssen unseren gesamten API-Routencode in den Try-and-Catch-Blog packen , der sich wiederholt. Wenn wir eines Tages die Fehlermeldung oder die Protokollierungslogik ändern möchten, müssen wir sie außerdem die Fehlermeldung oder die Protokollierungslogik ändern möchten, in allen unseren Routen aktualisieren. Jetzt fragst du dich vielleicht, gibt es dafür eine Abkürzung? Ja, es gibt eine Abkürzung und das werden wir in der nächsten Lektion sehen. 133. Fehler-Middleware erstellen: In der vorherigen Lektion haben wir gesehen, dass wir diesen Protokollierungsfehler wiederholen und die Fehlerantwort auf jeder API-Route zurückgeben die Fehlerantwort auf jeder API-Route In dieser Lektion werden wir eine gemeinsame Middleware erstellen, in der wir Code für diesen Protokollierungsfehler schreiben und die Fehlerantwort zurückgeben Keine Sorge, es ist wirklich einfach. Zuallererst fügen wir in unserer Indexpunkt-GS-Datei unten nach allen Routen den App-Punkt G hinzu. Hier übergeben wir die Funktion, und wie wir wissen, erhalten wir hier drei Parameter Request Response und Next Function. In dieser Funktion werden wir nun die gesamte Logik für die Fehlerbehandlung schreiben. Zuallererst fügen wir hier das Console Dot Log hinzu. Fehler, Middleware läuft um sicherzustellen, dass das funktioniert Nun zurück zu unserer Route, schneiden Sie diesen Code innerhalb des Cache-Blocks und fügen Sie ihn einfach in unsere neue Middleware-Funktion Wenn wir nun die Fehlermeldung oder eine Logik im Zusammenhang mit der Fehlerbehandlung ändern möchten , müssen wir die Änderungen hier an einer einzigen Stelle vornehmen . Jetzt ist hier eine Sache. Wie können wir dieses Fehlerobjekt in dieser Funktion abrufen? Wir erhalten dieses Fehlerobjekt als ersten Parameter in dieser Callback-Funktion Stellen Sie sicher, dass wir das Fehlerobjekt als ersten Parameter erhalten. Nun wollen wir sehen, wie wir diese Middleware nennen können? Also Vektor raus und hier im Cache-Block für den Aufruf der nächsten Middleware, was wir tun müssen Richtig, wir können die nächste Funktion verwenden. Hier erhalten wir die nächste Funktion als Parameter und rufen einfach die nächste Funktion im Cacheblock auf, und wir übergeben das Fehlerobjekt in dieser nächsten Funktion. Wenn Sie etwas verwirrt sind, lassen Sie mich Ihnen den Codefluss dieser Fehler-Middleware zeigen dieser Fehler-Middleware Wie wir in unserem Backend wissen, führen wir nur eine einzige Datei aus, nämlich diesen Indexpunkt js Also Node, fang an, diesen Code auszuführen. Zuerst werden diese Middleware und der statische Code ausgeführt. Danach haben wir alle Routen und fügen danach Fehler-Middleware hinzu Wenn wir nun die nächste Funktion auf einer dieser Routen ausführen, führt diese nächste Funktion diese Fehler-Middleware In allen Routen rufen wir die Funktion next auf, und als erstes Argument übergeben wir das Fehlerobjekt aus dem Cache-Block Wenn in unserem Triplog etwas schief geht, wird diese Case-Methode ausgeführt und diese Cache-Methode ruft diese nächste Funktion auf, wodurch diese Fehler-Middleware-Funktion ausgeführt wird So einfach ist das. Sehen Sie sich die Änderungen an und lassen Sie uns überprüfen, ob dies funktioniert oder nicht. Derzeit funktioniert unsere Anwendung, gut, öffnen Sie den Postboten und senden Sie die Vorschläge an. Und nach 10 Sekunden erhalten wir eine Fehlermeldung und in unserem Terminal sehen wir, dass Ramiddalware läuft, was bedeutet, dass unsere Und danach bekommen wir einen Mongoose-Fehler, großartig. Wenn wir also etwas an der Fehlerbehandlung von Routen ändern wollen , müssen wir Änderungen nur an einer einzigen 134. Versuchsblöcke entfernen: Jetzt ist unsere aktuelle Implementierung gut. Wenn Sie damit einverstanden sind, können Sie diesen Ansatz verwenden. Aber viele Entwickler mögen diesen Ansatz nicht. Sie können sehen, dass wir hier einen Try- und Cache-Block haben, und wir müssen diesen Test-Cache-Block in jeder Route-Handler - oder Callback-Funktion wiederholen , was ein bisschen chaotisch aussieht In der idealen Welt sollten wir nur diese Logik schreiben. Also, wie können wir das machen? Es ist wirklich einfach. Ich überprüfe gerade dieses Express Fi-Update. In dieser Express Five-Version behandelt Express automatisch Fehler bei der Ablehnung von Zusagen oder diese Fehler, die während des asynchronen Vorgangs auftreten Express ruft automatisch diese nächste Middleware mit einem Fehlerobjekt auf, wodurch unsere globale Fehler-Middleware ausgeführt wird Lass mich dir das zeigen. Also jetzt brauchen wir diesen Blog nicht mehr, der trocken und zwischengespeichert ist. Wir können ihn entfernen. Also hier sind wir wieder bei unserer ursprünglichen Route-Syntax. Speichern Sie diese Datei und lassen Sie uns das überprüfen. Öffnen Sie Postman und senden Sie dieselbe Cougion-Anfrage. Nach 10 Sekunden erhalten wir diesen Fehler. Und wenn wir unser VS-Code-Terminal überprüfen, sehen Sie, hier erhalten wir zuerst die Fehlermeldung, dass Middleware läuft, und dann erhalten wir unseren Fehler, was bedeutet, dass unsere globale Fehler-Middleware Das ist ziemlich cool, oder? In der älteren Version, wie Express Four, funktioniert diese automatische Fehlerbehandlung nicht. Dabei müssen wir jede Routenlogik in einen Dry- und einen Cache-Block packen , aber das müssen wir jetzt nicht mehr tun. Express macht das automatisch, wir müssen globale Fehler-Middleware in der Indexpunkt-JS-Datei definieren . So einfach ist das. 135. Fehler in Datei protokollieren: In dieser Lektion werden wir also unsere Fehlermeldungen in einer separaten Protokolldatei wie dieser protokollieren. Es ist wirklich interessant. Lass uns das machen. Derzeit protokollieren wir also nur die Fehlermeldung in der Konsole. Jetzt ist es an der Zeit , diese Fehlermeldungen in einer separaten Datei zu speichern . So können wir in Zukunft die Fehler sehen, die häufig auftreten, darauf stoßen und unsere Anwendung verbessern. Sie zum Protokollieren der Fehler in einer Datei also Verwenden Sie zum Protokollieren der Fehler in einer Datei also ein anderes NPM-Paket, nämlich Winst Dies ist eine der beliebtesten Bibliotheken zum Protokollieren von Fehlern, und sie macht es auch sehr einfach Öffnen Sie also das Terminal und schreiben Sie NPM, installieren Sie WinsternF mit genau derselben Version, wir schreiben mit Direct 3.17 0.0 Jetzt ist die Konfiguration von Winston wirklich einfach . Zunächst importieren wir Winston, const, Winston entspricht require und wir übergeben unseren Nun, standardmäßig dieser Winston , gib uns einen Logger. Dieser Logger ist ausreichend für kleine und mittlere Anwendungen So können wir diesen Logger für große und komplexe Arten von Anwendungen nach unseren Wünschen anpassen . Jetzt hat dieser Winston oder Logger Transport. Dieser Transport ist wie ein Lieferfahrzeug für Ihre Baumstämme. Es entscheidet, wohin das Protokoll gehen soll. Ein Transport nimmt die von Winston erstellten Logger-Nachrichten auf und sendet sie an ein bestimmtes Ziel Jetzt könnte das Ziel die Konsole sein , die das Protokoll an das Terminal oder die Befehlszeile ausgibt Als nächstes haben wir eine Datei zum Speichern der Protokolle in einer Datei auf unserem System, SDTP zum Senden des Protokolls an eine API und als nächstes haben wir eine Datenbank zum Speichern der Protokolle in einer Datenbank wie Mongo DB Endlich haben wir Cloud-Dienste zum Senden von Protokollen an Dienste wie AWS, Datadog usw. Dies sind alles Transporte, die von Winston bereitgestellt werden. Lass mich dir einige davon zeigen. Dieses Winston-Paket verwendet standardmäßig den Consult-Transport, um die Protokolle auf dem Terminal zu drucken, aber hier wollen wir die Protokolle auch in einer separaten Datei speichern, und dafür müssen wir sie konfigurieren Also hier schreiben wir Winston Dot Create Logger. In dieser Funktion müssen wir nun das Konfigurationsobjekt übergeben, oder wir können sagen, was wir anpassen möchten Jetzt ist die erste Konfiguration Level. Diese Ebeneneigenschaft definiert , welche Arten von Nachrichten wir speichern oder protokollieren möchten. Beispielsweise möchten wir nur Fehler speichern, oder wir möchten Warnungen und Fehler protokollieren, beides, oder wir möchten alle Arten von Nachrichten protokollieren. In Minston haben wir also viele Protokollebenen. erste ist der Fehler , der höchste Log-Level für schwerwiegende Probleme Beispiel: Fehler bei der Datenbankverbindung. Als nächstes haben wir Krieg um Warnungen, Informationen für Informationsmeldungen wie Server, die auf einem Port laufen oder ein verbundenes GTB usw. Als Nächstes haben wir die SDDP-Verben debug, Ci. Dies ist die maximale bis minimale Anzahl von Protokollen. Fehler ist die höchste Ebene und CLI ist die niedrigste Protokollebene. Wenn wir nun im Label Informationen übergeben, erhalten wir Logmeldungen von Informationen der oberen Ebene, was eine Warnung ist, und wir erhalten auch ein Fehlerprotokoll. Wenn wir im Label albern weitergeben, dann bekommen wir alle Meldungen der oberen Ebenen besseren Praxis halber geben wir hier Informationen weiter, weil wir keine dummen Nachrichten in unserer Protokolldatei speichern wollen dummen Nachrichten in unserer Protokolldatei Jetzt nach dem Label haben wir Transporte, und hier müssen wir alle Transporte übergeben , die wir zum Array hinzufügen wollen In einfachen Worten, wohin wir unsere Logs schicken wollen. Wir wollen es in der Konsole anzeigen oder wir wollen es in einer beliebigen Datei speichern. Zuallererst möchten wir für Informationen, Warnungen und Fehler Protokolle in der Konsole anzeigen. Also fügen wir hier neue Winstn-Punkttransporte hinzu. Stellen Sie sicher, dass es sich um Transporte handelt, nicht um Transport und Dot Console Lassen Sie uns das vorerst nur trösten. In einer Minute werden wir diese Logs in einer separaten Datei speichern. Um diesen Logger nun zu verwenden, speichern wir ihn in einer Variablen namens Logger. Und jetzt können wir diesen Logger in unserer Anwendung verwenden . Aber hier ist eine Sache. Wie kann dieser Logger wissen , welche Nachrichtenebene wir senden? Handelt es sich um eine Information, eine Warnung oder einen Fehler? Welcher? Nehmen wir an, wir haben hier unten diese einfache Meldung, dass der Dot Log-Server auf der Konsole läuft. Das ist eine Information. Anstatt das Punktprotokoll für die Konsole zu verwenden , können wir den Logger verwenden , den wir gerade erstellt haben, und dieser Logger verfügt über alle Methoden, die den Stufen entsprechen. Wenn wir also eine Nachricht als Information senden wollen, dann verwenden wir hier Logger Dot Info. Wenn wir eine Warnung haben, verwenden wir Logger Dot One. Jetzt wollen wir die Logger-Punkt-Informationen und mal sehen, ob wir dieses Protokoll in der Konsole bekommen oder nicht. Mal sehen , wo sich das ändert. Und wenn wir in unserem Terminal nachschauen, bringen wir diese Objektebene auf Info- und Nachrichtenserver, der auf Port 3.000 lauscht. Großartig. Nun, das ist kein gutes Format für das Protokoll. In der realen Welt brauchen wir nicht nur Etikett und Botschaft. Wir benötigen viel mehr Informationen über das Protokoll wie Zeitstempel usw. In der Konfiguration haben wir also eine weitere Eigenschaft namens format Hier definieren wir, wie Protokollnachrichten angezeigt werden. Hier schreiben wir Winston Dot Format, Dot Combine. Und damit können wir ein gewisses Winston-Format übergeben. Beispiel fügen wir das Winston-Punktformat, Punkt T-Stamm und danach das Winston-Punktformat Dot JSON Mach dir keine Sorgen. Wir müssen Winston nur einmal einrichten Danach verwenden wir diesen Logger einfach zum Drucken und Versenden von Protokollen Teile die Änderungen und wirf einen Blick darauf. Siehst du, jetzt bekommen wir auch einen Zeitstempel. In unserer Fehler-Middleware, hier, sehen Sie, verwenden wir das Konsolenpunktprotokoll für dieses Also können wir hier jetzt Logger Dot Message verwenden. Wir müssen die Fehlermeldung übergeben, die eine Fehlerpunktnachricht ist, und wir senden auch das gesamte Fehlerobjekt. Mal sehen, was wir bekommen. Speichern Sie die Änderungen und lassen Sie uns das bei Postman probieren. Und wir schicken hier eine Vorschlagsanfrage. Jetzt, nach zehn Sekunden, zurück zum Vas-Code, Terminal öffnen. Sehen Sie, hier kommen wir von Stufe zu Fehlermeldung zur Fehlermeldung, und in der Eigenschaft Stack erhalten wir das gesamte Fehlerobjekt, das wir in der Logger-Punkt-Fehlermethode übergeben, und am Ende erhalten wir den Zeitstamm. Lassen Sie uns dieses Protokoll nun etwas weiter ausbauen. Hier erhalten wir nur die Protokollnachricht und den Protokollstapel, aber hier erfahren wir nicht, welche Route diesen Fehler verursacht hat oder welche Methode diesen Fehler verursacht hat. Wir wollen das in unser Protokoll aufnehmen. Das wird uns spezifische Informationen geben. Es ist wirklich einfach. Im Logger-Punktfehler können wir also an der Stelle dieses zweiten Arguments an der Stelle dieses zweiten Arguments ein Objekt übergeben. In diesem Objekt können wir definieren , welche anderen Eigenschaften wir anzeigen möchten. Also fügen wir zuerst einen Stapel zum Fehlerpunktstapel hinzu. Als Nächstes wollen wir die API-Methode, also Methode, um die Punktmethode anzufordern. Als Nächstes möchten wir den Pfad zur Anforderung der ursprünglichen Punkt-URL. Stellen Sie sicher, dass Sie hier den richtigen Eigenschaftsnamen eingeben. Wir können diese Immobilien auch bestellen. Nehmen wir an, wir wollen den Hirsch am Ende zeigen, und zuerst wollen wir die Methode und dann den Pfad. In diesem Objekt können wir also auch die Reihenfolge der Eigenschaften festlegen. Aber dafür müssen wir in unserem Format dieses JSN-Format hinzufügen Andernfalls wird es nicht funktionieren. Speichern Sie die Einträge und schauen Sie sich das an. Senden Sie die Anfrage aus den Vorschlägen nach 10 Sekunden erneut den Vorschlägen nach 10 Sekunden an den VS-Code im Terminal zurück. Sehen Sie, hier erhalten wir eine Fehlermeldungsmethode um den Pfad zu unserer API zu ermitteln, die diesen Fehler verursacht hat, vollständigen Stapel dieses Fehlers und den Zeitstempel dieses Fehlers Wunderbar. Wir sind also mit der Formatierung unseres Logs fertig. Lassen Sie uns nun das Protokoll in einer separaten Datei speichern, nicht nur in der Konsole. Also fügen wir hier im Transport eine weitere neue Winston Dot Transports Dot-Datei Hier übergeben wir das Objekt in property, file name, logs, smlogs dot log Stellen Sie sicher, dass wir Ihre Dateierweiterung dot log verwenden, damit wir besser verstehen können, was in der Datei enthalten ist Sagen Sie jetzt die Änderungen und schauen Sie sich das an. Im Terminal erhalten wir diese Protokollinformationen, und wenn wir unsere Anwendung überprüfen, wird unsere Protokolldatei unter logs slamlogs dot log erstellt Und wenn wir diese Datei öffnen, sehen Sie, wir bekommen Informationen, die in die Datei aufgenommen werden Wenn wir erneut senden, eine Anfrage vom Postboten erhalten und nach 10 Sekunden erhalten wir hier einen Fehler. Wenn wir zu unserem VSCode zurückkehren, erhalten wir einen neuen Log-Level auf Jetzt möchten einige Entwickler nur Fehler in der Datei protokollieren, keine Informationen und Warnungen Ich denke, das ist viel besser. Das können wir auch tun. Zurück zu Winston. Hier nach dem Dateinamen können wir auch die Fehlerstufe angeben Das bedeutet, dass nur Fehler in dieser Datei gespeichert und wir den Dateinamen auch in errors dot log ändern können. Wenn wir also bei einem dieser Transporte die Protokollebene nicht angeben, verwendet dieser Transport diese globale Protokollebene. Und wenn wir die Protokollebene in den Transporten angeben, wird diese globale Protokollebene überschrieben. Nehmen wir an, wir fügen für den Konsolentransport die Objektebene zum Debuggen Jetzt zeigen wir für alle Ebenen , bei denen es um das Debuggen geht, das Protokoll in der Konsole an und nur Fehler werden in der Punktprotokolldatei für Fehler gespeichert So speichern wir Logs in einer separaten Datei, und dann können wir unsere Anwendung entsprechend verbessern unsere Anwendung entsprechend Zusammenfassend lässt sich sagen, dass Console Dot Log nicht schlecht ist. Aber mit Winston können wir unsere Protokolle in einer separaten Datei speichern , was unsere Anwendung professioneller macht unsere Anwendung professioneller 136. Protokollierung von Fehlern in mongoDB: In dieser Lektion werden wir unsere Protokolle nun wie folgt in unserer Mongo-DB-Datenbank speichern unsere Protokolle nun wie folgt in unserer Mongo-DB-Datenbank Es ist wirklich einfach, lass uns das machen. die Protokolle in Mongo DB zu speichern, benötigen wir ein weiteres Winston-Paket, öffnen das Terminal und schreiben hier NPM install Winston Mongo DB der Rate 6.0 Minimiere dieses Terminal, großartig. Um dieses Paket ganz oben hinzuzufügen, benötigen wir Winston des Mongo DB In der Winston-Konfiguration müssen wir jetzt einen weiteren Transport für Mongo DB hinzufügen Nach diesem Dateitransport fügen wir also neue Winston-Punkttransporte Dot MongoDB Und bei diesem Transport müssen wir einige Optionen festlegen Die erste ist DB. Hier müssen wir die Datenbank-URL hinzufügen. Wir kopieren einfach diese Mongo-DB-Verbindungs-URL und fügen sie hier Außerdem können wir die Eigenschaft Log Level für Level an error übergeben , und das war's Sehen wir uns die Änderungen an und lassen Sie uns einfach diese Implementierung überprüfen. Lassen Sie uns unseren Server laufen lassen, falls er nicht läuft , und dieselbe Vorschlagsanfrage senden. Nach 10 Sekunden zurück zum Vas-Code erhalten wir hier den Fehler in der Konsole und wenn wir unsere Datenbank überprüfen, erhalten wir hier eine neue Protokollsammlung, und darin erhalten wir unseren neuesten Fehler. Hier erhalten wir den Zeitstempel, die Protokollebene , also den Fehler, die Fehlermeldung und zuletzt die Metadaten Dies ist dasselbe Objekt , das wir beim zweiten Parameter des Logger-Punktfehlers zweiten Parameter des Logger-Punktfehlers Sehen Sie, hier haben wir Methode, Pfad und den vollständigen Stapel des Fehlers. So einfach lassen sich Fehler in der Datenbank protokollieren. Wenn Sie Protokolle in der Datenbank speichern möchten, können Sie bei diesem Transport bleiben. Und wenn Sie Protokolle in einer separaten Datei speichern möchten, können wir bei diesem Dateitransport bleiben. Ich zeige Ihnen beide Möglichkeiten, Sie können jeden von ihnen nach Ihrer Wahl verwenden . Es hängt wirklich von dir ab. 137. Nicht erfasste Ausnahmen: Bisher haben wir in diesem Projekt also Fehler behandelt, die im Route-Handler auftreten, und der Route-Handler leitet Fehler oder Ausnahmen an die globale Fehler-Middleware oder Ausnahmen an die globale Fehler-Middleware Was ist nun, wenn wir in der restlichen Node-Anwendung einen Fehler bekommen in der restlichen Node-Anwendung einen Fehler Wir haben uns nicht darum gekümmert, oder? Um dies zu demonstrieren, entferne ich den Kommentar aus der Mongo-DB-Verbindung und gebe von hier aus einfach einen neuen Fehler aus. Also wirf einen neuen Fehler, und hier übergeben wir die Fehlermeldung, etwas schlägt in der Knotenanwendung fehl Also die Änderungen und in unserem Terminal stoppen wir unsere Anwendung, und wir führen unsere Anwendung mit Node Index Dot JS aus. Sehen Sie, hier erhalten wir einen Fehler, etwas schlägt in der Node-Anwendung und auch unsere Anwendung ist abgestürzt Dies wird als nicht abgefangene Ausnahme bezeichnet. Eine nicht abgefangene Ausnahme ist wie ein Überraschungsgast auf einer Party Sie sind nicht darauf vorbereitet und es verursacht Chaos, weil es keinen Plan gibt, damit umzugehen In einfachen Worten: Immer wenn eine Node-Anwendung ein Problem oder eine Ausnahme stößt , von der sie nicht weiß, wie sie umgehen soll, ruft sie eine unverschlüsselte Ausnahme auf Dies sind Fehler in unserem Code, die nicht durch ein richtiges Try & Catch behoben oder nicht richtig behandelt werden Infolgedessen weiß Node einfach nicht, was zu tun ist, und unsere App stürzt ab Wenn unsere App abstürzt, erhält unser Frontend die Daten nicht von unserem Unsere API wird nicht funktionieren. Daher ist es wichtig, diese Uncode-Ausnahmen zu behandeln. Nun stellt sich die Frage, wie können wir mit Uncode-Ausnahmen in unserer Node-Anwendung umgehen Weil diese Ausnahmen oder Fehler überall auftreten können. Wie können wir damit umgehen? Dafür müssen wir also einen Listener für unsere Knotenanwendung hinzufügen . Lass es mich dir zeigen Also hier, nach dem Winston, schreiben wir Process Dot On Dies wird uns helfen, einen Listener für ein bestimmtes Ereignis hinzuzufügen. Nun, bei welchem Ereignis wollen wir zuhören. Schreiben Sie, es ist eine unverschlüsselte Ausnahme. Stellen Sie sicher, dass Sie denselben Eventnamen schreiben. Andernfalls wird es nicht funktionieren. Was wollen wir nun tun, wenn in unserer Anwendung eine unverschlüsselte Ausnahme auftritt? Dass wir eine Callback-Funktion hinzufügen und sie einen Fehler oder eine Ausnahme hat In der Callback-Funktion konsultieren wir vorerst einfach ein Protokoll dieses Fehlerobjekts Dieser Prozess ist wie eine Person, die zuschaut. Es behält unsere Anwendung im Auge, und wenn in unserer Anwendung eine Uncod-Ausnahme auftritt, Process Dot On diese Callback-Funktion aus Statt der Verwendung von Console Dot Log können wir also Logger Dot Error verwenden Und dabei müssen wir zuerst die Zeichenfolge „Uncaught Exception“ übergeben und dann den gesamten Fehler-Stag übergeben Lassen Sie uns überprüfen, ob das funktioniert oder nicht. Speichern Sie die Änderungen und lassen Sie uns im Terminal das Terminal mit dem CLS-Befehl Anschließend führen wir unsere Anwendung mit dem Node Index Dot JS Siehst du, hier bekommen wir unseren Fehler in der Konsole und unsere App wird nicht von alleine gegrast Aber wie wir sehen können, erhalten wir auch nicht die Information, dass der Server auf dem Port 3.000 läuft, was bedeutet, dass der Server nicht läuft Unsere Anwendung hängt also in der Mitte. Der Server läuft nicht und die Anwendung läuft nicht. Unsere Anwendung befindet sich also nicht im stabilen Zustand. Was wir jetzt tun wollen, muss also diesen instabilen Zustand verlassen. Also schreiben wir nach dem Logger-Punktfehler einfach Process Dot Exit und hier übergeben wir einen als Exit-Code. Eins bedeutet Fehler. Außerdem haben wir den Exit-Code Null, was bedeutet, dass alles in Ordnung ist, aber wir wollen trotzdem beenden. Und wenn wir den Exit-Code eins übergeben, was bedeutet, dass ein Fehler auftritt, und deshalb beenden wir das Programm. Also die Änderungen, und lassen Sie uns unsere Anwendung noch einmal ausführen. Node, Indexpunkt Js und C, jetzt beenden wir erfolgreich unsere Anwendung. Wunderschön. Nun, Sie könnten sich diese Frage stellen, wenn wir nach der Behandlung der Ausnahme immer noch unsere Anwendung herunterfahren. Was ist dann der Sinn, die nicht abgefangene Ausnahme zu behandeln Behandlung einer nicht abgefangenen Ausnahme geht es also nicht darum, ein Herunterfahren zu verhindern Es geht darum, sicherzustellen, dass die Erfassung auf geordnete, sichere und informative Wenn eine nicht abgefangene Ausnahme auftritt, ist der Status unserer App unvorhersehbar ist der Status unserer App Nach einem nicht akzeptierten Absturz funktionieren Teile unserer App möglicherweise nicht wie gewünscht Zum Beispiel haben wir unterbrochene Datenbankverbindungen, beschädigten Speicher, unvollständige Anfragen usw. Ein Neustart der App garantiert, dass sie neu gestartet wird, ohne dass Probleme aufgrund des Fehlers übrig bleiben Auch in der Produktion überwachen Tools wie PM Two, Docker oder Kubernets Wenn unsere App heruntergefahren wird, diese Tools unsere App automatisch neu Die Behandlung des Fehlers stellt sicher, dass die App mithilfe von Process Dot Exit V eindeutig wird. Außerdem wird es für das Überwachungstool einfacher , unsere Anwendung ohne ausstehende Probleme neu zu starten . Eine Sache, auf die ich hier stoße ist, dass beim Beenden von Process Dot unsere Protokolle nicht in der Datei oder in der Datenbank gespeichert werden, aber Sie können das Protokoll in der Konsole sehen . Was ist hier falsch? Wenn wir also Dot Exit verarbeiten, wird unsere Node-Anwendung sofort beendet. Sie wartet nicht darauf, dass asynchrone Aufgaben wie die Protokollierung in einer Datei oder Datenbank abgeschlossen In einfachen Worten, process dot exit one wartet nicht darauf, dass diese Operationen abgeschlossen sind, sodass der Protokollteil teilweise oder vollständig übersprungen werden kann Wie können wir dieses Problem nun lösen? Es ist wirklich einfach. Sie müssen den Prozess beenden, nachdem unser Logger seinen Protokollierungsprozess abgeschlossen hat. Nach diesem Logger-Punkt-Fehler schreiben wir Logger Dot auf, und Sie haben es richtig erraten, das ist auch der Listener von Hier übergeben wir unseren Eventnamen , der finish ist, und beim zweiten Argument übergeben wir die Callback-Funktion, und damit können wir diesen Prozess einfach auf Punkt 1 verschieben Zur besseren Übung protokollieren wir auch den Punkt. Speichern Sie die Änderungen und lassen Sie uns sehen, ob es funktioniert oder nicht. Führen Sie diese Anwendung aus, und wenn wir unsere Logger-Datei überprüfen, sehen Sie, hier bekommen wir ein neues Protokoll, also funktioniert es. 138. Nicht behandelte Versprechen Ablehnungen: Nehmen wir an, wir haben in unserer Node-Anwendung ein Versprechen, das abgelehnt wird, und wir haben vergessen, diesen Fehler mit der Try-and-Cache-Blog - oder Cache-Methode zu behandeln Try-and-Cache-Blog - oder Cache-Methode Dieses abgelehnte Versprechen muss bearbeitet werden. Um das zu demonstrieren, entfernen wir es irrtümlich und erstellen hier ein neues Versprechen. Nehmen wir an, ein abgelehntes Kostenversprechen entspricht einem neuen Versprechen. Wie wir wissen, müssen wir hier die Callback-Funktion mit zwei Parametern übergeben : Dissolve und Reject Um nun das Versprechen abzulehnen, rufen wir hier einfach die Reject-Methode auf, und hier erstellen wir einen neuen Fehler und übergeben die Fehlermeldung Was schreiben wir bei einem Fehler? Sagen wir, Fehler in der Zusage. Entschuldigung für diese Fehlermeldung. Lassen Sie uns dieses Versprechen nun in Anspruch nehmen. Lehnen Sie dann einen Versprechungspunkt ab und in dieser Fehlerfunktion und wir konsultieren einfach das Punktprotokoll, das Versprechen funktioniert. Kann hier sogar OD verwenden, aber dafür müssen wir es mit einer Sin-Funktion umschließen. Deshalb verwende ich die Then-Methode, und hier behandeln wir den Fehler nicht mit der Cache-Methode. Nun wollen wir sehen, was passieren wird. Speichern Sie die Ings und lassen Sie uns unsere Anwendung mit Node Index Dot JS ausführen . Hier erhalten wir ein Protokoll für diesen Fehler, und wie wir sehen können, wird die nicht abgefangene Ausnahme erneut aufgerufen In den Versionen Node 15 und höher 15 wird die unbehandelte Ablehnung von Zusagen eher wie eine Uncout-Ausnahme behandelt Wenn wir die Ablehnung von Zusagen nicht behandelt haben, könnte sie in den Uncut-Exception-Handler übergehen Um die UnhandlePmise-Ablehnung separat zu speichern, können wir diesen Code duplizieren und das Ereignis einfach ändern Auch im Logger geben wir hier die Fehlermeldung als unbehandelte Ablehnung von Zusagen weiter. Sehen Sie sich die Änderungen an und lassen Sie uns diese Anwendung noch einmal ausführen Siehst du, jetzt bekommen wir hier eine Fehlermeldung, unbehandelte Ablehnung eines Versprechens So können wir also mithilfe globaler Listener mit nicht abgefangenen Ausnahmen und der Ablehnung von Unhandle Pmise nun in unserer Anwendung dieses Konsolen-Punktprotokoll Lassen Sie uns nun in unserer Anwendung dieses Konsolen-Punktprotokoll für die Mongo Di B-Verbindung ändern . Was schreiben wir hier? Punktinformationen protokollieren. Und bei der Cache-Methode ersetzen wir dieses Konsolen-Punktprotokoll durch einen Logger-Punktfehler. Außerdem können wir nach dem Verbindungsausfall unsere Anwendung beenden, da unsere gesamte Anwendung von dieser Verbindung abhängt. Also schließen wir diesen Code mit geschweiften Klammern ein. Sie einfach aus den globalen Listenern Kopieren Sie einfach aus den globalen Listenern diesen Logger-Punkt auf Logger-Punkt und fügen Sie ihn Dadurch kann unsere Anwendung das Protokoll in der Datei und Datenbank speichern Protokoll in der Datei und Datenbank Jetzt brauchen wir auch nicht mehr dieses Fehlerversprechen und auch diese Methode nicht mehr. So gehen wir also mit Fehlern um und protokollieren sie um unsere Anwendung zu verbessern und weiter zu verfolgen. 139. Zusammenfassung der Fehlerbehandlung und -protokollierung: Lassen Sie uns diesen Abschnitt kurz zusammenfassen. Vor diesem Abschnitt in unserer Anwendung haben wir uns also nicht mit Fehlern befasst Also behandeln wir zunächst Fehler für API-Route-Handler. Jeder Fehler, der im Route-Handler auftritt , wird von der neuesten Version von Express an die nächste Middleware gesendet neuesten Version von Express an die nächste Middleware nach allen Routen in der js-Datei mit dem Indexpunkt eine Fehler-Middleware hinzu, die alle Fehler von Route-Handlern behandelt Nachdem wir die Fehler behandelt haben, können wir diese Fehler nun in den Dateien oder in der Datenbank speichern Für die Protokollierung der Fehler verwenden wir also das DB-Paket Winston und Winston Des Mongo Hier konfigurieren wir den Winston-Logger, in dem wir das globale Log-Label-Format unseres Protokolls und einige Transporte angeben das globale Log-Label-Format unseres , um unser Protokoll an die Konsole, Datei und sogar in Mango Di zu senden , Datei und sogar Auf diese Weise können wir Fehler von Route-Handlern speichern. Aber was ist, wenn außerhalb des Express etwas schief geht? Deshalb definieren wir zwei globale Listener, einen für nicht abgefangene Ausnahmen und einen für unbehandelte Denken Sie daran, dass Node die Ablehnung von Zusagen standardmäßig als nicht abgefangene Ausnahme behandelt, wenn wir keinen Listener für unbehandelte Ablehnung hinzufügen Ablehnung Node die Ablehnung von Zusagen standardmäßig als nicht abgefangene Ausnahme behandelt, wenn wir keinen Listener für unbehandelte Zusagen Außerdem protokollieren wir in diesen globalen Listenern die Fehler und dann unsere Anwendung ordnungsgemäß ein. Am Ende hört dieser Logger-Punkt auf, neue Protokolle zu schreiben, beendet alle ausstehenden Protokolle und schließt Transportströme wie Dateistreams, und schließt Transportströme wie Dateistreams, SddprQuest Hier dreht sich alles um die Behandlung und Protokollierung von Fehlern. Im nächsten Abschnitt werden wir unserer E-Commerce-Anwendung weitere Funktionen hinzufügen . 140. Abschnitt 12 - Erstellen eines Warenkorbmodells: Willkommen zu einem weiteren wichtigen Abschnitt des ultimativen No Jz-Kurses In diesem Abschnitt werden wir unser E-Commerce-Projekt vorantreiben unser E-Commerce-Projekt vorantreiben Zuerst werden wir einige Kartenfunktionen hinzufügen und dann das Zahlungsgateway in unsere Anwendung integrieren , was wirklich wichtig ist und Spaß macht, es zu erstellen. Ich freue mich riesig und hoffe, du bist es auch. Fangen wir also mit diesem Abschnitt an. Bisher haben wir in unserem Projekt Benutzerkategorien und Produkt-API hinzugefügt. Wenn der Benutzer jetzt ein Produkt kaufen möchte, fügt er sein Produkt der Karte hinzu. Die Karte funktioniert also wie ein Korb oder ein Einkaufswagen im Supermarkt. Fügen Sie alle Produkte hinzu, die wir kaufen möchten, und dann bezahlen wir für diese Produkte Das wissen wir schon, oder? Deshalb werden wir ein neues Modell für CAT-Daten erstellen. Also erstellen wir im Modellordner eine neue Datei namens cart dot js. Nun zur Definition des Schemas: Zunächst ist Cost Mongoose gleich Require Mongoose. Danach definieren wir, dass das CAT-Schema dem neuen Mongoose-Punktschema entspricht Hier fügen wir unser Kartenschema hinzu. In diesem Kartenmodell speichern wir die Kartendetails aller Benutzer. Zuallererst müssen wir also vom Benutzer zum Objekttyp bis zum Mongoose-Punktschema , Punkttypen, Punkt-Objekt-ID, Referenz zum Benutzer speichern bis zum Mongoose-Punktschema , Punkttypen, Punkt-Objekt-ID, und wir setzen es einfach auf true Nach dem Benutzer wollen wir nun wissen, welche Produkte der Benutzer zu seiner Karte hinzugefügt hat Also fügen wir gefüllte Produkte hinzu, und wie wir in CAT wissen, kann der Benutzer mehrere Produkte hinzufügen. Es wird also die Produktpalette sein. Jetzt speichern wir für jedes Produkt ein Produktobjekt und in diesem Objekt speichern wir die erste Produkt-ID. Dies ist wieder eine Referenz, also kopiere ich dieses Schemaobjekt einfach für den Benutzer. Fügen Sie es hier für die Produkt-ID ein und stellen Sie sicher, dass Sie diesen Referenzbenutzer in „Produkt“ ändern. Jetzt, nach der Produkt-ID, benötigen wir die Menge dieses Produkts. Also addieren wir die Menge zum Objekt, zum Typ und zur Zahl, die auf true gesetzt werden muss, weil das notwendig ist. Mann auch, aus Sicherheitsgründen können wir auch Standard zu eins hinzufügen. Wenn wir uns nun unser Frontend vorstellen, wollen wir Daten wie diese zeigen. Zuerst möchten wir den Produktnamen oder -titel, dann den Preis, dann die Menge und die Gesamtsumme anzeigen . Wenn wir nur die Produkt-ID in den Kartendaten speichern, müssen wir Auffüllen ausführen, um Produktdetails wie Titel, Preis, Bild usw. abzurufen. Das Abrufen der Kartendaten dauert jedoch länger Wir können hier einen hybriden Ansatz verwenden. Wenn Ihre Anwendungsanforderungen unterschiedlich sind, müssen Sie sich an den einzigen Referenzansatz halten. Wenn Sie also Leistung wollen, dann verwenden Sie Hybrid, und wenn Sie Konsistenz der Daten wünschen , bei denen sich Ihre Produkttitel Preisbilder häufiger ändern, dann müssen Sie den Referenzansatz verwenden. Nach der Menge fügen wir also title, type zur Zeichenfolge und required zu true hinzu. Danach müssen wir den Preis, Typ in die Zahl und den Wert true eingeben. Nach dem Preis benötigen wir möglicherweise ein Bild, das das Titelbild des Produkts ist, vom Typ in die Zeichenfolge und als Pflichtbild den Wert true. Als letztes benötigen wir den Gesamtpreis , also den Gesamtpreis des aktuellen Produkts, vom Typ bis zur Zahl und vom Pflichtangaben, um wahr zu sein. Diesen Gesamtpreis werden wir nach dem Preis zur Menge zählen , oder? Das ist alles, was wir für das Produktobjekt benötigen. Nun, was brauchen wir noch im Einkaufswagen? Sehen wir uns die GRT-Seite noch einmal an. Zuallererst erhalten wir auf jeder E-Commerce-Website die Anzahl der Produkte im Nepar oder Und auch für die CRT-Seite müssen wir den Endpreis des Produkts anzeigen Wir benötigen also zwei weitere Felder in unserem Kartenschema. Erstens ist die Gesamtzahl der Produkte pro Typ standardmäßig auf Null gesetzt. Wenn wir in unserer Karte zwei iPhones und drei Smartwatches haben, dann sind unsere Gesamtprodukte fünf Und nach der Gesamtzahl der Produkte benötigen wir den Gesamtkartenpreis Wir können das als Endpreis angeben, aber der Gesamtpreis der Karte sieht cooler aus. Also Gesamtpreis der Karte, Typ zu Zahl und auch standardmäßig Null. Jetzt fragen Sie sich vielleicht warum wir den Gesamtpreis der Karte speichern müssen? Warum können wir die Werte nicht berechnen, wenn wir Kartendaten senden? Der Grund, warum wir den Gesamtpreis der Karte speichern, ist erstens die schnellere Anzeige. Wenn ein Benutzer seine Karte ansieht, kann die Website den Gesamtpreis sofort anzeigen , ohne ihn jedes Mal neu berechnen zu müssen Dies spart Zeit, insbesondere wenn die Karte viele Produkte enthält Zweitens reduzieren Sie die Arbeit für den Server. Das liegt daran, dass wir den Endpreis nicht mehrmals berechnen müssen . Stellen Sie sich also vor, unser Benutzer hat zehn verschiedene Produkte auf seiner Karte. Ohne den Gesamtpreis der Karte muss unser Server bei jedem Öffnen der Kartenseite alle zehn Produkte durchsuchen und deren Preise zusammenzählen . Jetzt mit dem Gesamtkartenpreis ruft unser Server nur den Gesamtpreis ab, den der Shop bereits gespeichert hat Das spart Zeit und Mühe, und deshalb speichern wir hier Gesamtkartenpreis in der Datenbank Jetzt haben wir unser Kartenschema fertig. Wenn wir in Zukunft weitere Felder hinzufügen oder etwas entfernen möchten, können wir das auch tun. Daran ist nichts falsch. Halten Sie sich auch nicht an einen Ansatz. Als Entwickler müssen wir immer darüber nachdenken, was unsere Anwendung oder unser Produkt für die Endbenutzer nützlicher und schneller macht oder unser Produkt für die Endbenutzer nützlicher und . So einfach ist das. Lassen Sie uns nun das Cart-Modell erstellen zweite Karte entspricht dem Mango-Punktmodell Zuerst fügen wir einen singulären Namen hinzu, nämlich cart , und als zweites Argument übergeben wir das Warenkorbschema wir Schließlich werden wir am Ende Module Dot Exports durchführen, die CAT entsprechen 141. API-Liste für Warenkorb definieren: Bevor wir mit der Erstellung der APIs für Card beginnen, wollen wir uns ansehen, welche und wie viele APIs wir erstellen müssen. Das wird uns Klarheit verschaffen. Also hier ist mein Prozess zur Definition der API-Liste. Ich fing an, mir das Frontend aus der Perspektive des Benutzers vorzustellen . Mit einfachen Worten, ich versetze mich in die Lage eines normalen Benutzers, was der Benutzer mit der Karte machen möchte. Erstens wollen sie einfach ein Produkt zur Karte hinzufügen. Das ist also unsere erste API. Nachdem sie das Produkt zur Karte hinzugefügt haben, möchten sie ihren eigenen Einkaufswagen sehen, welche Produkte sie hinzugefügt haben und wie viel Geld sie für den Kauf benötigen. Wir benötigen also eine API, um den aktuellen Warenkorb des Benutzers abzurufen. Außerdem möchten sie in der Leiste „Neu “ die Anzahl der im Warenkorb verfügbaren Produkte sehen . So können wir eine separate API nur für Kartennummern erstellen. Danach können sie auf der Warenkorbseite die Menge der Produkte erhöhen oder die Menge der Produkte verringern und auch die gesamten Produkte von der Karte löschen . Hier benötigen wir drei weitere APIs, eine für die Erhöhung, die zweite für die Verringerung und die letzte für das gelöschte Produkt. Hier haben wir also die Liste der APIs für den Warenkorb. Natürlich können wir APIs zu dieser Liste hinzufügen oder daraus entfernen. Es hängt wirklich von uns ab. 142. Produkte zum Warenkorb hinzufügen: Beginnen wir mit unserer ersten API für CAT, bei der ein einzelnes Produkt zur Karte hinzugefügt wird. Also erstellen wir im Routenordner eine neue Datei namens card dot js. Gut. In dieser Datei erstellen wir jetzt einen Router für die API. Const Express entspricht also Require Express, und danach entspricht Cost Router dem Express Dot Router Und wie wir wissen, entspricht das Modul Dot Ports am Ende dem Router Bevor wir nun die API definieren, legen wir diesen Router in unserer JS-Datei mit Indexpunkt fest. Andernfalls funktionieren unsere Warenkorb-APIs nicht. Speichern Sie diese Datei, wechseln Sie zur Indexpunkt-JS-Datei und hier entspricht Const CAT Routes einfach den Require Periods Routes CART Stellen Sie sicher, dass Sie hier schreiben, benötigen Sie nicht. In letzter Zeit mache ich diesen Fehler. Jetzt fügen wir unten App Punkt g hinzu. Hier fügen wir das Präfix API Slash CAT Hier fügen wir Kartenrouten hinzu. Herrlich. Lassen Sie uns nun mit der Head-to-Cart-API beginnen. Also hier fügen wir Router hinzu. Und kannst du mir sagen, welche Methode wir verwenden werden? Richtig, wir werden die Post-Methode verwenden. Der Router-Punkt-Post-Endpunkt ist also Forward-SLAS. Danach fügen wir einen Route-Callback mit Anfrage und Antwort Was wollen wir nun vom Frontend? Wir brauchen hauptsächlich zwei Dinge. Zunächst benötigen wir eine Produkt-ID , die der Benutzer der Karte hinzufügen möchte. Und zweitens wollen wir die Menge ihres Produkts wissen . Zu einem Zeitpunkt kann der Benutzer nur ein Produkt mit seiner Menge hinzufügen Wenn er ein weiteres Produkt hinzufügen möchte, muss er diese API erneut aufrufen. So einfach ist das. Also zuerst erhalten wir Details im Hauptteil der Anfrage. Wir können es hier umstrukturieren und Produkt-ID und die Menge ermitteln Einfachheit halber erhalten wir die Produkt-ID auch im Abfrageparameter Entfernen Sie diese also von hier und fügen im Endpunkt einen Doppelpunkt für die Produkt-ID hinzu. Und um diese Produkt-ID zu erhalten, fügen wir hier hinzu, dass die Kosten-Produkt-ID dem Anforderungspunkt PRAM Punkt-Produkt-ID entspricht Gut. Nun, danach, was wollen wir? Ja, wir benötigen auch eine Benutzer-ID. Und wie können wir das bekommen? Ja, wir können hier Orthomidalware hinzufügen, und um den Benutzer abzurufen, können wir schreiben, dass const user id is equal to request dot dot underscore-ID to request dot dot Nun, hier kommt ein logischer Teil, was wir wirklich in der Head-to-Cart-API tun wollen Zunächst überprüfen wir Produktnummer auf der Vorderseite und den Cent und die Menge oder nicht. Beginnen Sie immer mit der Validierung. Wir fügen hinzu, wenn die Produktnummer des Zustands nicht verfügbar ist oder die Menge nicht verfügbar ist, geben wir einen Fehler zurück. Also Antwort, Punktstatus, 400 für fehlende Felder und Punkt JSON-Objekt mit Menset-Eigenschaft, fehlende Pflichtfelder. Gut. Danach überprüfen wir, ob das Frontend die gültige Produkt-ID übergeben hat oder nicht. Gibt es ein Produkt mit dieser ID in unserer Datenbank? Dafür schreiben wir die Kosten, Produkt entspricht einem Gewicht des Produkts und suchen nach der ID, und hier geben wir die Produkt-ID weiter. Wenn die automatische Eingabe nicht funktioniert, müssen wir dieses Produktmodell außerdem manuell eingeben. Await verwenden zu können, müssen wir diese Funktion also asynchron machen Jetzt unten können wir hier den Zustand angeben. Wenn das Produkt nicht verfügbar ist, Produkt nicht verfügbar ist geben wir eine Antwort mit dem Status 404 Punkt Json zurück Und in der Eigenschaft Messet geben wir das Produkt nicht gefunden Jetzt frage ich erneut, was wir in der Add to Cart API tun wollen Gehen wir Schritt für Schritt vor. Lass dich nicht verwirren. Wir wollen einfach eine Sache tun. Wir erstellen eine neue Karte für den Benutzer und fügen einfach das aktuelle Produkt mit den erforderlichen Füllungen zur Produktpalette hinzu. Es besteht jedoch die Möglichkeit , dass diese Benutzerkarte bereits verfügbar ist. Hier wollen wir keine doppelten Karten erstellen, also überprüfen wir, ob const card gleich wait card ist Siehe automatische Eingabe funktioniert, Kartenpunkt Fine One Und hier im Bedingungsobjekt geben wir die Benutzer-ID an die Benutzer-ID weiter. Wie wir wissen, hat ein Benutzer jeweils nur eine Karte, denn wenn Sie die Produkte nach erfolgreicher Zahlung auschecken , löschen wir die Benutzerkarte aus der Datenbank. Wenn dieser Benutzer seine Karte hat, erhalten wir sie in der Kartenvariablen. Was ist, wenn der Benutzer keinen Einkaufswagen hat? Es kann zuerst ein Produkt für eine Karte sein. Also überprüfen wir den Zustand. Wenn der Einkaufswagen nicht verfügbar ist, was wollen wir dann tun? Richtig, wir werden eine neue Karte erstellen. Also neue Karte. Und hier übergeben wir Object. Zuerst fügen wir den Benutzer zur Benutzer-ID und das Produkt vorerst zum leeren Array hinzu. Die Gesamtzahl der Produkte ist auf Null und der gesamte Kartenpreis auf Null. Jetzt wird der Einkaufswagen zurückgegeben. Hier können wir einfach diese Kartenvariable verwenden und ihren Wert ersetzen, denn wenn die Karte nicht verfügbar ist, erstellen wir nur dann eine neue CAT. Andernfalls erhalten wir ein Kartenobjekt in dieser Kartenvariablen. Wir verwenden hier „Karte ist gleich neuer Einkaufswagen“. diese Kartenvariable zu ersetzen, müssen wir sie also mit let definieren. Andernfalls erhalten wir eine Fehlermeldung. Bist du bis zu diesem Zeitpunkt klar? Und wenn du ein bisschen verwirrt bist, dann mach dir keine Sorgen. Wenn wir diese API fertiggestellt haben, werden wir sie von Grund auf neu zusammenfassen Dadurch wird all eure Verwirrung verschwinden. Wir haben also einen Einkaufswagen und müssen nur das Produkt in das Produktfeld mit der Menge und anderen Feldern, die wir im Schema definieren, einfügen. Wir können also Cart Dot Products Dot Push ausführen. Und hier übergeben wir das Produktobjekt, das wir pushen wollen. Also Objekt, was die Felder sind, habe ich wirklich vergessen. Lassen Sie mich das CAT-Modell einchecken. Okay. Also zuerst, Produkt-ID zu Produkt-ID, Menge zu Menge. Danach haben wir den Titel. Nun hier, wie können wir den Produkttitel bekommen? Weil das Frontend nur die Produkt-ID weitergibt. Denk darüber nach. Wir erhalten also Produktdetails aus dieser Produktvariablen. Hier überprüfen wir auch, ob das Produkt gültig ist oder nicht. Wenn das Produkt gültig ist, erhalten wir seine Details in der Produktvariablen. Das macht jetzt Sinn, warum wir ein Produkt finden. Es wird die Produkt-ID validieren und wir werden auch andere Details erhalten. Also Titel zu Produkt Punkt Titel. Preis zu Produktpunktpreis, das ist der aktuelle Produktpreis, Bild, das ist das Titelbild, also Produktpunktbild, was Array ist, und wir legen einfach das erste Bild fest. Jetzt fragen Sie sich vielleicht, warum wir diese Informationen nicht vom Frontend erhalten. Stellen Sie sich vor, wir erhalten diese Preisdetails vom Frontend. Wenn Sie bei einem Produkt Null überschreiten, wird der Preis für sein Auto als Null gespeichert Wir können uns also eindeutig nicht auf die Frontend-Daten verlassen. Es ist besser, echte Daten aus der Datenbank zu bekommen. Jetzt, nach diesem Bild, haben wir den Gesamtpreis für das Produkt , also den aktuellen Preis in Menge. Also zwischen Produktpreis und Menge. Und das ist alles, was wir in der Produktpalette benötigen. Jetzt müssen wir nur noch zwei Dinge tun. Wir müssen die Gesamtzahl der Produkte der Karte und dann den Gesamtpreis der Karte zählen. Beide sind sehr einfach. Und wissen Sie, mit welcher Methode wir die Summe zählen werden? Richtig, wir werden eine reduzierte Methode verwenden. Wir schreiben, dass Cart Dot Total Products gleich Cart Dot Products ist, was Array Dot Reduce Wie wir wissen, müssen wir bei der reduzierten Methode zwei Argumente übergeben . erste ist eine Callback-Funktion , mit der wir die Produktmenge und dann den Standardwert der Menge berechnen die Produktmenge und dann , der Null ist Im Callback erhalten wir jetzt zwei Parameter, Total und Product, was ein einzelnes Produktobjekt ist Aus dem Rückruf geben wir einfach die Summe plus die Anzahl der Produktpunkte zurück . Kurz gesagt, diese reduzierte Methode führt die Schleife für jedes Produkt durch und gibt uns die Summe der Produktmenge Großartig. Jetzt müssen wir nur noch den Gesamtpreis der Karte berechnen und dafür werden wir wieder die Reduce-Methode verwenden. Gesamtpreis der Karte entspricht dem Wert für Produkte im Warenkorb, Punkt reduzieren. Hier übergeben wir wieder zwei Argumente. erste ist die Callbeck-Funktion mit Summen - und Produktobjekt-Pfeilfunktion Und danach haben wir einfach den Standardwert dieser Summe, der Null ist Was wir von dieser Callback-Funktion zurückgeben. Wir rechnen einfach den Gesamtbetrag zuzüglich des Punktpreises des Produkts in die Produktmenge Der Einfachheit halber können wir auch den Gesamtpreis plus den Gesamtpreis zurückgeben , den wir hier berechnet haben. Außerdem denke ich, dass wir dieses Feld für den Gesamtpreis nicht benötigen. Es zeigt nicht wirklich Wirkung. Was denkst du? Ja, also lassen Sie uns es aus der Push-Methode entfernen, und wir müssen es auch aus dem Schema entfernen. Gehen Sie zum Fahrzeugschema und entfernen Sie eingegebenen Gesamtpreis aus dem Produktobjekt. So einfach ist das. Jetzt haben wir alle Kartenfelder mit Details gefüllt, sodass wir die Karte einfach speichern können. Warten Sie auf Kartenpunkt C. Nachdem wir die Karte gespeichert haben, geben wir einfach Antwort, Punktstatus, 201 und 200 zurück Punktstatus, 201 und 200 weil wir hier vielleicht eine neue Karte erstellen oder einfach die Produkte hinzufügen. Außerdem Punkt Json-Objekt mit Nachricht, Produkt wurde erfolgreich zur Karte hinzugefügt. Danach geben wir in der Antwort einfach den vollen Warenkorb zurück. Wenn Sie nicht senden müssen, können Sie dies auch entfernen. Lassen Sie uns nun diese API-Implementierung testen , da das Testen wirklich wichtig ist. Sehen wir uns die Änderungen an und gehen wir zurück zum Postboten. Hier in unserem Projekt erstellen wir eine neue Kollektion namens CAT Und in der CAT-Kollektion erstellen wir eine neue Anfrage namens ED-Produkte an CAT. Zuerst ändern wir die Methode, um die APIURL an den lokalen Host zu senden, Spalte 3.000, API-Slash CART SLS, und hier müssen wir die Produkt-ID übergeben, die wir dem AT hinzufügen möchten Im Moment übergebe ich einfach eine und sende die Anfrage. Sehen Sie, hier erhalten wir ein Autorisierungstoken das erforderlich ist, weil wir in unserer API Orth Middleware hinzugefügt haben Lassen Sie uns ein neues Token generieren, die Anmeldeanfrage senden und hier erhalten wir das Token. Kopiere das. Jetzt gehen wir in der Karten-API zu den Headern und fügen hier die Autorisierung in den Wert ein, fügen Bierraum hinzu und fügen unser Token ohne Doppelcodes Senden Sie jetzt die Anfrage. Siehst du, hier bekommen wir einen internen Serverfehler. Und wenn wir unser VS-Code-Terminal überprüfen, können wir hier nicht das Eigentum, die Menge der Anfrage oder den Punktkörper destrukturieren Menge der Anfrage oder den Punktkörper Das passiert, weil wir im Hauptteil der Anfrage keine Menge übergeben Gehen Sie also zu Mongoi B Compass. in der Produktkollektion Kopieren Sie in der Produktkollektion einfach diese iPhone 14-ID zurück nach Postman. Hier an der Stelle dieser ID fügen wir die Objekt-ID ein fügen wir die Objekt-ID Und lassen Sie mich im Körper diese beiden Eigenschaften entfernen. Jetzt sehen wir RAW und übergeben Ihrem Objekt einfach eine Eigenschaft, also die Menge zwei. Und lass uns diese Anfrage senden. Sehen Sie, hier haben wir das Produkt erfolgreich zur Karte hinzugefügt. Und hier können wir auch die Karte sehen. Lassen Sie mich das erhöhen. Sehen Sie, hier bekommen wir die Gesamtzahl der Produkte auf zwei, weil wir die Menge auf zwei übertragen, Gesamtkartenpreis auf 2598, was auch richtig ist Außerdem erhalten wir hier eine Produktreihe mit allen Produktobjekten. Hier können wir sehen, dass wir auch die aktuelle Menge, den Titel, den Preis und das Bild erhalten . Lass uns jetzt etwas mehr versuchen. Lassen Sie uns die Menge auf eins ändern und einfach dasselbe Produkt lagern. Siehst du, hier bekommen wir Produkt erfolgreich gestorben, Gesamtanzahl der Produkte und Gesamtpreis im Warenkorb, beide stimmen auch. Aber wenn wir unsere Produktpalette überprüfen, sehen Sie, hier erhalten wir ein anderes Produktobjekt, auch wenn das gleiche Produkt bereits in der Produktreihe verfügbar ist . In unserer API haben wir ein Problem. Wie wir hier sehen können, haben wir das Produkt direkt in die Produktreihe aufgenommen. Was ist, wenn dieses Produkt bereits in der Produktpalette verfügbar ist? In diesem Fall müssen wir nur die Menge ihres Produkts erhöhen. Hier müssen wir also, bevor Kartenprodukte auf den Markt kommen, überprüfen, ob die Produkte, die wir hinzufügen, bereits in der Produktpalette verfügbar sind oder nicht. Es ist wirklich einfach. das Produkt zu finden, fügen wir also CRT-Punktprodukte und den Punktfindex Hier erhalten wir ein einzelnes Produktobjekt, Pfeilfunktion, und hier übergeben wir die Bedingung, das Produkt, die Punkt-Produkt-ID, Punkt-Zwei-Zeichenfolge entspricht der Produkt-ID Punkt ToString Wie wir nun wissen, gibt diese Feinindexmethode den Indexwert des Produkts zurück den Indexwert des , das diese Bedingung erfüllt hat Also speichern wir das in einer Variablen als vorhandener Produktindex bezeichnet wird. Und wenn das Produkt nicht im Produktarray gefunden wird, wird minus eins als Index zurückgegeben. Also können wir das im If-Zustand verwenden. Wenn also der bestehende Produktindex nicht gleich minus eins ist, bedeutet das, dass das Produkt bereits in der Produktreihe verfügbar ist . In diesem Fall erhöhen wir einfach die Menge dieses Produkts, und wie können wir dieses Produktobjekt finden? Richtig, indem wir diesen vorhandenen Produktindex verwenden, also Produkte mit dem Einkaufswagen in eckigen Klammern, fügen wir den vorhandenen Produktindex hinzu. Auf diese Weise erhalten wir die Anzahl der Punkte für das Produktobjekt. Plus entspricht der aktuellen Menge. Das ist es Und wenn das Produkt nicht im Produktarray gefunden wird, verschieben wir nur dann das gesamte Produktobjekt in das Array. Also halten wir uns an und verschieben diese Push-Methode in den S-Blog, und das war's. Sehen Sie sich die Änderungen an. nun vor dem letzten Test Lassen Sie uns nun vor dem letzten Test die vollständige Karte aus der Datenbank entfernen und eine neue Karte erstellen. Zurück zu Postman, sende die Anfrage. Schön, wir bekommen ein Produkt. Lassen Sie uns nun die Menge auf zwei ändern und einfach die Anfrage senden. Siehst du, jetzt wird unsere Menge nur erhöht, und auch die Gesamtzahl der Produkte und der Gesamtkartenpreis stimmen. Jetzt gibt es ein kleines Problem bei dieser Implementierung. Das Produkt ist möglicherweise ausreichend vorrätig oder nicht. Wir müssen das überprüfen, bevor wir das Produkt zu GAT hinzufügen. Also hier, nachdem wir das Produkt erhalten haben, bestehen wir eine solche Bedingung. Wenn das Produkt, der Lagerbestand geringer als die Menge ist, geben wir einfach den Antwortstatus zurück, 400-Punkt-JSON-Objekt mit Nachrichteneigenschaft. Der Vorrat reicht nicht aus. Jetzt ist hier noch ein Fall. Angenommen, unser Produktbestand beträgt vier und wir möchten das Produkt mit der Menge drei in den Warenkorb legen. Damit wird diese Bedingung erfüllt. Was ist nun, wenn wir für dieses Produkt, von dem nur vier auf Lager sind, bereits zuvor zwei Produktmengen hinzugefügt haben und wir jetzt drei weitere Mengen für dasselbe Produkt hinzufügen möchten . In diesem Fall müssen wir verhindern, dass unsere Produktmenge erhöht. Also sag mir, wo wir unseren Zustand schreiben. Schreiben Sie in die bestehende Indexbedingung. Ich kaufe Produkte in eckigen Klammern, bestehende Produkte, Anzahl der Indexpunkte plus die Menge, die wir hinzufügen möchten , ist größer oder entspricht dem Lagerbestand des Produkts Wenn es wahr ist, geben wir dieselbe Antwort mit dem Statuscode 400 zurück und in der Jasen-Methode, Objekt mit Nachrichteneigenschaft, Objekt mit Nachrichteneigenschaft ist der Lagerbestand nicht ausreichend Und schließlich haben wir unsere Head-to-Cart-API fertiggestellt. Lassen Sie uns diese API also kurz zusammenfassen. Zunächst überprüfen wir, ob die Produkt-ID Menge vom Frontend übergeben hat oder nicht, was wir sagen können, als ob Eingaben validiert Danach überprüfen wir, ob das Produkt in unserer Datenbank verfügbar ist oder nicht. Wenn es nicht verfügbar ist, geben wir in der Antwort den Fehler „Produkt nicht gefunden“ zurück. Prüfen Sie danach, ob das Produkt vorrätig ist oder nicht. Wenn es keinen Lagerbestand oder weniger Lagerbestand als unsere Menge hat, antworten wir mit der Nachricht, Lagerbestand nicht ausreicht. Überprüfen Sie danach, ob der Benutzer eine Karte hat oder nicht. Wenn er keinen Einkaufswagen hat, erstellen wir erst dann einen neuen Warenkorb. Danach überprüfen wir, ob das Produkt, das wir hinzufügen möchten , bereits im Warenkorb verfügbar ist oder nicht. Wenn es verfügbar ist, überprüfen wir erneut den Endbestand. Wenn es auch verfügbar ist, erhöhen wir einfach die Menge. Auch wenn das Produkt nicht verfügbar ist, fügen wir das Produktobjekt erst dann den Produktdetails hinzu. Und schließlich zählen wir die Gesamtzahl der Produkte und gesamten Warenkorbpreis mit reduzierten Methode und speichern den Warenkorb ganz einfach. So erstellen wir eine Head-to-Cart-API. 143. Den Benutzerkorb abrufen: Jetzt ist Trainingszeit. Ich möchte, dass Sie eine neue API erstellen, um die aktuellen Kartendetails des angemeldeten Benutzers abzurufen. Es ist wirklich einfach. Ich weiß, dass du das kannst. Sehen wir uns nun die Lösung an. Also Router-Punkt GT und Zeiger auf Schrägstrich. Danach fügen wir die asynchrone Callback-Funktion mit Anfrage In der Callback-Funktion entspricht const card nun await card dot find Hier übergeben wir Object with user to request dot user dot underscore ID und am Ende antworten wir einfach dot json, den Benutzer in die Antwort zu bekommen, müssen wir außerdem die Orth-Middleware hinzufügen Und das ist es. Lassen Sie uns diese API probieren, Postboten auf der Karte öffnen eine neue Anfrage mit dem Namen Getting the user card erstellen URL zu SDP, Spalte mit doppeltem Schrägstrich, Lokaler Host, Spalte 3.000 Schrägstrich , API-Schrägstrich, CAT-Schrägstrich Und jetzt müssen wir hier das Token übergeben. Gehen Sie also zu den Headern und hier fügen wir die Autorisierung hinzu. Im Wert übergeben wir den Trägerraum. Gehen Sie jetzt zur Login-API, senden Sie die Anfrage, holen Sie sich das neue Token, kopieren Sie es und wir fügen dieses Token einfach in unsere API wir fügen dieses Token Lassen Sie uns jetzt die Anfrage senden. Siehst du, hier bekommen wir Kartendaten. Hört sich einfach an. Es ist auch möglich, dass der aktuelle Benutzer die Karte nicht hat , weil er nie ein Produkt auf der Karte hatte. Wenn das der Fall ist, müssen wir eine andere Antwort zurückgeben. Wir schreiben, wenn die Karte nicht verfügbar ist, geben dann die Antwort zurück. Punktstatus 404 wurde nicht gefunden. Punkt Json-Objekt mit Nachrichteneigenschaft, Benutzerkarte ist leer. Wenn wir die Karte am Ende gefunden haben, senden wir sie so, wie sie ist. 144. Erhöhen Sie die Produktmenge: Wie wir wissen, müssen wir auf der Kartenseite möglicherweise die Produktmenge um eins erhöhen oder verringern. Definieren wir also die API für diese Funktion. Also Router Punkt, welche Methode wir verwenden werden. Wie wir wissen, müssen wir bei unseren Kartendaten nur einen kleinen Teil der Daten aktualisieren , nämlich Menge, Gesamtzahl der Produkte und Gesamtkartenpreis. Also, um kleine Daten zu aktualisieren, welche Methode wir verwenden werden, richtig, wir werden die Patch-Methode 0.2 erhöhen verwenden und hier benötigen wir das Produkt , für das der Benutzer die Menge im Warenkorb erhöhen möchte. Wir werden hier auch die Produkt-ID als Routenparameter hinzufügen , genau wie zuvor. Außerdem benötigen wir Orthomidalware, da nur angemeldete Benutzer die Menge auf der Karte erhöhen können Danach fügen wir die ACN-Callback-Funktion mit Anfrage- und Antwortpfeilfunktion mit Anfrage- und Antwortpfeilfunktion Zunächst erhalten wir die Produkt-ID aus dem Anforderungspunkt PRMs, Produkt-ID Kommen wir nun zum logischen Teil der Abfrage. Viele Studierende fragen mich, wie ich die Logik der Abfrage oder irgendeines Features verstehen kann ? Lass mich dir meinen Trick geben. Wann immer Sie irgendeine Logik anwenden wollen, dann beschreiben Sie diese Logik zunächst in einfacher menschlicher Sprache. Hier wollen wir zum Beispiel die Logik finden, die Menge für diese angegebene Produkt-ID um eins zu erhöhen. Es bedeutet einfach, dass wir zuerst die aktuelle Benutzerkarte finden müssen , weil wir sie aktualisieren möchten. Danach werden wir dieses Produkt in der Reihe der Kartenprodukte finden . Und nachdem wir das Produkt gefunden haben, vergrößern wir einfach das Mengenfeld des Produkts. Wir können auch die Gesamtzahl der Produkte um eins und den Gesamtpreis der Karte um den aktuellen Preis des Produkts erhöhen . Endlich speichern wir einfach die aktualisierte Karte. Sehen Sie, wie einfach das wird, nachdem Sie die logischen Schritte geschrieben haben. Zuerst finden wir die aktuelle Benutzerkarte. Const Cart entspricht einem Gewicht Cart Dot Fine One. Im Vergleichsobjekt fügen wir die Benutzer-ID mit Punkt und Punkt als Unterstrich-ID hinzu. Jetzt ist es möglich, dass wir die Karte nicht finden, also ist es besser, eine fehlerhafte Antwort zurückzugeben Wenn der Einkaufswagen nicht verfügbar ist, geben wir den Antwortstatus 404 Punkt JSON, Objekt mit Nachrichtenkarte nicht gefunden zurück. Gut. Gehen wir nun zum nächsten Schritt über, bei dem es darum geht, das Produkt in der CAT-Produktpalette zu finden. Das haben wir bereits in der Head-to-Cart-API gemacht. Denken Sie daran, ja, hier verwenden wir die Feinindexmethode. Wir schreiben CAT-Punktprodukte mit Punktfeinindex. Hier erhalten wir ein einzelnes Produktobjekt, eine Pfeilfunktion, und hier geben wir den Zustand und die Produktpunkt-Produkt-ID zurück . Dies ist eine Objekt-ID, also müssen wir sie in eine Zeichenfolge konvertieren , die der Produkt-ID entspricht, die wir aus dem Abfrageparameter erhalten. Dieser Ausdruck gibt den Index des Produkts zurück , das wir aktualisieren möchten. Also speichern wir das in einer Variablen namens Index. Jetzt bekommen wir den Index. Als Nächstes müssen wir die Menge dieses Indexprodukts erhöhen . Wenn also Produkte im Warenkorb in eckigen Klammern stehen, geben wir den Indexpunkt an. Die Menge plus ist gleich eins. Das bedeutet, die aktuelle Menge um eins zu erhöhen. Danach erhöhen wir auch Gesamtzahl der Produkte im Warenkorb, plus ist gleich eins, und auch den Gesamtpreis pro Karte, plus entspricht Warenkorbpunkt-Produkten in eckigen Klammern, Indexpunkt Preis. Und am Ende warten wir auf Card Dot CV. Und schließlich übergibt der Antwortpunkt Json das Objekt mit der Nachrichteneigenschaft, Produkt und der Menge erfolgreich. Außerdem schicken wir die Karte nur zum Testen, und das war's. Sehen Sie, wie einfach und sauber unsere API aussieht. Lassen Sie uns nun diese API testen, die Änderungen ansehen und Post Van öffnen. Hier erstellen wir ein Duplikat dieser Postkartenmethode und behalten ihren Namen, um die Produktmenge um eins zu erhöhen. Jetzt können wir die Produkt-ID, die Sie aktualisieren möchten, mit einer Erhöhung und einem Schrägstrich versehen Außerdem haben wir hier die Header-Autorisierung und wir ändern auch die Lassen Sie uns jetzt einfach die Anfrage senden. Siehst du, hier erhalte ich ein ungültiges Token, weil mein Token abgelaufen ist. Gehen Sie also zur Login-API und generieren Sie ein neues Token. Gut. Kopiere dieses Token. Einfach in der Erweiterungs-API, zahlt das Token im Header. Lassen Sie uns nun diese Anfrage senden. Siehst du, hier bekommen wir eine Erfolgsmeldung, und zuvor hatten wir drei iPhones in unserer Karte, und jetzt haben wir vier, also funktioniert es Auch die Gesamtzahl der Produkte und Gesamtkartenpreis funktionieren ebenfalls . Lassen Sie mich Ihnen eine Frage stellen. Was passiert, wenn wir die Produkt-ID weitergeben, die im Produktsortiment nicht verfügbar ist ? Wir haben uns nicht darum gekümmert. Also hier, nachdem wir den Index erhalten haben, erfüllen wir die Bedingung, dass der Index gleich minus eins ist, was bedeutet, dass wir den Index in den Kartenprodukten nicht finden können. Dann geben wir den Antwortstatus 404 Punkt Json Object mit der Meldung product not found in Card zurück. Lass uns das probieren. Also an der Stelle dieser Produkt-ID geben wir einfach eine weiter und senden die Anfrage. Siehst du, hier bekommen wir ein Produkt, das nicht im Warenkorb gefunden wurde. Großartig. Nun, welche Sache kann in der API schief gehen. Lass uns darüber nachdenken. Wenn wir die Produktmenge erhöhen, sollte das Produkt idealerweise auf Lager sein. Wenn zum Beispiel das iPhone 14 nur sechs auf Lager ist und wir bereits sechs iPhones im Warenkorb haben und versuchen idealerweise ein weiteres iPhone 14 aufzustocken, können wir das tun Wir können die Anzahl der iPhones nicht auf sieben erhöhen , da wir nur sechs iPhones auf Lager haben Wir können auch eine weitere Bedingung stellen bevor wir die Kartendetails aktualisieren Wenn die Karte die Produkte in einer quadratischen Packung enthält, entspricht die Menge mit dem Indexpunkt dem Produkt und dem Lagerbestand. Dann geben wir als Antwort den Punktstatus, 400-Punkt-JCN-Objekt mit der Meldung, Produkt, ausverkauft zurück. Gant erhöht das Produkt um eins Nun stellt sich die Frage, wie können wir dieses Produkt auf Lager bekommen? Richtig, wir müssen ein Produkt aus der Produktkollektion finden . Oben, nach dieser Produkt-ID, können wir kontrastieren, ob das Produkt dem Produktpunkt Fine By ID entspricht , und hier geben wir die Produkt-ID Nun, das kann passieren, dass diese Produkt-ID nicht gültig ist, also können wir hier auch den Zustand angeben Das haben wir bereits in der Post-API gemacht. Sehen Sie hier. Kopieren wir also diese Bedingung und fügen sie in unsere Erweiterungs-API ein. A Überprüfen Sie beim Befehl vor der Find-Methode, ob das Produkt existiert. Lassen Sie uns nun diese Implementierung probieren. Also geh zu Postman, sende die Anfrage. Siehst du, jetzt bekommen wir einen internen Serverfehler. Wählen Sie nun den Endpunkt aus und drücken Sie Strg+D oder Befehlstaste+D. Die ursprüngliche Produkt-ID wird abgerufen. Senden Sie die Anfrage, C, Menge um eins erhöhen. Senden Sie die Anfrage erneut. C, wir bekommen sechs iPhone, wir haben acht auf Lager, also senden wir die Anfrage noch zweimal. Siehst du, wir haben jetzt acht iPhones und lass uns die Anfrage noch einmal senden Siehst du, hier bekommen wir die Fehlermeldung, das Produkt ist ausverkauft, können das Produkt nicht um eins erhöhen Jetzt funktioniert unsere API gut. 145. Verringern der Produktmenge: Lassen Sie uns nun schnell eine API definieren oder die Produktmenge verringern. Es wird auch dasselbe sein. Lassen Sie uns diese erweiterte API kopieren und unten einfügen. Jetzt fügen wir hier zunächst den obersten Kommentar hinzu und verringern die Produktmenge. Außerdem ändern wir hier den Endpunkt, um die Produkt-ID zu verringern. Lassen Sie uns diese API nun Schritt für Schritt überprüfen, um sicherzustellen, dass wir nichts vergessen. Zuerst bekommen wir das Produkt , das wir auch benötigen. Danach finden wir den Einkaufswagen gut. Danach finden wir den Index, gut, jetzt ist hier eine Sache, um die Produktmenge auf eins zu reduzieren, wir müssen den Lagerbestand nicht überprüfen. Aber wir müssen noch eine Sache überprüfen. Wenn wir derzeit nur eine Produktmenge auf unserer Karte haben, wir derzeit nur eine Produktmenge auf unserer Karte haben versuchen wir, diese Produktmenge auf eins zu reduzieren. In diesem Fall müssen wir das gesamte Produktobjekt aus der Produktreihe entfernen . Keine Sorge, wir werden nach Abschluss des Updates eine Logik dafür schreiben . Denken Sie daran, ich füge hier einen Kommentar hinzu Überprüfen Sie den Zustand für Menge eins. Danach müssen wir die Produktmenge auf minus reduzieren , was eins entspricht. Auch für die Gesamtzahl der Produkte ist Minus gleich eins, und auch hier Gesamtpreis des Warenkorbs minus gleich, hier wird der Gesamtpreis abzüglich des Gesamtpreises berechnet. Dann speichern wir eine Karte und ändern diese Nachricht in „ Produktmenge erfolgreich verringern“. Jetzt müssen wir kaum noch Änderungen an dieser API vornehmen. Gehen wir zu unserem Kommentar über. Hier fügen wir Zustand, Produkte im Warenkorb, eckige Klammer, Indexmenge ist größer als Brötchen hinzu, dann verringern wir die Menge um eins Wir verschieben diese Zeile in den I-Block und danach müssen wir sonst das gesamte Produktobjekt entfernen , das in diesem Index verfügbar ist Um das Element aus dem Array in JavaScript zu entfernen, verwenden wir die Methode Plis Also Kartenpunktprodukte, Punkt Slic Index, was der Index ist, den wir entfernen möchten Und dann übergeben wir beim zweiten Argument eins, was bedeutet, dass wir nur ein Element entfernen wollen Durch diesen Ausdruck wird das gesamte Produktobjekt aus dem Produktarray entfernt. Jetzt ist hier eine Sache. Nachdem wir das gesamte Produktobjekt aus der Produktreihe entfernt haben, können wir diesen Gesamtpreis der Karte nicht diesen Gesamtpreis der Karte , da wir hier den Preis des Produkts benötigen. Also müssen wir so etwas tun. Kartengesamtpreis abzüglich des Produktpreises entspricht dem Punktpreis des Produkts. Diesen Produktpreis erhalten wir aus der Produktkollektion. In der erweiterten API ändern wir also diesen Kartenpunkt. Der Gesamtkartenpreis plus entspricht dem Produktpunktpreis. Der ursprüngliche Produktpreis wird also zur Gesamtsumme hinzugerechnet. Speichern Sie die Änderungen, lassen Sie uns diese API verwenden. Duplizieren Sie diese erweiterte Produkt-API und ändern Sie ihren Namen, um A zu verringern. Ändern Sie den API-Endpunkt auf Karte verringern und senden Sie die Anfrage. Siehst du, jetzt haben wir nur sieben iPhones. Verringern wir es noch zweimal. Siehst du, jetzt haben wir fünf iPhones und Gesamtzahl der Produkte und der Preis funktionieren auch So reduzieren wir die Menge des Produkts. 146. Einzelne Artikel aus dem Warenkorb entfernen: Auf unserer Kartenseite haben wir jetzt möglicherweise die Möglichkeit, das gesamte Produkt aus der Karte zu entfernen. Wir möchten die Produktmenge nicht nacheinander verringern . Definieren wir also die API zum Entfernen des Produkts von der Karte. Wir beginnen also mit Router-Punktseite, Endpunkt und Schrägstrich. Entfernen Sie die Spalte mit dem Schrägstrich, die Produkt-ID Außerdem benötigen wir aktuelle Benutzerdaten, also fügen wir Orth Middleware und dann eine Callback-Funktion mit Anfrage und dann eine Callback-Funktion mit Anfrage Jetzt gibt es sehr ähnliche Schritte wie bei unserer Down-API. Schauen wir uns die API an, was wir für das Remove-Produkt benötigen. Sehen Sie, wir brauchen zuerst ein Produkt und dann einen Einkaufswagen. Dann müssen wir auch den Index des Produkts finden, und wir benötigen auch diese Bedingung. Kopieren Sie diesen Code bis hierher und fügen Sie ihn in die Remove-API ein. Gehen Sie jetzt zurück zu API verringern, und wie wir sehen können, um das gesamte Produkt zu entfernen, benötigen wir nur diese Zeile. Wir kopieren das und fügen es in unsere API ein. Gut. Danach müssen wir die Gesamtzahl der Produkte im Warenkorb und den Warenkorbpreis im Warenkorb insgesamt aktualisieren . Lass uns eins nach dem anderen gehen. Warenkorb Punkt Summe der Produkte minus ist gleich, hier benötigen wir die Menge des Produkts , das wir im Produktobjekt haben. Angenommen, wir haben insgesamt sieben Produkte und wir haben vier iPhones in der Produktreihe. Wenn wir nun versuchen, die vollständigen Telefondaten aus dem Warenkorb zu entfernen, müssen wir für die Gesamtzahl der Produkte minus sieben minus vier gleich drei ergeben Wir müssen also die Menge finden, die in der Produktpalette verfügbar ist. Vor dieser Spleißmethode können wir also so etwas tun Die Gesamtzahl der Produkte im Warenkorb, minus, entspricht der Anzahl der Produkte im Warenkorb. Hier greifen wir auf das Produktobjekt zu, das wir entfernen möchten, eckige Klammern, Index, und dann erfassen wir die Menge dieses Produkts. Du hast es richtig erraten. Das Gleiche können wir für den CAT-Punkt tun . Der gesamte CAT-Preis minus entspricht den Produkten mit Kartenpunkten, eckigen Klammern, Anzahl der Indexpunkte in den Einkaufswagen in eckigen Klammern, Indexpunkt PCE Der Grund, warum wir am Ende das gesamte Produktobjekt entfernen, ist, dass, wenn wir das Objekt zuvor entfernt haben, wie können wir dann auf die Menge und den Preis des Produkts zugreifen Jetzt warten wir einfach auf Kartenpunkt C und danach antworten wir auf das Objekt Json mit der Nachricht, dass antworten wir auf das Objekt Json mit das Produkt erfolgreich entfernt wurde, und schicken auch die Karte mit. Bevor wir diese API testen, können wir dieser API noch eine weitere Bedingung hinzufügen. Stellen Sie sich also vor, wir haben nur ein Produkt im Warenkorb und wir entfernen dieses Produkt ebenfalls. Anstatt die leere Karte in der Datenbank zu speichern, ist es jetzt besser, die Karte für diesen Benutzer zu entfernen. Der Benutzer möchte einen neuen Artikel in den Warenkorb legen, dann haben wir in der Head-to-Cart-API bereits den Code für die Erstellung des neuen Einkaufswagens eingegeben. Wir können überprüfen , ob dieses Produkt das einzige Produkt im Warenkorb ist oder nicht. Hier können wir nach dieser Indexbedingung eine weitere If-Bedingung hinzufügen. Hier überprüfen wir, ob die Punktlänge der Produkte im Warenkorb gleich eins ist und ob die Punktlänge der Produkte in eckigen Klammern, Index, Produkt-ID der Produkt-ID entspricht, die wir aus den Perms erhalten Wenn diese Bedingung zutrifft, können wir die vollständige CAT entfernen Warten Sie also auf den CAT-Punkt „Fine By ID“ und DLT“ und geben Sie „ GAT-Punkt-Underscore-ID Dann kehren wir zurück, antworten, stellen sicher, dass wir hier Return hinzufügen Andernfalls wird auch der Bottom-Code ausgeführt. Stellen Sie also sicher, dass Sie hier return hinzufügen. Antwortpunkt Json-Objekt mit Nachrichteneigenschaft, Warenkorb wurde erfolgreich entfernt. Außerdem müssen Sie die Produkt-ID dieser Karte vom Punkt in eine Zeichenfolge umwandeln Produkt-ID dieser Karte vom Punkt in eine Zeichenfolge umwandeln Andernfalls funktioniert unser Zustand nicht, und das war's. Lassen Sie uns unsere Implementierung probieren, die Änderungen ansehen und Postman öffnen Duplizieren Sie diese API zur Reduzierung und ändern Sie ihren Namen, um das Produkt aus dem Warenkorb zu entfernen Gut. Lassen Sie uns nun den API-Endpunkt senden , um die Produkt-ID zu entfernen und die Anfrage zu senden Und weil wir nur ein Produkt in unserem Warenkorb haben, Warenkorb erfolgreich entfernt Wie Sie sehen, ist die Definition der API nicht so schwierig. Machen Sie einfach nacheinander Schritte, und wenn Sie verwirrt sind, schreiben Sie für jeden Schritt Kommentare , die viele Ihrer Zweifel ausräumen. 147. Auftragsmodell erstellen: Bevor wir das Zahlungsgateway hinzufügen, erstellen wir nun eine neue Bestellsammlung, in der die Informationen zu allen Bestellungen und deren Status gespeichert werden. Also erstellen wir im Modellordner eine neue Datei namens orders dot js. Gut. Zuallererst importieren wir Const Mangos, was dem Bedarf von Mangos entspricht Danach entspricht das Kostenordnungsschema dem Nu Mongoose-Punktschema Und hier definieren wir unser Sammlungsschema. Das wissen wir schon, oder? Wir haben das Schema viele Male erstellt. Jetzt benötigen wir in der Bestellsammlung alle Dinge, die wir zur Kartensammlung hinzugefügt haben. Also kopieren wir das vollständige Schema des Warenkorbs. In das Bestellschema fügen wir unser Schema ein. Wir haben Benutzer, die Produkte, die Gesamtzahl der Produkte und auch den Gesamtpreis der Karte bestellen . Jetzt fragen Sie sich vielleicht, warum wir diese Daten für alle Produkte benötigen? Wir benötigen diese Produktdaten, um die Historie der Benutzerbestellung zu speichern. Wenn der Benutzer sehen möchte , welche Produkte er zuvor bestellt hat, müssen wir ihm diese Produktliste zeigen. Karte und Bestellung sind also zwei verschiedene Dinge. In der Kartensammlung speichern wir alle Produkte, die der Benutzer kaufen möchte. Produkte auf der Karte können hinzugefügt, aktualisiert oder entfernt werden. Sobald der Benutzer jedoch auscheckt und die Zahlung tätigt, die Kartendaten in eine Bestellung umgewandelt, und wir entfernen diese Kartendaten aus der Kartensammlung. Bei der Erfassung von Bestellungen speichern wir Daten dauerhaft für abgeschlossene Transaktionen. Auf diese Weise können Benutzer ihre vorherigen Bestellungen einsehen. In dieser Sammlung müssen wir nun einige weitere Füllungen hinzufügen. Zuerst machen wir den Gesamtpreis der Karte zum Gesamtpreis. Als Nächstes benötigen wir die Zahlungs-ID, geben eine Zeichenfolge ein und müssen auf true gesetzt werden. Dies ist die ID der Zahlung. Wir werden diese ID vom Zahlungsgateway erhalten. Und anhand dieser ID können wir sehen, welche Zahlungsmethode der Benutzer für die Zahlung verwendet, UPI oder Karte oder Net Banking oder etwas anderes Als Nächstes muss der Zahlungsstatus auf Objekt und der Typ auf die Zeichenfolge gesetzt werden, um wahr zu sein Und in diesem Status können wir angeben, Zahlung bezahlt oder abgeschlossen ist. Als Nächstes benötigen wir die Lieferadresse, geben den Text in eine Zeichenfolge ein und müssen auf „true“ gesetzt werden. Da wir dies der Einfachheit halber unter den Gesamtpreis verschieben . Es spielt keine Rolle. Danach wollen wir den Bestellstatus, den Typ in die Zeichenfolge eingeben, und hier können wir mögliche Werte für dieses Feld hinzufügen, das Enum zu Array ist Der erste Wert kann ausstehend sein. Als Nächstes können wir die Bestellung bearbeiten, CB. Außerdem kann sie standardmäßig geliefert oder storniert werden Wir setzen unseren Bestellstatus auf ausstehend. Hier ist es nicht der Zahlungsstatus, der Bestellstatus. Als Nächstes können wir das Datum speichern, an dem der Benutzer diese Bestellung aufgegeben hat, und zwar als Objekttyp bis heute und als Standardwert auf Datum Punkt jetzt. Da wir das Datum haben wollen, an dem diese Bestellung geliefert wird, zwar am aktuellen Objekttyp. Im Moment sind diese Felder ausreichend. Wenn wir in Zukunft mehr Felder benötigen, können wir, wie wir wissen, dieser Sammlung problemlos Füllungen hinzufügen. Lassen Sie uns nun eine Sammlung erstellen. Die Kostenreihenfolge entspricht also dem Mongoose-Punktmodell. Hier übergeben wir einen singulären Namen, also Reihenfolge, und hier übergeben wir das Danach werden wir endlich das Modul Punktexporte so einstellen, dass Auftragserfassung entsprechen, und das war's 148. Workflow der Zahlungen: Zuvor haben wir die Kartenfunktionen hinzugefügt und aktualisiert . Wenn unser Benutzer nun die auf der Karte verfügbaren Dinge kaufen möchte , müssen wir die Zahlung in unsere Anwendung integrieren. Bevor wir uns also direkt mit dem Code befassen, wollen wir zunächst den gesamten Zahlungsablauf verstehen. Stellen Sie sich also vor, das ist unser Benutzer, Sie sehen sich die Produkte an, die zur Karte hinzugefügt wurden, und klicken Sie auf der Kartenseite auf die Schaltfläche „Zur Kasse“ oder „Bezahlen“. Schritt Nummer eins ist, dass wir mit diesem Knopfdruck unsere Checkout-API aufrufen , da wir wissen, dass wir unsere Kartendaten in unserer Datenbank haben, sodass wir den Gesamtpreis ihrer Karte erhalten. Außerdem können wir angeben, in welcher Währung sie bezahlen möchte. Im zweiten Schritt werden wir nun die Details, den Preis und die Währung an das Payment Gateway senden. Jetzt Schritt Nummer drei: Payment Gateway erstellt ein Zahlungsformular und zeigt es in ihrem Browser oder Telefon an. Schritt Nummer vier: Geben Sie ihre Zahlungsdetails wie Karte, UPI oder Brieftasche ein, die Sie verwenden möchten, geben Sie diese Daten in das Zahlungsformular ein und klicken Sie auf Bezahlen Denken Sie daran, dass die Zahlungsdaten der Benutzer an das Zahlungsgateway und nicht an das Backend weitergeleitet werden. Deshalb sind sie sicher Nun Schritt, Zahlungsgateway, die Zahlungsdetails an die Bank senden, Bank die Zahlungsdaten validieren. Wenn es wahr ist, gibt die Bank Erfolg zurück, und wenn es falsch ist oder unser Benutzer nicht über ein ausreichendes Guthaben verfügt oder etwas schief geht, Bank die Rückgabe fehl. Die Bank sendet also den Status „Erfolgreich “ oder „Fehlgeschlagen“ an das Payment Gateway. nun Schritt Nummer sechs, Zahlungsgateway, Senden Sie nun Schritt Nummer sechs, Zahlungsgateway, den Erfolgs- oder Fehlschlagsstatus an unser Backend. Wenn es erfolgreich ist, werden wir im Backend einige Aufgaben ausführen, die wir ausführen möchten, z. B. die Kartendaten zur Bestellabholung hinzufügen , den Zahlungsstatus auf bezahlt setzen oder alles, was wir tun möchten. Nachdem wir nun den gesamten Vorgang in Schritt 7 abgeschlossen haben, zeigen wir vom Backend aus, ob die Zahlung durch den Benutzer erfolgreich war oder die Zahlung fehlgeschlagen ist , so einfach ist das. Payment Gateway ist also wie ein Mittelsmann, der sich um sichere Zahlungen und Zahlungsmethoden kümmert und Geld direkt auf unser Konto überweist Mittlerweile gibt es viele Zahlungsgateways wie Stripe, Paper, Razor Pay und Aber diese drei sind top. Wie können wir nun entscheiden , welches Zahlungsgateway wir verwenden möchten? Wenn wir also ein globales Publikum ansprechen , ist Stripe eine gute Option , da es internationale Zahlungen und auch UPI ermöglicht Jetzt erlauben die Leute auch internationale Zahlungen, und Menschen sind auch eine gute Option Wenn unser Geschäft nun in Indien ansässig ist, ist Sorpay das Beste für uns Resorpay kann auch internationale Zahlungen abwickeln, ist jedoch nur für Unternehmen mit Sitz in Indien geeignet . In einfachen Worten, in einfachen Worten, das Unternehmen ist in Indien registriert und möchte auch Auslandsgeschäfte tätigen Für globale, internationale Unternehmen Gateways wie Stripe oder Paper möglicherweise die bessere Wahl In diesem Kurs werde ich Ihnen also zeigen, wie Sie beide für indische Unternehmen reserviert sind, und wenn Ihr Unternehmen außerhalb Indiens ansässig ist, werde ich Ihnen auch die Papierintegration zeigen Der Grund, warum ich Ihnen den Stripe nicht zeigen kann , ist, dass Stripe für Demos in einigen Ländern keine Konten zulässt, aber es spielt keine Rolle, welches Zahlungsgateway ich Ihnen zeige Wenn Sie die Logik des Zahlungsgateways verstehen, können Sie jedes Zahlungsgateway selbst anwenden Und das ist mein Hauptaugenmerk. Also sieh dir einfach diese Lektionen an. Ich werde die Logik hinter dem Zahlungsgateway klären. 149. Implementierung des Razorpay Payment Gateways: Lassen Sie uns den Lebenslauf für unsere Cardwig-Node-Anwendung einrichten. Wir werden Zahlungen wie diese erstellen und probieren . Es wird Spaß machen. Wenn Sie sich außerhalb Indiens befinden, können Sie diese Lektion auch überspringen, da Sie sich nur dann erneut registrieren können, wenn Sie sich in Indien befinden oder Ihr Unternehmen in Indien registriert Nach dieser Lektion werden wir eine Zahlung in Papierform vornehmen, der jeder Benutzer in einem Land ein Konto erstellen kann Lassen Sie uns nun grob sehen, wie diese Zahlung funktionieren wird. Wenn der Benutzer also auf die PayNW-Schaltfläche klickt, ruft das Frontend eine API auf. Lass uns auschecken. In dieser API werden wir eine Bestellung für AserPay erstellen, indem wir einige Informationen zu unserer Zahlung angeben wie viel Betrag wir vom Benutzer einziehen möchten und in welcher Währung wir die Zahlung annehmen möchten Wenn RSR PE nun diese Informationen erhält, generiert es eine Bestellung, bei der es sich das Informationsobjekt mit einer eindeutigen Objekt-ID Und dann müssen wir diese Objekt-ID an das Frontend übergeben. Das ist die Arbeit der ersten API. Wenn das Frontend nun die Objekt-ID erhält, öffnet das Frontend das SOR-IP-Zahlungsfenster. Übergeben Sie die Objekt-ID und einige Details. Jetzt fragen Sie sich vielleicht, warum wir die Objekt-ID übergeben müssen. Anhand dieser Objekt-ID erhält nur der Benutzer PA die Information über die Zahlung Es hilft uns auch bei der Zahlungsüberprüfung und bietet viele weitere Vorteile Jetzt gibt der Benutzer die Zahlungsdetails ein und klickt auf Jetzt bezahlen. Wenn dies eine erfolgreiche Zahlung ist, generiert Reser Pay eine eindeutige Signatur-Zahlungs-ID Anschließend rufen wir unsere zweite API auf, die unsere Zahlung verifiziert In der zweiten API überprüfen wir die Zahlung. Grund, warum wir es überprüfen müssen , weil diese API vom Frontend aus aufruft. Jeder kann diese Informationen leicht manipulieren und die Zahlung erfolgreich durchführen. Daher werden wir die Zahlung auf sehr sichere Weise überprüfen, was wir auch in dieser Lektion implementieren werden. Erst nach dem Verifizierungsprozess, wenn dieser erfolgreich ist, erstellen wir eine neue Bestellung in unserer Bestellsammlung und entfernen dann diese Benutzerkarte. Stellen Sie sich Sorpay wie einen Kinokartenschalter vor. Bei API One gehen Sie zum Schalter, das ist Razor Pay, sagen ihnen, welchen Film Sie sehen möchten , indem Sie ihnen Betrag und Währung mitteilen, und dann geben sie Ihnen ein Ticket , eine eindeutige Bestell-ID Bei API zwei schauen Sie sich den Film an, nachdem Sie das Ticket dem Sicherheitspersonal gezeigt haben. Der Schalter überprüft, ob das Ticket korrekt verwendet wurde, und aktualisiert die Aufzeichnungen Für Razor Pay im Backend müssen wir also zwei APIs erstellen Erstens für die Erstellung einer Razor Pay-Bestellung und die zweite API für die Überprüfung der Zahlung von Wenn wir die Zahlung erfolgreich verifiziert , erstellen wir danach im letzten Schritt eine neue Bestellung in der Bestellsammlung und entfernen unsere Karte Beginnen wir nun mit der Erstellung der ersten API , mit der Benutzer Pay-Order erstellen können. Im Routenordner erstellen Sie eine neue Datei mit dem Namen orders dot gs. Um den Router schnell hinzuzufügen, öffnen wir die Kartenroute-Datei, verschieben diese Router-Zeile nach oben und kopieren diese ersten beiden Zeilen. In unserer JS-Datei mit dem Punkt für Bestellungen fügen wir sie hier ein. Jetzt unten müssen wir das Modul Dot Ports ausführen, das dem Router entspricht. Sehen wir uns nun diesen Router in der Indexpunkt-JS-Datei an. Also oben, const, order, ist Rowe gleich require Hier gehen wir zum Routenordner und zu den Bestellungen. Und unten, nach den Kartenrouten, fügen wir den Schrägstrich „app.us“ -API-Slash Order hinzu und geben hier Order und geben Gut. Jetzt können wir uns auf die Erstellung von APIs konzentrieren. Also Router Punkt Post, Zeiger auf Slash Checkout Außerdem benötigen wir eine Motten-Middleware weil wir wollen, dass nur angemeldete Benutzer auschecken können und wir endlich eine Rückruffunktion mit Hier in dieser API wollen wir eine Benutzerzahlungsanweisung erstellen Und dafür benötigen wir eine Ser Pay-Instance. Also installieren wir im Terminal das Reser Pay-Paket, NPM installiert Ser Pay zum Tarif 2.9 0.5, 2.9 0.5, was die neueste Version ist während ich diese Ergebnisse aufnehme Gut. Jetzt oben geben wir die Kosten ein, Ser P entspricht Require Ser P. Können Sie mir sagen, warum ich diesen Großbuchstaben gebe? Stimmt, weil es Klasse ist. Jetzt erstellen wir in unserer API Cast Reserp Instance, erstellen wir in unserer API Cast Reserp Instance New Reserp entspricht. Darin müssen wir ein Objekt mit zwei Eigenschaften übergeben Der Schlüssel unterstreicht die ID. Dies ist die Schlüssel-ID unserer Reser Pay App. In unserer Anwendung speichern wir diesen Schlüssel in der DOT-ENV-Datei, da wir ihn geheim halten müssen Also verarbeiten Sie dot nv dot reser py underscore-key underscore-ID Keine Sorge, wir werden sie in einiger Zeit definieren. Nach der Schlüssel-ID benötigen wir den Schlüssel Underscore Secret, um Punkt NV Punkt Ser Pay, Unterstrich, Schlüssel, Unterstrich geheim zu verarbeiten Unterstrich, Schlüssel, Unterstrich Lassen Sie uns nun diese beiden Variablen in der DOT-ENV-Datei festlegen. Sor pay, underscore, key, underscore-ID ist gleichbedeutend damit, das Feld leer zu lassen Und als nächstes reserpUserScore, Schlüssel, Unterstrich geheim . Wir werden sie hinzufügen, wenn wir ein Resorpay-Konto erstellen. Lassen Sie uns vorerst unsere Checkout-API vervollständigen und danach werden wir ein Reser-Pay-Konto erstellen Nachdem wir die Instanz erstellt haben, können wir eine Bestellung erstellen. Die Reihenfolge der Kosten entspricht „Warten“, „ Reserpy “, „Instanz, Punkt“, „ Bestellungen“, Punkt „Erstelle Hier müssen wir das Optionsobjekt für diese Bestellung übergeben Der erste ist der Betrag. Nehmen wir an, wir übergeben hier 500. Danach müssen wir Währungseigentum weitergeben. Dadurch wird angegeben , in welcher Währung wir die Zahlung vornehmen möchten. Nehmen wir an, wir wollen in der indischen Rupie zahlen, dann geben wir hier INR weiter, und wenn wir in US-Dollar zahlen wollen, dann geben wir hier USD Stellen Sie jedoch sicher, dass, wenn Sie eine andere Landeswährung verwenden, Ihres Reservekontos interne Zahlung Ihres Reservekontos aktiv sein sollte Vorerst geben wir einfach INR weiter. Und zuletzt müssen wir den Unique Receip übergeben. Das ist als Namensschild für die Bestellung. Es hat keinen Einfluss auf die Zahlung, hilft aber Entwicklern oder Unternehmen zu erkennen, um welche Bestellung es sich handelt. Wenn wir beispielsweise mehrere Bestellungen haben, können wir diese Beleg-ID verwenden, um eine bestimmte Bestellung im RSR Pi-Dashboard oder in unserer Datenbank zu finden eine bestimmte Bestellung im RSR Pi-Dashboard oder in unserer Datenbank Also geben wir hier die eingegangenen Backticks weiter, unterstreichen die Dollar-Kalibackets, das Datum und jetzt den Punkt, um eindeutige Belege zu generieren. Das war's Das wird für Ordnung bei uns sorgen. Hier geben wir einfach den Antwortpunkt Json zurück , hier übergeben wir ein Objekt mit wenigen Eigenschaften. Erstens, Erfolg wird wahr, was bedeutet, dass wir erfolgreich Ordnung schaffen. Zweitens, Auftrags-ID zu Bestellpunkt-ID. Nächster Betrag zur Bestellung Punktbetrag und Währung zur Bestellpunktwährung. Das war's für die erste API. Dies ist nicht die endgültige API, wir werden sie später verbessern. Bevor wir diese API testen, erstellen wir auch eine zweite API, damit Sie beim Testen nicht verwirrt werden. Ich weiß, dass Sie viele Fragen haben, aber machen Sie sich keine Sorgen, am Ende dieser Lektion wird alles klar sein. Nach dieser API erstellen wir eine neue Post-API und verweisen auf Slash-Payment . Außerdem benötigen wir OS-Middleware für diese API und endlich ASN-Funktion mit In dieser API benötigen wir nun drei Dinge aus dem Das zweite Objekt entspricht dem Hauptteil der Anfrage. erste ist Ser Pay, Underscore Order, Underscore-ID Als Nächstes zahlen die Benutzer, unterstreichen die Zahlung, unterstreichen die ID und die letzte Mit Hilfe dieser Bestell- und Zahlungs-ID müssen wir eine Art von Signatur erstellen Wenn diese Signatur und der Unterstrich des Benutzers identisch sind, wenn wir davon ausgehen unsere Zahlung verifiziert ist. Lass dich nicht verwirren Es ist wirklich einfach. Secst generierte Signatur entspricht hier, wir müssen ein eingebautes NodeJS-Modul verwenden , das Oben importieren wir, dass Const-Krypto der erforderlichen Krypto entspricht Unten in unserer zweiten API erstellen Sie den Kryptopunkt HMAC. Dies ist die Nojs-Methode zum Erstellen eines Basisnachrichten-Authentifizierungscodes , HMAC Beim ersten Parameter müssen wir nun den Algorithmus für die Erstellung des HMAC schreiben , also 256. Beim zweiten Parameter müssen wir Resorp Secret übergeben Also verarbeiten Sie Punkt Env Punkt resorpUnderscore, K, underscore secret Nachdem wir die HMAC-Methode erstellt haben, fügen wir nun eine weitere Methode hinzu, wir Dazu werden die Daten benötigt, die wir haben möchten. Hier geben wir Zecken zurück, Dollar in Cali-Paketen, setzen p underscore, order, underscore-ID Hier fügen wir das Barsymbol, den Dollar, die Cully-Pakete, den Sortierstift, den Unterstrich, die Zahlung und die Unterstrich-ID Danach fügen wir eine weitere Methode hinzu, Punkt Digest, und hier übergeben wir X. Ich habe diesen Code aus der Sie können die Dokumentation für weitere Details lesen. Dieser Code generiert eine Signatur. Jetzt können wir es mit dieser Reser-Underscore-Signatur vergleichen dieser Reser-Underscore-Signatur Wenn die generierte Signatur nicht der User-Pay-Underscore-Signatur entspricht Wenn sie nicht identisch sind, geben wir hier den Antwortstatus, 400-Punkt-GSN mit Objekt, 400-Punkt-GSN mit Objekt, Erfolg auf Falsch und Nachricht auf ungültige Zahlungssignatur zurück Danach antworten wir einfach auf „ dot json success“ auf true“ und „message to payment successfully successfully“ . Wenn also jemand vom Frontend aus eine gefälschte Bestell - oder Zahlungs-ID weitergibt, können wir dies durch diesen Vorgang überprüfen Wenn die Zahlung nicht verifiziert wurde, senden wir eine Antwort mit einer ausgefüllten Nachricht zurück. Und wenn es verifiziert ist, geben wir eine Antwort mit einer Erfolgsmeldung zurück. Das ist also kein vollständiger Code. Wir werden es nach der Verkostung aktualisieren. Bevor wir diese API testen können, benötigen wir nun die Schlüssel-ID und das Schlüsselgeheimnis von Reser Pay Denken Sie daran, dass wir leere Variablen in der Dart-NV-Datei belassen. Lassen Sie uns ein Konto von Ser Pay erstellen und diese Schlüssel-ID und den geheimen Schlüssel generieren Diese sind der ID und dem geheimen Schlüssel sehr ähnlich, die wir bei der Implementierung der Google- und Facebook-Authentifizierung generiert haben Implementierung der Google- und Facebook-Authentifizierung generiert . Gehen Sie zur Website reserp.com. Und wie Sie hier sehen können, bieten wir nur die Option Indien, Malaysia und Singapur an, was bedeutet, dass nur diese Unternehmen mit Sitz in den jeweiligen Ländern Zahlungen anbieten können Wir können aber auch Zahlungen aus jedem Land akzeptieren. Also melde dich bei glicon an und gib deine E-Mail-Adresse Dann erstelle ein Passwort. Stellen Sie sicher, dass Sie diesen Passwortmustern folgen, und klicken Sie auf Weiter. Dadurch wird OTP an E-Mail gesendet, also füge ich hier schnell das OTP hinzu und klicke auf Überprüfen Nun, hier ist die Sache. Wählen Sie das Land aus, Ihr Unternehmen gegründet wurde, nämlich Indien. Kann weitermachen, und jetzt müssen wir noch ein paar Schritte befolgen. Offensichtlich akzeptieren wir die Zahlung. Einrichtung ist nicht einfach, da wir eine andere Website-API aufrufen. Wir müssen unsere Daten angeben. Außerdem können diese Zahlungsplattformen ihre Benutzeroberfläche sehr oft ändern. Wenn Sie also in Zukunft nicht die gleiche Oberfläche wie ich bekommen, dann lassen Sie sich nicht verwirren. Geben Sie einfach die gewünschten Informationen an und erstellen Sie ein Konto bei Reser Pay Nachdem wir ein Konto erstellt haben, können wir die Schlüssel-ID und das Schlüsselgeheimnis erstellen Hier wird gefragt, wo möchten Sie Zahlungen akzeptieren? Wählen Sie vorerst online und beginnen Sie mit dem Boarding. Nun, als Nächstes, wo zahlen Ihre Kunden? Wenn Ihre Kunden aus Indien kommen, wählen Sie Indien aus. Aber hier wähle ich außerhalb Indiens und beginne mit dem Boarding. Es wird einige Zeit dauern. Jetzt schreiben wir unseren Namen. Stellen Sie sicher, dass Sie Ihren offiziellen Namen schreiben. Fahren Sie fort. Überprüfen Sie als Nächstes Ihre Kontaktdaten, Sie Ihre Handynummer und es wird ODP gesendet, schreiben Sie dieses ODP und klicken Sie auf Akzeptieren Sie jetzt die Zahlung hier, die ich auf meiner Website auswähle. Wenn Sie eine App oder etwas anderes möchten, können Sie sie auch auswählen und fortfahren. Hier müssen wir unseren Website-Link hinzufügen. Außerdem zahlt der Benutzer, um diese Website zu verifizieren. Ist es legal oder nicht? Also, wenn Sie Ihre Website haben, fügen Sie sie hier hinzu. Im Moment habe ich noch keine, also klicken Sie auf Brief hinzufügen und Brief hinzufügen. Wählen Sie nun Ihren Geschäftstyp aus. Ich wähle unregistriert aus. Wenn du die Geschäftsart „ Nicht registriertes Unternehmen“ auswählst, kannst du außerdem keine internationalen Zahlungen im Live-Modus akzeptieren internationalen Zahlungen im Live-Modus Dafür benötigen Sie ein registriertes Unternehmen. Derzeit haben wir kein registriertes Unternehmen, aber wenn Sie es getan haben, wählen Sie „Registriert“. Machen Sie sich auch keine Sorgen, wenn Sie internationale Zahlungen akzeptieren. Wir müssen keine zusätzliche Arbeit leisten. Wir benötigen nur ein registriertes Unternehmen und Reserpy ermöglicht es Ihnen , internationale Zahlungen zu akzeptieren Fügen Sie nun Ihre persönliche PAN-Nummer hinzu, die wir alle hier bearbeitet haben, und klicken Sie auf Weiter Hier erhalte ich eine Fehlermeldung in meinem Namen, also schreibe ich meinen offiziellen Namen , den ich auf der Pun-Karte habe, und fahre fort Laden Sie nun Ihre persönliche PN-Karte hoch, wählen Sie Ihr Dokument aus, laden Sie es hoch, wählen Sie es aus und öffnen Sie es Es wird einige Zeit dauern. Und mach weiter. Jetzt schlagen sie vor, dass wir das QIC abschließen. Wählen Sie Ihre Geschäftskategorie, ich wähle Ihre Ausbildung Wenn Sie eine andere Kategorie haben, wählen Sie entsprechend aus. Wählen Sie als Nächstes Ihre Unterkategorie aus und wählen Sie aus, was Sie möchten. Als Nächstes, was ist Ihr Geschäftsmodell? Wählen Sie dies auch entsprechend Ihren Bedürfnissen aus und fahren Sie fort. Danach müssen wir Bankdaten hinzufügen. Hier benötigen wir die Kontonummer und den IFSE-Code Ihrer Kontofiliale Beides bekommst du in dein Sparbuch. Vergewissern Sie sich, dass die Kontonummer angeben, unter der Sie Zahlungen akzeptieren möchten Ich fülle diese Daten aus und klicke auf Weiter. Es wird diese Angaben überprüfen. Und fertig. Als Nächstes müssen wir den Verwendungscode auswählen. Lassen Sie mich versuchen, direkt fortzufahren. Es gibt einen Fehler. Wir müssen den Verwendungscode auswählen. Wir können es nach der Gruppe suchen. Aber zum Testen wähle ich einfach diesen p00 14 aus und fahre fort Haben Sie als Nächstes einen Importeur-Exporter-Code? Nein, ich habe die Bedingungen nicht akzeptiert und auf Weiter geklickt. Jetzt ist es Zeit für Geschäftspolitik. Hier stellen sie viele wichtige Fragen wie Stornierungs- und Rückerstattungszeit. Ich wähle diese bis sieben Tage aus, Sie können je nach Bedarf Bearbeitungszeit für Rückerstattungen auf drei bis fünf Tage wählen, was gut ist, aber aus Sicherheitsgründen neun bis 15 Tage. Außerdem beträgt die Übersprungszeit acht bis 14 Tage. Jetzt müssen wir auch die Support-Kontaktnummer angeben. Ich versuche auch, das zu überspringen, aber es gibt einen Fehler. Also schreibe ich meine Nummer und auch meine E-Mail-Adresse und klicke auf Richtlinienseiten erstellen. Hier seht ihr Seiten, klickt auf Weiter. Hier haben wir Links zu Richtlinien. Fahren Sie fort. Reichen Sie Ihre Bewerbung ein. Hier versuche ich, den Video-KYC-Prozess abzuschließen, aber hier erhalte ich eine Fehlermeldung, also versuche ich es mehrmals, aber es passiert nichts Ich beschließe, das zu überspringen. Ich schließe alle Seiten und versuche serpy.com zu öffnen. Und versuche mich mit dem Konto anzumelden, das ich gerade erstellt habe, aber es wird geladen und geladen Öffnen Sie also das Inkognito-Fenster und öffnen Sie erp.com. Wenn Ihnen der Login gefällt, geben Sie die E-Mail-Adresse ein, fahren Sie fort und geben Sie fort Gut. Hier bekommen wir das SRP-Dashboard Im Moment sind wir im Geschmacksmodus. Wir können es von hier aus ändern, aber ändern Sie es vorerst nicht. Um nun den ApiKey zu erhalten, gehen wir zur Konto - und Einstellungsoption Und hier, in der Website - und App-Einstellung, suchen wir nach API-Schlüsseln und generieren den Taste-Schlüssel Er sendet uns ein OTP, schreibt das OTP und klickt einfach auf Siehst du, hier bekommen wir die Schlüssel-ID und das Schlüsselgeheimnis. Jetzt kopieren wir zuerst die Schlüssel-ID zurück in den VS-Code und fügen in die ENV-Datei die Schlüssel-ID für diese Variable Kopieren Sie erneut den geheimen Schlüssel und fügen Sie ihn in die geheime ANV-Variable der Datei Speichern Sie diese Datei, und auf der Website können Sie einfach auf Zur Sicherung herunterladen klicken Lassen Sie uns nun unsere beiden APIs testen. Es funktioniert oder nicht. Wie wir wissen, benötigen wir ein Frontend, um diese APIs auszuprobieren, da wir im Frontend die RSRPepayment-Seite öffnen werden Also habe ich hier eine einfache SDML-Seite namens RSRPFront End Template Dot SGML erstellt eine einfache SDML-Seite namens RSRPFront End Template Dot SGML RSRPFront Diese Seite finden Sie unter dieser Lektion ist auch im Ordner Resources project to verfügbar . Sie ist auch im Ordner Resources project to verfügbar. Laden Sie es herunter und machen Sie es einfach in Ihrem aktuellen Projekt. Lassen Sie uns nun diese STML-Datei ausführen. Klicken Sie also mit der rechten Maustaste darauf und klicken Sie auf Pfad kopieren. Platzieren Sie diesen Pfad in Ihrem Browser. Siehst du, hier bekommen wir den Titel und eine einfache Schaltfläche. Wenn Sie sehen möchten, was passiert ist, als wir auf diese Schaltfläche klicken, dann können Sie sich die STML-Datei ansehen, es ist wirklich einfach Lassen Sie mich Ihnen auch zeigen, dass wir einige Werte ändern müssen Also habe ich hier unten, im Skript-Tag, eine Variable hinzugefügt, die Sie für Ihre Daten übergeben können. Zuerst haben wir den Order Endpoint , der der Endpunkt unserer ersten API ist. Und zweitens haben wir einen Verifizierungsendpunkt. Sie haben verschiedene Endpunkte, dann können Sie sie entsprechend Ihrem Endpunkt ersetzen Als Nächstes haben wir die Lieferadresse. Hier kannst du deine Adresse schreiben. Danach die Benutzerwährung, die ich auf INR eingestellt habe, aber Sie können auch USD oder Euro usw. angeben, wenn Ihre Benutzerzahlung internationale Zahlungen aktiviert hat Danach haben wir die SRP-Schlüssel-ID. Hier müssen Sie Ihre Schlüssel-ID schreiben. Ich kopiere meine Schlüssel-ID aus der ENV-Datei und füge sie hier ein. Stellen Sie sicher, dass Sie Ihre eigene Schlüssel-ID schreiben. Andernfalls wird das nicht funktionieren. Als nächstes haben wir Togon. Hier müssen Sie Ihr JWT-Token weitergeben. Derzeit haben wir in unserer Anwendung nur eine Ablaufzeit von 2 Stunden festgelegt, was beim Verkosten wenig nervig ist Weil wir immer wieder JWT-Token erstellen müssen. So können wir das Ablaufdatum aus dem Login entfernen und in der Endphase des Projekts einfach das Ablaufdatum hinzufügen Öffnen Sie Benutzerrouten und unten entfernen wir dieses Objekt mit abgelaufener Eigenschaft. Lassen Sie uns nun ein Token generieren , das nie abgelaufen ist. Öffnen Sie Postman und öffnen Sie die Login-API und senden Sie einfach die Anfrage Hier kopieren wir dieses Token und fügen es in die SDML-Datei einfach Als Nächstes habe ich dieses On-Click-Event für diesen Pay-Button hinzugefügt. In diesem Fall rufen wir zunächst diese Bestell-API mithilfe der rufen wir zunächst diese Bestell-API mithilfe Abruf-Methode und mit diesem Token Wie wir aus der Bestell-API wissen, erhalten wir die Bestelldaten. Das bekommen wir hier. Wenn die Daten nicht erfolgreich sind, zeigen wir eine Warnung mit einer Fehlernachricht an. Was ist nun, wenn wir den Reser-Pay-Auftrag erfolgreich vom Backend erhalten Reser-Pay-Auftrag erfolgreich vom Backend Dann öffnen wir das Resorb-Zahlungsfenster. Hier, vom Frontend aus, müssen wir diese Optionen mit Vorbehalt bestehen. Siehst du, hier haben wir den Schlüsselbetrag, die Währung, den Namen, die Bestell-ID und endlich haben wir den Handler Dieser Handler ist wirklich wichtig, und das ist eine Funktion. RSR P führt diese Handler-Funktion aus, wenn der Benutzer richtigen Informationen eingibt und die Zahlung erfolgreich abgeschlossen wurde Nach einer erfolgreichen Zahlung rufen wir also unsere zweite API auf, um die Zahlung zu überprüfen Wenn diese Überprüfung erfolgreich ist, zeigen wir eine Erfolgsmeldung an, und wenn sie fehlschlägt, zeigen wir einen Feldfehler an. Und zum Schluss erstellen wir zum Öffnen von Resorpe eine neue Reserp-Instanz und übergeben hier ganze Optionen Dann öffnen wir einfach mit Reserp Dot Open die ReserpPayment-Seite Endlich haben wir dieses Zahlungspunktfeld, das ausgeführt wird, wenn der Benutzer falsche Zahlungsdetails eingibt oder wenn er nicht über ein ausreichendes Guthaben verfügt. Dann ist diese Funktion ganz dieses Zahlungspunktfeld, das ausgeführt wird, wenn der Benutzer falsche Zahlungsdetails eingibt oder wenn er nicht über ein ausreichendes Guthaben verfügt Dann ist diese Funktion Lassen Sie uns jetzt einfach unsere Implementierung probieren. Ich freue mich sehr darüber. Speichern Sie diese Datei und kehren Sie zu unserem Browser zurück, aktualisieren Sie die Seite und klicken Sie einfach auf die Schaltfläche Taste Payment. Es passiert, das ist nicht fair. Lass uns nachschauen, was passiert. Bei der Überprüfung mit F 12 hier in der Konsole können wir sehen, dass wir eine Fehlermeldung erhalten Zugriff auf die FechTo-Checkout-API von Origin Null wurde durch die Kursrichtlinie blockiert Dies ist ein sehr beliebter Fehler bei Full-Stack-Entwicklern. Das passiert, weil unsere Express-Anwendung standardmäßig keine API-Aufrufe von irgendeinem Ursprung annehmen kann . Sie müssen den Kurs in unserer Express-App aktivieren. Also zurück zum VS-Code, öffne ein neues Terminal und schreibe, NPM install course und drücke Enter Jetzt importieren wir in der JS-Datei mit dem Indexpunkt oben die Kosten, der Kurs entspricht dem Kurs, der erforderlich ist Dann unten, vor diesem Express-Punkt JS und in der Mitte, wo wir den App-Punkt Ug hinzufügen App-Punkt Ug hinzufügen rufen wir diese Kursfunktion auf, und das war's. Speichern Sie die Änderungen und stellen Sie sicher, dass unser Server läuft. Gut. Aktualisieren Sie nun die Seite und klicken wir erneut auf die Zahlungsschaltfläche. Sehen Sie, das RSR P-Zahlungsfenster ist da. Hier finden wir diese Arten von Zahlungsmethoden wie Karten, Netbanking, Brieftasche, Rechnungsbrief usw. Ich denke, UPI ist nicht hier, weil mein Geschäft nicht verifiziert ist Jetzt sehen wir auf der linken Seite die Preisübersicht, das sind fünf Rupien im Backend. Wenn wir 500 überschreiten, das sind fünf Rupien im Backend. Wenn wir 500 überschreiten, bekommen wir Pi-Rupie Warum? Bei dem eingefüllten Betrag müssen wir also den Betrag in der kleinsten Einheit der Währung weitergeben . Und was die kleinste Einheit in unserem Land ist, PSA, was 100 PSA entspricht, entspricht einer Und hier übergeben wir 500 PSA, was in Pi-Rupie umgerechnet Wenn wir das also auf, sagen wir, 50.000 ändern, speichern Sie die Änderungen und aktualisieren Sie die Seite Und wenn wir noch einmal auf die Zahlungsschaltfläche klicken, sehen Sie, hier bekommen wir 500 Rupien Vergewissern Sie sich also über die Höhe der Zahlung. diesem Grund habe ich diese Frontend-Vorlage erstellt, damit Sie den gesamten Prozess sehr klar verstehen können. Außerdem können wir oben rechts sehen, dass wir uns im Verkostungsmodus befinden, da wir die Schlüssel-ID und das Schlüsselgeheimnis für den Verkostungsmodus erstellt haben . Lassen Sie uns nun die Bezahlung probieren. Um die Bezahlung zu probieren, gehen wir zuerst zu den Karten. Hier gibt Ser Pay zur Verkostung einige Kartendetails an. Außerdem haben sie alle Einzelheiten zur Dokumentation angegeben. Ich werde Ihnen diesen Seitenlink auf der rechten Seite unten in dieser Lektion geben. Also hier gehen wir zu den Karten. Lassen Sie uns die indische Karte testen, diese Kartennummer kopieren und sie auf unserer Seite hier einfügen. Geben Sie hier ein beliebiges zukünftiges Verfallsdatum ein, wie 12 Schrägstrich 30 und die CVV-Nummer, lassen Sie uns 111 übergeben, die Zahlung vornehmen, die Karte sichern, vielleicht später Es wird verarbeitet und welches Szenario wir zuerst testen wollen, Erfolg oder Misserfolg, entscheiden wir uns für den Misserfolg. Es wird geladen. Und sehen Sie, die Zahlung ist fehlgeschlagen, und wir erhalten auch die Warnung, dass die Zahlung fehlgeschlagen ist. Versuchen wir es jetzt mit Erfolg. bei dieser Kartennummer erneut nach, ob sie geladen wird, und wählen Sie Erfolg aus. Und hier bekommen wir diese wunderschöne Animation, und dann ist die Zahlung erfolgreich. Außerdem erhalten wir hier eine erfolgreich verifizierte Zahlung, die wir von unserer zweiten API erhalten. Unsere beiden APIs funktionieren also gut. Wenn Sie eine andere Zahlungsmethode ausprobieren möchten, können Sie das auch tun. Schauen Sie einfach in der Dokumentation nach dieser Testmethode nach. Lassen Sie uns jetzt unsere API für den echten Gebrauch aktualisieren. Wie wir wissen, funktioniert unsere Zahlung. Jetzt können wir unsere APIs verbessern und sie realistisch gestalten. Es ist wirklich einfach. Lass es mich dir zeigen. Was möchtest du also an der Bestell-API ändern? Erstens, derzeit geben wir hier einen statischen Betrag weiter, aber das ist nicht richtig. Wir müssen den Gesamtpreis der Karte des Benutzers weitergeben. Zweitens geben wir auch Ihre Währungs-ID weiter, aber der Benutzer kann entscheiden, in welcher Währung er bezahlen möchte. Wir wollen also nur diese beiden Änderungen vornehmen. Fangen wir damit an, den Betrag von der Karte abzubuchen. Vor dieser Reser-Instanz schreiben wir also const, cart und await cart C, autoiput Also oben, Kosten, Warenkorb ist gleich erforderlich, wir gehen einen Ordner nach oben und dann in den Einkaufswagen Jetzt in unserem API-Warenkorb Punkt Fine eins, und hier im Objekt übergeben wir die Punkt-Unterstrich-ID von Benutzer zu Benutzer mit Punkt und Unterstrich Jetzt wird das Warenkorb-Objekt zurückgegeben, aber wir müssen die Bedingung erfüllen, wenn CAT nicht verfügbar ist oder die Punktlänge der CAT-Punkt-Produkte gleich Null ist Dann geben wir die Antwort mit dem Status 404 Punkt JCN-Nachricht an CRT not found zurück Status 404 Punkt JCN-Nachricht an CRT An der Stelle dieses Betrags müssen wir nun den gesamten CRT-Preis des Einkaufswagens auf Hundert umrechnen, da wir den Betrag in der kleinsten Einheit der Währung weitergeben müssen Betrag in der kleinsten Einheit der Währung weitergeben Lassen Sie uns das probieren, speichern Sie die Änderungen, aktualisieren Sie die Seite und klicken Sie auf Taste Payment Wenn wir die Konsole überprüfen, sehen Sie, hier bekommen wir eine Fehlermeldung. Es ist der 404-Fehler, was bedeutet, dass die Karte nicht gefunden wurde. Oh, denken Sie daran, dass wir in der Lektion „Warenkorb entfernen“ den Einkaufswagen entfernen, indem das letzte Produkt aus der Produktreihe Wir müssen also ein Produkt in unseren Warenkorb legen, zu Postman gehen und die Einkaufswagen-API öffnen Hier müssen wir Togan aktualisieren, es aus der Login-API kopieren und in den Autorisierungsheader einfügen Gut. Senden Sie jetzt die Anfrage, Produkt hinzugefügt. Es ist iPhone, nett. jetzt zum Browser zurück und aktualisieren Sie die Seite und probieren Sie erneut die Zahlung aus. Siehst du, hier bekommen wir unseren Kartenpreis. Wie wir wissen, speichern wir jetzt in der Datenbank alle Produktpreise in US-Dollar, und deshalb bekommen wir zwei iPhones zu diesem Preis Wenn Sie jedoch Razor Pay verwenden, wird Ihr Unternehmen in Indien angesiedelt sein und Ihre Zielnutzer werden höchstwahrscheinlich auch Inder sein In diesem Fall müssen Sie also in der Datenbank den Preis in der indischen Währung speichern Nehmen wir nun an, Sie möchten eine globale Zielgruppe ansprechen und speichern den Preis in US-Dollar. In diesem Fall müssen Sie den Dollarpreis in indische Währung umrechnen und ihn dann in der Höhe weitergeben . Lassen Sie mich Ihnen zeigen, wie wir das machen können. Für die Umrechnung des Dollarwerts in die indische Währung benötigen wir also in die indische Währung den aktuellen Wechselkurs. Wir können uns nicht auf den statischen Wechselkurs verlassen. Wir werden also eine API aufrufen um den genauen Wechselkurs zu ermitteln. Gehen Sie also zu Groom und suchen Sie nach dem Wechselkurs api.com. Dies ist die beliebte Wechselkurs-API. Um den Wechselkurs zu ermitteln, benötigen wir dafür einen API-Schlüssel. Also geben wir hier unsere E-Mail-Adresse ein und klicken einfach auf GetFree Key Hier müssen wir ein Passwort erstellen, die Bedingungen akzeptieren und ApiKey generieren . Was ist das? Schließen Sie die Überprüfung ab und Sie erhalten dann den API-Aktivierungsschlüssel per E-Mail. Öffnen Sie diesen Link und hier erhalten wir den API-Schlüssel. Wir können sehen, dass wir 1.500 Umtauschanfragen senden können. Wenn Sie mehr Anfragen erhalten möchten, müssen Sie dafür bezahlen. So funktionieren alle Wechselkurs-APIs. Machen Sie sich darüber vorerst keine Sorgen. Kopieren Sie einfach diesen Schlüssel und in unserer ENV-Datei fügen wir die API für die Wechselkursbewertung Unterstrich-Schlüssel entspricht dem Einfügen Ihres API-Schlüssels Speichern Sie diese Datei und kehren Sie zur Wechselkursseite zurück. Hier müssen wir die API finden, gehen Sie zur Übersicht von Doc. Hier haben wir APIs, eine für das Abrufen aller Wechselkurse und eine für das Abrufen des Paares. Wir gehen zur Paarkonversation. Hier bekommen wir die API, also kopiere sie, und in unserer API erstellen wir eine separate Funktion zum Abrufen des Wechselkurses. Const, der Wechselkurs der Uhr entspricht also der Pfeilfunktion. In dieser Funktion werden wir diese Wechselkurs-API jetzt aufrufen Die konstante Antwort ist also gleich Wedge, und hier in den Backticks übergeben wir einfach die IIURL. Jetzt müssen wir ein paar Dinge ändern . Hier an der Stelle Ihrer API müssen wir Dollar-Klammern schreiben, Punkt zu Punkt verarbeiten, Kurs unterstreichen, API-Schlüssel unterstreichen Stellen Sie sicher, dass Sie den richtigen ENV-Variablennamen schreiben. Jetzt haben wir endlich zwei Währungen. erste ist die Basiswährung, die Währung, in wir den Preis in unserer Datenbank hinzufügen, und die zweite ist die Zielwährung , in die wir umrechnen möchten. Unsere Basiswährung ist also USD, weil wir in der Datenbank den Produktpreis in USD hinzugefügt haben und wir diese Währung in INR umrechnen möchten. Unsere Zielwährung ist also INR. Auch an der Stelle, an der der statische Wert der Zielwährung übergeben wird, können wir ihn variabel machen. Im Parameter erhalten wir also die Zielwährung und wir übergeben die Zielwährung für die Dollar-Kalibrierung Wie wir wissen, ist das Abrufen der API eine asynchrone, laufende Aufgabe. Wir müssen hier auf die Antwort warten. Und um await verwenden zu können, müssen wir diese Funktion asynchron machen. Lily Jetzt wird diese Antwort Daten wie diese zurückgeben. Hier brauchen wir diese Konversationsrate. Nachdem wir die Antwort erhalten haben, müssen wir diese Daten in JSON konvertieren. Die Kostendaten entsprechen dem JSON-Wert für die Warteantwort. Mit dieser Funktion können wir nun einfach die Unterstrichsrate der Datenkonversation zurückgeben Unterstrichsrate der Datenkonversation Gut. In unserem OrderyPi zählen wir hier einfach den Betrag, den Umtausch, Unterstrich entspricht dem Gewicht, dem Patch, dem Wechselkurs, Funktion und als Argument geben wir unsere Zielwährung, die INR, Nachdem wir den Wechselkurs ermittelt haben, erstellen wir einen konstanten Betrag , der dem Gesamtkartenpreis entspricht , und wir müssen diesen Wert und wir müssen Schließen Sie diesen Ausdruck also in Klammern ein und fügen Sie einfach einen Punkt zu einem festen Wert hinzu und übergeben Nun, bei der Summe, geben wir den Betrag auf 100 weiter. Lassen Sie uns nun diese Implementierung überprüfen. Speichern Sie diese Datei wieder im Browser, aktualisieren Sie die Seite und klicken Sie auf Taste Payment. Siehst du, jetzt bekommen wir den Wert in der indischen Währung. Großartig. Nehmen wir nun an, wir möchten, dass unser Benutzer den Zielwert übergeben kann. Wir erhalten also den Zielwert für den Benutzer im Hauptteil der Anfrage. Secst-Objekt entspricht dem Punktkörper der Anfrage, und hier erhalten wir die Währung Und als Standardwert übergeben wir hier unsere Datenbankwährung, die USD ist An der Stelle dieser fest codierten Zielwährung übergeben wir nun unsere Währungsvariable, die unser Benutzer in den Punkttext der Anfrage eingibt. Außerdem ist hier die eine Sache. Wenn unsere Basiswährung und Zielwährung identisch sind, müssen wir den Wechselkurs nicht abrufen, oder? Lassen Sie uns also Änderungen an unserem Code vornehmen. Vor diesem Wechselkurs geben wir die Bedingung I ein, dass die Währung dem USD entspricht, was unser Preiswert in der Datenbank ist. Wenn beide gleich sind, müssen wir den Betrag angeben, der dem Gesamtpreis der Karte entspricht . Andernfalls können wir den Betrag wie folgt berechnen. Also verschieben wir einfach diese beiden Zeilen hierher, entfernen diese Konstante und oben definieren wir, dass der Betrag gleich Null ist Also ersetzen wir diesen Betragswert entsprechend unserer Bedingung Und auch in den Bestelloptionen müssen wir diese Währung weitergeben, die Chinges speichern und dann probieren wir unsere Implementierung Verweisen Sie uns auf die Seite, klicken Sie auf Taste Payment und sehen Sie, hier bekommen wir INR, weil wir vom Frontend aus die Währung als INR versenden Wenn Sie das ändern möchten, öffnen Sie stmlFle und scrollen Sie zu diesen Variablen Hier, in Benutzerwährung, geben wir CAD für kanadischen Speichern Sie diese Datei, aktualisieren Sie die Seite und senden Sie die Anfrage. Sehen Sie hier, wir erhalten den Wert in kanadischen Dollar. Wenn wir Ihr Währungsfeld im EPI-Anruf nicht übergeben , speichern Sie es, aktualisieren Sie die Seite und senden Sie die Anfrage erneut Sehen Sie, standardmäßig ist der Höchstwert in USD angegeben. Großartig. Wenn Ihr Razor Pay-Konto keine internationale Zahlungsfunktion hat, können Sie auch keine internationalen Zahlungen tätigen Es ist die Politik der Benutzer, zu zahlen. Wenn Sie die internationale Zahlungsfunktion Ihres Kontos überprüfen möchten , gehen Sie zu Ihren Konten und den Einstellungsoptionen Ihres Ser Bay-Kontos. Stellen Sie sicher, dass Sie sich im Live-Modus befinden. Hier kann ich nicht in den E-Modus wechseln, da dieses Konto nicht verifiziert ist. Wenn Sie in den Live-Modus wechseln können, gehen Sie im Zahlungsblog zu den internationalen Zahlungen. Sie können sehen, dass Ihre Funktion für internationale Zahlungen aktiviert ist oder nicht. Derzeit befinden wir uns im Testmodus und werden auch unsere internationalen Zahlungen testen. Also verbessern wir unsere erste API. Gehen wir nun zur zweiten über. Lassen Sie uns nun unsere zweite API verbessern. Machen Sie sich keine Sorgen, wir müssen nicht viel tun. Wir werden einfach neue Bestelldaten in der Datenbank erstellen und die Benutzerkarte entfernen , wenn die Zahlung erfolgreich war. Wenn die Zahlung nicht verifiziert ist, führen wir diesen Codeblock aus. Wenn die Zahlung erfolgreich ist, können wir hier Code schreiben bevor wir eine Erfolgsantwort zurückgeben. Hier erzeugen wir Kosten, neue Bestellung entspricht einer neuen Bestellung. Stellen Sie sicher, dass wir dieses Auftragsmodell eingeben. An oberster Stelle ist die Kostenreihenfolge also gleich der Anforderung , wir die Modelle noch einmal aufstocken und in dieser Gut. Jetzt unten müssen wir hier ein neues Auftragsobjekt übergeben. Zuallererst fügen wir in dieser Reihenfolge den Benutzer hinzu, der die Punkt-Benutzerpunkt-Underscore-ID anfordert Danach benötigen wir Produkte, und darin speichern wir alle Produkte, die wir bestellen Wie können wir diese Informationen erhalten Richtig, wir können es vom Backend bekommen. Vor dieser Bestellung finden wir die Kosten, Einkaufswagen entspricht acht Warenkorbpunkten Fine Vn. Hier im Objekt übergeben wir die Condition user an request dot user dot underscore-ID Einfach bei der Bestellung von Produkten geben wir Produkte an CAT-Punkt-Produkte Als nächstes die Gesamtzahl der Produkte zur CRT-Gesamtzahl der Produkte. Als Nächstes haben wir den Gesamtpreis im Verhältnis zum CRT-Gesamtpreis angegeben. Als Nächstes haben wir die Lieferadresse, die wir vom Frontend erhalten müssen Lass es vorerst so wie es ist. Als Nächstes fügen wir den Zahlungsstatus zu bezahlt, Zahlungs-ID zur Reservierung, Unterstrich, Zahlung , Unterstrich-ID Und als zusätzliche Information können wir die ReserveOder-ID speichern, um den Unterstrich zu reservieren, die Unterstrich-ID der Aber wir müssen dieses Feld in unser Bestellschema aufnehmen. Nach diesem Feld fügen 150. Internationale Zahlung mit Paypal: Lassen Sie uns sehen, wie wir ein internationales Zahlungsgateway in unserer Node-Anwendung implementieren können . Wie wir wissen, haben wir für globale Zahlungen zwei sehr beliebte Optionen. Wir haben Stripe und wir haben Papier. In dieser Lektion werden wir Papier wie dieses implementieren. Wir werden es in unserem Backend implementieren, es mit dem Frontend testen, und auch hier können wir die Geschmacksprämien sehen. Es wird also Spaß machen. Dieses Video ist für alle Landbewohner. Lass uns damit anfangen. Außerdem ist Stripe in meinem Land derzeit nur auf Anfrage erhältlich, sodass ich Ihnen die Vorführung von Stripe zeigen kann. Wenn sie das in Zukunft zulassen, werde ich auch dazu eine Lektion erstellen. Lassen Sie uns nun den Arbeitsablauf des Paper-Zahlungsgateways verstehen . Wenn der Benutzer also auf die Schaltfläche „Zur Kasse“ klickt, erstellen wir eine API, sagen wir, eine Bestellung. API erstellt eine Bestellung für die Papierzahlung mit einigen Details, z. B. wie viel Betrag wir erhalten möchten in welcher Währung der Benutzer USD oder Euro zahlen soll. Denken Sie daran, dass es sich bei dieser Bestellung um eine Papierbestellung handelt, nicht um unsere Bestellung bei Abholung. Jetzt generiert diese API die Bestell-ID mithilfe von Papier und sendet diese Bestell-ID einfach an das Frontend zurück. Wenn Sie diese Bestell-ID verwenden, öffnet Paper die Zahlungsseite der der Benutzer Details zur Zahlung eingeben kann. Nachdem der Benutzer die Zahlungsdetails eingegeben hat, rufen wir nun eine weitere API zur Erfassung dieser Zahlung auf. Mit dieser API ermöglichen wir den Benutzern grundsätzlich die Zahlung, fügen unser Papierkonto hinzu und erstellen dann die Bestelldaten Nach erfolgreicher Zahlung erstellen wir die Bestelldaten und bestätigen die Benutzerbestellung. Für die Implementierung von Zahlungen in Papierform müssen wir also zwei APIs in unserer Node.js-Rückhand erstellen Erstens für die Auftragserstellung und zweitens für die Erfassung der Zahlung auf unserem Konto Ich weiß, dass du viele Fragen hast, aber mach dir keine Sorgen. Nach Abschluss dieser Lektion werden Sie den gesamten Arbeitsablauf besser verstehen. Lassen Sie uns also diese beiden APIs erstellen. Wenn Sie das SRP-Zahlungsgateway aus der vorherigen Lektion implementieren, müssen Sie außerdem SRP-Zahlungsgateway aus der vorherigen Lektion implementieren, kleine Dinge wiederholen, z. B. das Entfernen des Ablaufs von Tokens usw. Ich muss das wiederholen, damit wir alle auf eine Seite kommen. Das tut mir leid. Ich hoffe, du kannst das verstehen. Jetzt müssen Sie im Routenordner eine neue Datei namens orders dot js erstellen. Ich habe diese Datei mit zwei APIs erstellt , weil ich in der vorherigen Lektion die SRP-Integration gezeigt habe, aber diese beiden APIs von dieser Zahlungsintegration getrennt Das können Sie völlig ignorieren. Um die Route schnell hinzuzufügen, können Sie einfach die ersten beiden Codezeilen aus den Kartenrouten kopieren und in die Routendatei für Bestellungen einfügen. Am Ende müssen Sie den Modulpunkt ausführen . Xbards entspricht Router Außerdem müssen Sie diesen Router zur js-Datei mit dem Indexpunkt hinzufügen , sodass Const Order Routes den Ordnern Got Routes und Orders entsprechen Routes Unten, nach den Kartenrouten, können Sie den Schrägstrich „app.us“ -API-Schrägstrich „Order“ hinzufügen und „ Order Jetzt können Sie sich auf die Erstellung von APIs konzentrieren . In unserer Datei punktet der Router also mit dem Punkt Post und zeigt auf den Schrägstrich People den Schrägstrich Create Order Hier benötigen wir auch OS-Middleware, weil wir wollen, dass nur angemeldete Benutzer auf diese API zugreifen können Stellen Sie außerdem sicher, dass Sie Osmddleware oben eingeben und danach mit Anfrage und Antwort zurückgerufen werden. In dieser Funktion wissen wir jetzt, dass wir eine Papierbestellung erstellen möchten Dafür müssen wir zuerst P konfigurieren. Im Konfigurationsordner müssen wir eine neue Datei namens paper dot js erstellen. Zunächst definieren wir eine Variable für einige Details. Konstantes Papier ist also gleich Objekt. Zuallererst die Client-ID, die unsere Anwendungs-Client-ID ist, dann das Client-Geheimnis, der geheime Schlüssel unserer Papieranwendung, und schließlich benötigen wir auch die Basis-URL Dies ist die Basis-URL der Paper-API. All diese Informationen werden wir aus Sicherheitsgründen in der NNV-Datei speichern aus Sicherheitsgründen in der NNV-Datei Hier übergeben wir also den Prozesspunkt mit Punkt auf Papier Kunden-Unterstrich Und bei der zweiten Eigenschaft schreiben wir process.nw dot paper, schreiben wir process.nw dot paper Und zuletzt schreiben wir Prozesspunkt E und Papier, Unterstrich, Basis, Unterstrich URL Lassen Sie uns nun diese drei Variablen in der ENV-Datei festlegen. PPL-Unterstrich für den Client-Unterstrich bedeutet also , das Feld leer zu lassen, und als nächstes ist der Papierunterstrich, geheim, gleich und als nächstes ist der Papierunterstrich, geheim, ist der Papierunterstrich, geheim Die URL mit unterstrichenem Basisunterstrich auf Papier entspricht. Wir werden sie hinzufügen, wenn wir ein Papiergeschäftskonto registrieren. Okay? Lass es vorerst so wie es ist. Wenn wir nun auf Papier eine Bestellung in Papierform erstellen oder die Zahlung im Bootstep erfassen möchten , müssen wir ein eindeutiges Token wie JWT erstellen dieses Token zu generieren, können wir also eine Funktion dafür erstellen Das Token von Const G X entspricht der Pfeilfunktion. Für die Generierung des Tokens werden wir nun die API offizieller Personen verwenden Zum Aufrufen der API werden wir also Axos verwenden. Axios ist das Paket zum Aufrufen von APIs in JavaScript. Es ist viel einfacher als die Methode fetch zu verwenden. Stiftterminal, NPM, installiere Axios. Gut. Um dieses Axios-Paket oben zu verwenden, importieren wir die Kosten. Axios entspricht der Anforderung von Xos. Jetzt warten wir in unserem Gate Aces to Confunction auf Axios Punkt hier, wir müssen die SDDP-Methode hinzufügen, die Post Und bei dieser Methode fügen Sie an erster Stelle den API-Endpunkt in Backticks, Dollar Cali Brackets, Punkt BRL V eins, O oth, zwei, Schrägstrich O oth, zwei, Schrägstrich Jetzt müssen wir an der zweiten Stelle, dem Körper, doppelte Codes eingeben. Zugegeben, der Unterstrich-Typ entspricht den Unterstrich-Anmeldeinformationen des Clients. Und an dritter Stelle übergeben wir Configure Object. Zuerst, Oh, um Einwände zu erheben, verwenden Sie einen Namen, P, Punkt, Client-ID. Und als nächstes haben wir das Passwort für den geheimen PPT-Client. Nach Oath fügen wir nun dem Objekt Header im Inhaltstyp Doppelcodes hinzu , zwei im Doppelcode, Anwendungen xwwwFM-URL-kodiert Anwendungen xwwwFM-URL-kodiert Und das war's für diese API. Diese API generiert überschüssige Token für uns, also speichern wir diese in einer variablen Antwort. Und dann geben wir einfach Antwort, Punktdaten, Punkt X und als Code-Token zurück. Nun zur Verwendung von await, wir machen diese Funktion asynchron und vielleicht kann uns dieser Code auch einen Fehler geben Es ist also besser, diesen Code in einen Try-and-Cache-Block zu packen. Also ein Versuch, diesen Code zu blockieren und in den Try-Blog zu verschieben. Und im Cache konsolen wir das Punktprotokoll, Fehler beim Abrufen des Zugriffstokens Und wir schreiben diese Punktfehlermeldung. Am Ende machen wir einfach das Modul Punktexporte , die dem Objekt entsprechen. Und hier fügen wir Papier zu Papier hinzu, oder wir können nur Papier schreiben und erhalten ein Zugriffstoken, um AcessTken zu erhalten Speichern Sie diese Datei und kehren Sie zu unserer Bestellroute zurück. nun eine neue Papierbestellung zu erstellen, verwenden wir eine andere P-API. Sie können all diese APIs in der Papierdokumentation finden. Machen Sie sich darüber keine Sorgen. Die Kostenantwort entspricht also dem Warten auf Axios für das Senden von Anfragen und der Anfrage, die wir per Post senden möchten also beim ersten Argument posten, müssen wir Batis Dollar Cali Brackets, Paper Dot ArllasV zwei übergeben und darauf zeigen Paper Dot Schrägstrich bei Bestellungen an der Kasse. diese Papiervariable zu verwenden, die wir in der Paper-Konfigurationsdatei definieren, müssen wir sie außerdem die wir in der Paper-Konfigurationsdatei definieren, oben importieren Const ciBacketsPaper, und wir benötigen auch ein Gat-Zugriffstoken, entspricht dem Erfordernis, einen Ordner hochzufahren, config und paper Gat-Zugriffstoken, entspricht dem Erfordernis, einen Ordner hochzufahren Außerdem importieren wir const Axios, das entspricht require Axos. Jetzt können wir in unserer API in Axios mit dem zweiten Parameter den Hauptteil der Anfrage übergeben Hier übergeben wir ein Objekt mit einigen Eigenschaften. Die erste ist Absicht. Dies legt die Absicht fest, mit der die Bestellung erfasst werden soll. Dadurch wird den Benutzern mitgeteilt, dass die Zahlung sofort erfasst wird , wenn der Benutzer sie genehmigt Aus diesem Grund werden wir die Zahlung sofort in der zweiten API erfassen Die nächste Eigenschaft, die wir hinzufügen, ist der Kauf von Underscore-Einheiten. Zum Anordnen. Dies stellt die Artikel oder Dienstleistungen dar, die der Benutzer kauft, und wie viel sie kosten. Moment übergeben wir nur ein Objekt, und dabei übergeben wir die Beschreibung an die Bestellung im Einkaufswagen und eine weitere Eigenschaft für den Betrag an das Objekt. Darin müssen wir angeben, in welcher Währung wir Zahlungen akzeptieren möchten. Also Währungscode zu USD und dann Wert zu zehn. Wir wollen vom Benutzer einen schwachen D-Wert. Jetzt, nach dem Kauf von Einheiten, übergeben wir die Anwendungskontexte und unterstreichen die Kontexte Auf diese Weise erhalten Sie Anweisungen in Papierform , was zu tun ist, nachdem der Benutzer das Zahlungsformular in Papierform ausgefüllt hat In diesem Objekt müssen wir also zwei Eigenschaften übergeben. Die erste wird als URL mit einem Unterstrich geschrieben. Dies ist die URL, auf die wir unseren Benutzer weiterleiten möchten, nachdem die Zahlung erfolgreich in Papierform verifiziert wurde Und die zweite Eigenschaft ist die URL mit dem Unterstrich „ Stornieren“. Dies ist die URL, auf die wir den Benutzer weiterleiten möchten, nachdem die Zahlung abgelehnt oder storniert Lassen Sie dieses Feld vorerst unverändert. Wir werden es füllen, wenn wir diese Implementierung probieren. Jetzt, nach dem Hauptteil der Anfrage, können wir andere Konfigurationen wie Header an Objekt, Inhaltstyp an Anwendung, Inhaltstyp an Anwendung, ZSN übergeben und wir müssen auch den Autorisierungsheader an Batis Beer, Space übergeben , und hier werden wir das Personen-Token hinzufügen Kannst du sagen, wie wir dieses Token generieren können? Wir können GxsStkenFunction verwenden. Ganz oben entspricht das Const-Token einer Gewichtung, weil es sich um eine AN-Funktion handelt Holen Sie sich überschüssiges Token in den Autorisierungsheader, wir übergeben das Dollar-Calibrakets-Token, wir übergeben das Dollar-Calibrakets-Token, und Jetzt erstellt diese API eine neue Reihenfolge wie geschriebene Daten, wie die Bestell-ID und einige Links Hier müssen wir nur den Link zurückgeben, bei dem es sich um den Papierlink handelt. Wenn wir diesen Link im Browser öffnen, erhalten wir eine Zahlungsseite in Papierform. Also geben wir einfach die URL für die Genehmigung des JSON-Objekts zurück, zwei Antwortpunkte mit dem Punkt Theta Dot Links Punkt Find Hier erhalten wir die Funktion mit einem einzigen Link-Pfeil, Linkpunkt L entspricht Codes, genehmigen den äußeren Punkt HRF und das war's Unsere erste API ist fertig. Lassen Sie uns nun schnell unsere zweite API für die Erfassung der Zahlung definieren , und dann werden wir diese Implementierung testen. Also Router, Punkt Post und Zeiger auf Slash Paper Capture Order Danach erfolgt ein Rückruf mit Anfrage und Antwort. Jetzt ist die Erfassung von Zahlungen sehr einfach. Zunächst erhalten wir die Bestellnummer aus dem Hauptteil der Anfrage, da wir sie vom Frontend aus senden müssen und diese Bestellnummer benötigen , um die Zahlung zu erfassen. Zur Überprüfung können wir hier auch eine Bedingung angeben. Wenn die Bestellnummer nicht verfügbar ist, geben Wenn die Bestellnummer nicht verfügbar ist, wir einfach den Antwortstatus zurück, ein 400-Punkt-JSON-Objekt mit Nachrichteneigenschaft Bitte senden Sie die Bestellnummer oder geben Sie die Bestellnummer an. Bereitstellen klingt gut. Was sagst du? Ja. Wenn wir nun die Bestellnummer haben, benötigen wir ein Token für die PL-Capture-API. Gs-Token entspricht also dem Await, dem G-Excess-Token, und am Ende rufen wir einfach eine API auf. Warten wir auf Axios Punkt für Endpunkt, wir übergeben BC-Steuern, Dollar ClacketsP Punkt BRL zwei, Schrägstrich Checkouts Bestellungen Dollar Cali-Klammern, Schrägstrich Checkouts Bestellungen Dollar Als Gefangennahme. Beim zweiten Parameter müssen wir den Körper übergeben. Für diese API müssen wir nichts übergeben, also übergeben wir ein leeres Objekt. Jetzt erhalten wir den Status und einige Details zur Erfassung von dieser API. So können wir das als Antwort speichern und am Ende geben wir einfach den Antwortpunkt Json-Objektstatus an Antwort, Punktdaten, Punktstatus zurück Antwortpunkt Json-Objektstatus an Antwort, Punktdaten, . Dieser Status zeigt an, ob die Zahlung erfolgreich erfasst wurde oder nicht, und das war's. Sie können sehen, wie einfach es ist. Wir müssen nur die People API aufrufen. Jetzt fragen Sie sich vielleicht, warum wir diese APIs nicht vom Frontend aus aufrufen können ? Angenommen, wir rufen diese Create Order API direkt vom Frontend aus auf. Wie wir wissen, haben die Benutzer jetzt zu viel vom Frontend zur Verfügung. Sie können diesen Betragswert einfach ändern und ihn auf Null oder 0,5 setzen. Stellen Sie sich vor, wie viel Geld das Unternehmen verlieren wird, und außerdem werden einige Leute einige Informationen missbrauchen. Deshalb müssen wir diese Zahlungsfunktionen in unserem Backend implementieren . Hier vervollständigen wir unsere beiden APIs für p. Keine Sorge, das ist nur eine grundlegende Implementierung. Wir werden diese APIs nach dem Testen verbessern , da wir in der zweiten API nach erfolgreicher Erfassung der Zahlung eine neue Bestellung für diesen Benutzer erstellen und die Kartendaten entfernen müssen . Im Moment wollen wir diese Komplexität nicht, also werden wir das später in dieser Lektion tun, oder? Bevor wir diese APIs testen, benötigen wir den Client-Schlüssel in Papierform, People Secret und People Base URL. Denken Sie daran, dass wir in der ENV-Datei leere Variablen verwenden Wir müssen zuerst diese drei Felder hinzufügen und dafür müssen wir ein People Business-Konto einrichten Lassen Sie uns nun ein Paper Business-Konto einrichten. Lassen Sie uns ein neues Papierkonto erstellen und diese Implementierung ausprobieren. In diesem Prozess benötigen Sie möglicherweise einige rechtliche Dokumente und Ihre Bankdaten. Gehen Sie also zur Entwicklerseite von Paper, nämlich developer.paper.com Wenn Sie bereits ein Geschäftskonto in Papierform haben, ist das gut, aber die meisten Studenten haben kein Hier spreche ich von Geschäftskonten, nicht von Privatkonten. können Sie auch Ihr persönliches Konto in ein Geschäftskonto umwandeln dieser Einstellung können Sie auch Ihr persönliches Konto in ein Geschäftskonto umwandeln. Hier klicken wir auf C registrieren, um ein neues Konto zu erstellen. Stellen Sie sicher, dass Sie hier das Geschäftskonto auswählen und loslegen. Geben Sie hier Ihre E-Mail-Adresse ein und senden Sie sie ab. Erstellen Sie jetzt hier Ihr Passwort. Stellen Sie sicher, dass Sie diese Anweisung befolgen und sie abschicken. Beschreiben Sie nun Ihren Geschäftstyp, ich wähle Ihre Person aus, und hier müssen wir auch diese Informationen angeben. Produkt oder Dienstleistung, sagen wir, Marktplätze. Ich schreibe zufällige Details, aber in der realen Welt müssen Sie Ihre Originaldaten schreiben. Verwendungscode, lass mich sehen, was sie haben. Wählen Sie Ihre Unterhaltungsdienste aus. Danach muss ich meine Personalausweisnummer schreiben. Für Ihr Land könnte es etwas anderes sein, also müssen Sie die korrekten Daten angeben. Name der Erklärung an, sagen wir, Gott segne Sie und senden Sie das Formular ab. Jetzt müssen wir die persönlichen und geschäftlichen Informationen ausfüllen , sodass ich diese Informationen schnell ausfülle. Daher ändern diese Zahlungsplattformen ihre Oberfläche sehr oft. Wenn Sie also in Zukunft nicht die gleiche Oberfläche wie ich bekommen, dann lassen Sie sich nicht verwirren. Geben Sie einfach die gewünschten Informationen an und erstellen Sie ein Geschäftskonto auf Papier. Nachdem wir ein Konto erstellt haben, können wir die Kunden-ID und das Kundengeheimnis erstellen. Außerdem wähle ich hier die Hauptwährung gegenüber dem US-Dollar aus. Sie können wählen, was auch immer Sie vereinbaren möchten, und fortfahren. Hier bitten sie darum, Ihre Identität zu überprüfen. Wenn Sie planen, Ihre Zahlungen im Live-Modus zu tätigen , schließen Sie diesen Vorgang so schnell wie möglich ab. Im Moment möchte ich nur testen, auswählen und es später tun. Damit kommen wir auf die Kartonseite. Klicken Sie jetzt oben auf Entwickler, und wie Sie sehen können, befinden wir uns jetzt im Sandbox-Modus, was den Testmodus bedeutet Um nun die Client-ID und das Client-Geheimnis zu erstellen, gehen wir zu Apps und Anmeldeinformationen Klicken Sie auf App erstellen. Schreiben Sie Ihren App-Namen, irgendwas. Sagen wir Cardwish-Knoten. Wir erstellen ein Konto für den Händler und erstellen einfach eine App Es wird geladen und sehen, hier bekommen wir die Kunden-ID und das Geheimnis. Kopieren Sie also zuerst die Client-ID und fügen Sie sie in unsere ENV-Datei Client-ID Kopieren Sie nun den geheimen Schlüssel und fügen Sie ihn auch unter dem geheimen Wert ein. Bei URLs in Papierform übergeben wir TDPs, Doppelpunkt, doppelten Schrägstrich Gut. Speichern Sie diese Datei. Zum Testen mit Zahlung benötigen wir jetzt auch ein Sandbox-Testkonto für den Zahlungsversand Also gehen wir zu Testtools und sehen uns wie Sandbox-Konten an, hier haben wir zwei Testkonten, eines für geschäftliche und eines für privat Im Moment müssen wir kein neues Konto erstellen. Wenn wir brauchen, dann werden wir erstellen. Wie wir wissen, benötigen wir jetzt ein Frontend, um diese API auszuprobieren, da wir im Frontend die Zahlungsseite in Papierform öffnen werden. Wie wir wissen, benötigen wir nun ein Frontend, um diese APIs zu testen, da wir im Frontend die Zahlungsseite in Papierform öffnen werden. Also habe ich hier eine einfache SDML-Seite mit dem Namen Tasting Dot SDML erstellt SDML-Seite mit dem Namen Tasting Dot SDML Diese Seite finden Sie unter dieser Lektion ist auch im Ordner Resources project to verfügbar Resources project to Laden Sie es herunter und fügen Sie es einfach zu Ihrem aktuellen Projekt hinzu. Lassen Sie uns nun diese SDML-Datei im Browser ausführen. Gehen Sie also im Datei-Explorer oder Finder zu SDMLFle und öffnen Sie es einfach Hier bekommen wir den Titel und einen einfachen Button. Wenn Sie sehen möchten, was passiert ist, als wir auf diese Schaltfläche klicken, können Sie sich die SDML-Datei ansehen Es ist wirklich einfach. Sehen Sie, derzeit läuft es von lokalen Dateien unseres Computers aus. Nun, hier ist die eine Sache. Denken Sie daran, dass wir in der Bestell-API Anwendungskontakte weitergeben müssen. Siehst du, hier. Im Grunde müssen wir die Seite „Erfolg“ und die Seite „Abbrechen“ bestehen . In der Bestell-API können wir den lokalen Ordnerpfad nicht übergeben, wir müssen die URL übergeben. Also, was ist hier die Lösung? Wir können unsere SDML-Datei auf einem lokalen Server hosten, und dann werden wir diesen Pfad hier übergeben Lassen Sie mich Ihnen zeigen, dass es wirklich einfach ist. Suchen Sie also auf der Registerkarte „Erweiterung“ nach Live Server. Und installiere diese Erweiterung. Mit dieser Erweiterung können wir unsere Anwendung auf einem lokalen Server ausführen. Zurück zu den Dateien und klicken Sie mit der rechten Maustaste auf das Papier, probieren Sie SDMLFle aus und wählen Sie Mit Live-Server öffnen Und sehen Sie, dass es im Browser geöffnet ist, aber jetzt läuft es auf diesem Port Kopieren Sie einfach diese URL zurück zum Vas-Code und fügen Sie sie einfach in die geschriebene URL und auch in die Stornieren-URL dieselbe URL ein. Aber um zu überprüfen, ob das funktioniert oder nicht, übergeben wir hier den Vorgang stornieren. In der realen Welt fragt man Frontend-Entwickler , welche Seite sie im Erfolgsfall zeigen wollen im Erfolgsfall zeigen und dann stornieren und den Pfad entsprechend ändern. Ich übergebe diesen Pfad nur zum Testen. Speichern Sie diese Datei und stellen Sie sicher, dass der Server läuft. Hier erhalte ich eine Fehlermeldung, doppelte Parameter. Oh, hier gebe ich die Antwort an der Stelle der Anfrage weiter. Und lassen Sie mich auch eine andere API überprüfen. Ja, hier auch anfragen. Speichern Sie diese Datei und stellen Sie sicher, dass unser Server läuft. Gut. Es funktioniert. Jetzt zurück zum Zimmer und einfach auf Bezahlen mit PayPal klicken. Nichts passiert. Das ist nicht fair. Lass uns nachschauen, was passiert. Also paninspect mit FL, gehe zur Konsole und hier können wir sehen, dass wir einen Fehler bekommen. Der Zugriff auf die API zum Abrufen oder Erstellen von Bestellungen von Origin Null wurde aufgrund der Kursrichtlinien gesperrt Dies ist ein sehr beliebter Fehler bei Full-Stack-Entwicklern. Das passiert, weil unsere Express-Anwendung standardmäßig keine API-Aufrufe von irgendeinem Ursprung annehmen kann . Wir müssen den Kurs in unserer Express-App aktivieren. Also zurück zum Terminal und schreibe NPM install CRE. Und drücke Enter Jetzt importieren wir in der Index-JS-Datei oben die Kosten. Kurs ist gleichbedeutend mit Kurs erforderlich. Dann fügen wir ganz unten, vor diesen Express-DJs und der Middleware, vor diesen Express-DJs und der Middleware, den App-DG-Kurs hinzu, und das Sehen Sie sich die Änderungen an. Stellen Sie sicher, dass unser Server läuft. Gut. Klicken Sie jetzt einfach auf die Schaltfläche Mit Papier bezahlen. Hier erhalte ich einen Fehler beim Erstellen der Bestellung, was bedeutet, dass wir in API 1 einen Fehler erhalten. Lassen Sie uns überprüfen, was hier passiert. Also öffne die Konsole. Hier bekomme ich 400 schlechte Anfragen. Also zurück zum VS-Code im Terminal, C, wir bekommen den Token als Träger Geben Sie Ihr JWT-Token ein, was bedeutet, dass wir das falsche Token vom Frontend übergeben Öffnen Sie also den Papiertestpunkt sdmlFle, hier müssen wir unser Token eingeben Öffnen Sie Postman, öffnen Sie die Login-API und generieren Sie ein neues Token Gut, kopiere dieses Token und übergebe dieses Token in unserer STML-Datei Speichern Sie diese Datei, weniger diese. Klicken Sie auf Mit Papier bezahlen. Es wird einige Zeit dauern, wir hier eine Login-Seite in Papierform bekommen, was bedeutet, dass unsere erste API zum Erstellen von Bestellungen gut funktioniert. Lassen Sie uns nun vor dem Einloggen die Zahlung stornieren. Siehst du, wir leiten zur Stornierungs-URL weiter. Gehen Sie nun zweimal zurück zu unseren Frontend-Pfaden und klicken Sie auf Pay with Paper. Wir erhalten die Paper-Anmeldeseite. Hier in der realen Welt melden sich unsere Kunden mit ihrer Papier-ID und ihrem Passwort an. Aber hier zur Verkostung werden wir das Sandbox-Konto verwenden Stellen Sie sich das Sandbox-Konto auf Papier wie ein Dummi-Konto Also gehen wir zu unserem Paper Dashboard. Hier haben wir ein persönliches Konto. Klicke darauf. Hier, sehen Sie, wir bekommen Login-Informationen, kopieren die E-Mail und fügen diese E-Mail in unserem Frontend hinzu. nun zum Dashboard zurück und kopieren Sie das Passwort fügen Sie es in das Passwort ein und klicken Sie auf Anmelden. Hier bekommen wir einen Fehler beim Händler geschrieben. Wir können Ihre Zahlung derzeit nicht über Ihr Papierkonto abwickeln. Bitte gehen Sie zurück zum Händler und versuchen Sie es mit einer anderen Zahlungsmethode. Also lass es mich noch einmal versuchen. Siehst du, wir bekommen immer noch den gleichen Fehler. Lass mich jetzt etwas anderes versuchen. Derzeit basiert meine Bewerbung auf einem indischen Konto, und hier versuche ich, von Indien nach Indien zu zahlen. Paper erlaubt keine inländischen Zahlungen innerhalb Indiens über Papiergeldbörsen. Selbst im Sandbox-Konto versuchen wir, eine Transaktion zwischen zwei indischen Konten durchzuführen. Dann erhalten wir auch eine Fehlermeldung, wenn Zahlungen von Indien nach Indien über ein anderes Zahlungsgateway wie Raiser Pay verfügen ein anderes Zahlungsgateway wie Raiser Lassen Sie uns ein Testkonto für ein anderes Land erstellen. Kontotyp privat ein und wählen Sie hier ein beliebiges Land aus, aber wählen Sie nicht dasselbe Land wie das Geschäftskonto aus. Konto erstellen. Versuchen wir nun, uns mit diesem neuen Konto anzumelden. Zurück zu unserem Frontend. Hier erhalte ich den gleichen Fehler , weil mein Konto angemeldet ist. Lassen Sie uns also dieses Frontend im Inkognito-Tab öffnen und mit Papier bezahlen Hier bekomme ich eine Login-Seite. Stellen Sie sicher, dass Sie sich mit einem anderen Länderkonto anmelden , Ihre E-Mail-Adresse hinzufügen, hier auch das Passwort hinzufügen und sich mit diesem Konto anmelden Siehst du, hier bekommen wir die Zahlungsseite in Papierform. Oben sehen wir das Benutzerkonto, und hier bekommen wir den zu zahlenden Preis. Außerdem finden Sie hier unten verschiedene Zahlungsmethoden wie Papierguthaben, Credit Union mit Karte, Credit Union mit Karte, A-Papierkredit, und Sie können auch Ihre eigene Karte hinzufügen. Dies ist ein Testkonto, und deshalb tun wir nichts. Außerdem erhalten wir hier die Adresse dieses Kontos. Dies sind Details des Verkostungskontos. Klicken wir nun auf Weiter, um die Bestellung zu überprüfen. S, hier bekommen wir, dass die Zahlung fehlgeschlagen ist. Lassen Sie mich überprüfen, was falsch ist. Öffnen Sie die Konsole mit F und sehen Sie, hier erhalten wir einen Fehler in der Capture Order API. Also in unserem VS-Code im Terminal erhalte ich hier diesen langen Fehler, also scrolle schnell nach oben. Hier erhalten wir einen Fehler, Eigenschaften mit undefiniertem Lesestatus können nicht gelesen werden In unserer zweiten API erhalten wir also keinen Status Lassen Sie mich überprüfen, was falsch ist. Oh, tut mir leid. Oh, ich habe vergessen wegzuschreiben. Speichern Sie diese Datei und kehren Sie zu unserem Frontend zurück. Lassen Sie mich versuchen, dieses Token und die Paar-ID aus der URL zu entfernen und diese einfache SGML-Datei auszuführen Klicken Sie nun auf „Mit Papier bezahlen“. Wenn wir die Zahlung per Post erhalten haben, klicken Sie einfach auf Weiter, um die Bestellung zu überprüfen Hier erhalte ich wieder den Zahlungseingang. Denken Sie daran, dass immer dann, wenn wir neue Funktionen anwenden, definitiv Fehler auftreten werden. Seien Sie nicht frustriert, konzentrieren Sie sich auf die Lösungen, nicht auf Probleme Siehst du, hier erhalte ich einen internen Serverfehler. Lassen Sie mich die Terminalanfrage mit dem Statuscode 400 in unserer Capture-Order-API überprüfen , was bedeutet, dass wir die Bestell-ID nicht erhalten. Oh, hier schreibe ich nur den Text der Anfrage. Ich muss die Punkt-Bestellnummer hinzufügen, die Änderungen speichern und in unserem Frontend mit Papier bezahlen. Fahren Sie fort, um die Bestellung zu überprüfen. Siehst du, wir wechseln zu unserer Erfolgsseite, und hier ist auch die Zahlung erfolgreich, was bedeutet, dass unsere zweite API was bedeutet, dass unsere zweite API, die Zahlungen erfasst, ebenfalls funktioniert. Sehen Sie, in unserer URL erhalten wir auch Token, das ist die Bestell-ID, und wir rufen diesen Parameter in unserem Frontend ab, und dann rufen wir die zweite Capture-Zahlungs-API und übergeben diese Bestell-ID im Hauptteil Und damit erfassen wir die Zahlung auf einem Papierkonto. Lassen Sie uns unser Geschäftskonto überprüfen, die Zahlung von 10$ erhalten oder nicht. Dafür müssen wir das Pap-Dashboard aufrufen. Sie in den Testtools Gehen Sie in den Testtools zu Sandbox-Benachrichtigungen. In diesem Drop-down-Menü wählen wir nun unser Geschäftskonto aus und klicken auf Suchen Und unten erhalten wir die Zahlung. Wenn Sie hier keine Zahlung erhalten, warten Sie bitte zwei bis drei Minuten, da es manchmal einige Zeit dauert , bis die Zahlung hier angezeigt wird. Wenn wir das jetzt öffnen, können wir sehen, dass wir die Zahlung 10$ von John erhalten haben, was der Name des Testkontos ist. Hier können wir das Transaktionsdatum sehen. Dies ist das PST-Format, bei dem es sich um eine spezifische Standardzeit handelt. Lassen Sie sich davon nicht verwirren. Jetzt fragen Sie sich vielleicht, warum wir Zahlungen auf diesem Geschäftskonto erhalten . Der Grund, warum wir Zahlungen auf diesem Geschäftskonto erhalten , ist, dass wir mit diesem Konto unseren Antrag erstellen und dann die Kundennummer und das geheime Papiergeheimnis erhalten. Aus diesem Grund erhalten wir Zahlungen auf diesem Geschäftskonto. Jetzt probieren wir hier die Bezahlung für US-Nutzer. Siehst du, hier bekommen wir die Landesvorwahl. jetzt eine Zahlung in einem anderen Land auszuprobieren, können wir ein neues Konto erstellen. Wählen Sie hier „Persönlich“ aus, was ein Käuferkonto ist, und hier können wir das Land auswählen. Nehmen wir an, ich wähle hier das Land Kanada aus. Sie können ein beliebiges Land auswählen und ein Konto erstellen. Das macht wirklich Spaß. Siehst du, oben bekommen wir das neue Konto für kanadische Nutzer. Öffnen Sie diesen Benutzer und kopieren Sie einfach die E-Mail-ID. Jetzt zurück zu unserem Frontend und hier geht's zur URL für einfache Papiertests. Stellen Sie sicher, dass wir dieses Token entfernen , da es sich um die letzte Seite der erfolgreichen Zahlung handelt. Klicken Sie nun auf Mit Papier bezahlen. Hier bekommen wir wieder das vorherige Konto, weil wir uns damit angemeldet haben. Um dieses Konto zu entfernen, klicken wir hier auf dieses JD-Symbol. Sehen Sie unten, wir bekommen Logout. Klicke darauf Klicken Sie nun auf diese Benutzer-E-Mail-Adresse ändern und fügen Sie hier diese neue Konto-E-Mail ein. Jetzt zurück zu Deskbard, kopiere das Passwort und füge es hier ein und melde dich damit an Gut. Nun, sehen Sie hier oben, ich habe den Betrag geordnet, aber hier von meinem Konto aus kann ich in kanadischer Währung bezahlen, das ist CAD. Außerdem stehen uns nur begrenzte Zahlungsmethoden zur Verfügung, und hier sehen Sie, dass die Konversationsrate von Personen pro CAD 0,6 9549 USD entspricht Hier zahlen die Leute ihre Transaktionsgebühren, aber wir können in unserer Landeswährung bezahlen Lassen Sie uns die Bestellung weiter überprüfen. Siehst du, hier bekommen wir erfolgreiche Zahlungen. Und wenn wir unsere Sandbox-Benachrichtigungen überprüfen, suchen Sie hier nach dem Geschäftskonto Es kann etwas dauern, und hier erhalten wir eine weitere Zahlung von 10$ Wie wir sehen können, erhalten wir unten den Standort von Kanada. Außerdem erhalten diese Geschäftskonten ihre Zahlung in USD, auch wenn Kunden in einer anderen Währung zahlen. Dieser Kunde muss die Transaktionsgebühr per PayPal zahlen. Wie wir wissen, funktioniert unsere Zahlung. Jetzt können wir unsere APIs verbessern und sie realistisch gestalten. Es ist wirklich einfach. Lass es mich dir zeigen. Also, was wir an der Bestell-API ändern wollen, also übergeben wir hier derzeit einen statischen Betrag, aber das ist nicht richtig. Wir müssen den Gesamtkartenpreis des Benutzers weitergeben. Lassen Sie uns also diesen Gesamtkartenpreis ermitteln. Bevor wir das Zugriffstoken abrufen, schreiben wir die Kosten, Einkaufswagen entspricht einem Gewicht. Stellen Sie sicher, dass Sie diesen Kartenmodellpunkt eingeben. Und hier im Objekt übergeben wir die Punkt-Unterstrich-ID von Benutzer zu Benutzer mit Punkt Und für diese Benutzer-ID müssen wir hier Osmidalware hinzufügen Stellen Sie sicher, dass Sie dies auch eingeben. Dadurch wird das Kartenobjekt zurückgegeben, aber wir müssen ihren Zustand übergeben wenn der Warenkorb nicht verfügbar ist oder die Punktlänge der Kartenprodukte gleich Null ist Dann geben wir die Antwort mit dem Statuscode 404 Punkt Json Object, Message property to cart not found zurück Statuscode 404 Punkt Json Object, . An der Stelle dieses Betrags müssen wir nun den Gesamtpreis der Karte mit dem Kartenpunkt angeben. Und hier ändern wir die Währung nicht , weil wir die Zahlung in USD erhalten möchten. Wenn Sie eine Zahlung in einer anderen Währung erhalten möchten, können Sie diesen Währungscode in diesem Währungscode angeben. Sie müssen jedoch überprüfen, ob die Währung auf Papier akzeptiert wird oder nicht. Lassen Sie uns das vorerst probieren. Speichern Sie die Änderungen und gehen Sie zu Paper Tasting Dot sdmlFle. Lassen Sie mich Ihnen diesen Code sehr schnell erklären Hier übergeben wir also das JWT-Token, für das wir ein Produkt hinzufügen. Derzeit haben wir in unserer Anwendung nur eine Ablaufzeit von 2 Stunden festgelegt, was für die Verkostung etwas nervig ist, da wir hier immer wieder JWT-Token erstellen müssen So können wir das Ablaufdatum aus der Anmeldung entfernen und einfach das Ablaufdatum in der Endphase des Projekts hinzufügen Auf Benutzerrouten und ganz unten entfernen wir also dieses Objekt mit abgelaufener Eigenschaft. Lassen Sie uns nun ein neues Token generieren, das niemals abläuft. Öffnen Sie Bostman und öffnen Sie die Login-API und senden Sie einfach die Anfrage Gut. Hier kopieren wir dieses Token in die SDML-Datei, wir fügen es einfach hier Außerdem können Sie hier Ihre Lieferadresse angeben. Danach habe ich hier dieses On-Click-Event für diesen Pay-Button hinzugefügt . Dabei rufen wir zunächst unsere Bestell-API mithilfe der rufen wir zunächst unsere Bestell-API mithilfe Fetch-Methode und mit diesem Token Und wie wir aus der Bestell-API wissen, erhalten wir die Genehmigungs-URL Also bekommen wir das hier. Wenn diese Daten nicht erfolgreich sind, zeigen wir eine Warnung mit einem Fehler bei der Auftragserstellung an. Was ist, wenn wir die Genehmigungs-URL erfolgreich vom Backend erhalten haben? Dann werden wir den Benutzer auf diese Seite weiterleiten. Jetzt gibt der Benutzer die richtigen Informationen und die Zahlung wurde erfolgreich abgeschlossen. Jetzt übergeben die Leute das Token in den URL-Parametern, das ist unsere Bestell-ID. Nach einer erfolgreichen Zahlung erhalten wir das Token in den URL-Parametern. Danach rufen wir unsere zweite API zur Erfassung der Zahlung auf. Und wenn diese Zahlung erfolgreich erfasst wurde, geben wir vom Backend aus den Status in der Antwort weiter. Hier überprüfen wir, ob der Status abgeschlossen ist, dann zeigen wir eine Erfolgsmeldung an und wenn der Vorgang fehlschlägt, zeigen wir den Fehler „Fehlgeschlagen“ an, so einfach ist das. Lassen Sie uns nun einfach unsere Implementierung probieren. Ich freue mich sehr darüber. Speichern Sie diese Datei und aktualisieren Sie nun die Seite . Klicken Sie erneut auf die Zahlungsschaltfläche. Wir erhalten einen Fehler beim Erstellen der Bestellung , wenn wir die Konsole überprüfen. Siehst du, hier bekommen wir einen Fehler. Es sind 400 Fehler, was bedeutet, dass der Einkaufswagen nicht gefunden wurde. Oder denken Sie daran, dass wir in der Lektion „Einkaufswagen entfernen“ die Karte entfernen, indem wir die letzten Produkte aus der Produktreihe entfernen. Wir müssen unserer Karte ein Produkt hinzufügen und die Head-to-Cart-API von Postman öffnen Hier müssen wir das Token aktualisieren, es aus der Login-API kopieren und einfach in den Autorisierungsheader einfügen Gut. Lassen Sie uns jetzt die Anfrage senden. C, Produkte hinzugefügt. Es ist iPhone, nett. Lassen Sie uns nun die Seite aktualisieren und erneut die Zahlung probieren. Siehst du, hier bekommen wir unseren Kartenpreis. Wunderbar. Jetzt stornieren wir hier einfach die Zahlung und gehen zu Paper Tasting Dot STMLPage Gut. Lassen Sie uns jetzt unseren zweiten EPI verbessern Machen Sie sich keine Sorgen, wir müssen nicht viel tun. Wir werden einfach neue Bestelldaten in der Datenbank erstellen. Entfernen Sie die aktuelle Karte des Benutzers , wenn die Zahlung erfolgreich war. Hier erfüllen wir also die Bedingung I, dass die Zahlung erfolgreich erfasst wurde, also den Punktstatus der Antwort , den wir von dieser Capture-API erhalten Wenn die Zahlung gleich abgeschlossen ist, schreiben wir den Code hier in den I-Block Hier verursachen wir also Kosten. Neue Ordnung ist gleichbedeutend mit neuer Ordnung. Stellen Sie sicher, dass wir dieses Auftragsmodell eingeben. Gut. Jetzt müssen wir hier ein neues Ordnungsobjekt übergeben. Zuallererst fügen wir in dieser Reihenfolge den Benutzer hinzu, um die Punkt-Benutzerpunkt-Underscore-ID anzufordern Aber um Benutzerdetails zu erhalten, müssen wir unsere Middleware Good hinzufügen Danach brauchen wir Produkte, und darin lagern wir alle Produkte, die wir bestellen und darin lagern wir alle Produkte, die wir Und wie können wir diese Informationen erhalten? Richtig, wir bekommen es vom Backend. Also vor dieser Bestellung finden wir const, Card ist gleich wait cart dot find one Und hier im Objekt übergeben wir die Condition user an die request dot user dot underscore-ID Einfach bei der Bestellung von Produkten übergeben wir die Produkte im Warenkorb Danach die Gesamtzahl der Produkte in den Warenkorb, Punkt Gesamtzahl der Produkte. Als nächstes haben wir den Gesamtpreis, den Warenkorb bis zum Gesamtpreis im Warenkorb. Als Nächstes haben wir die Lieferadresse, die wir vom Frontend erhalten müssen. Lass es vorerst so wie es ist. Als Nächstes fügen wir den Zahlungsstatus zu bezahlt und Zahlungs-ID zur Punkt-ID der Antwort hinzu. Und wenn Sie zusätzliche Informationen speichern möchten, können Sie davon ausgehen, dass es wirklich von Ihnen abhängt. Wenn Sie ein neues Feld hinzufügen möchten, müssen Sie dieses Feld außerdem zu unserem Bestellschema hinzufügen. Vorerst geben wir alle Informationen weiter, die benötigt werden. Jetzt können wir diese neue Bestellung speichern. Warten Sie also ab, bis Sie die neue Bestellung 151. Bestellhistorie abrufen: Lassen Sie uns nun schnell andere APIs für die Bestellungen definieren. Lassen Sie uns den gesamten Bestellverlauf des aktuellen Benutzers finden. Nach dieser päpstlichen API fügen wir den Router-Punkt Get hinzu und zeigen auf den Schrägstrich die Benutzerinformationen zu finden, fügen wir außerdem die OS-Middleware und verwenden dann die Callback-Funktion Um die Benutzerinformationen zu finden, fügen wir außerdem die OS-Middleware hinzu und verwenden dann die Callback-Funktion mit Anfrage und Antwort. Hier erhalten wir direkt const orders is equal to a weight, order dot find, und hier übergeben wir das Vergleichsobjekt, Benutzer zu Anfrage Punkt Punkt Punkt Außerdem müssen wir diese Daten nach Datum kürzen. Punktkurzmethode, und hier im Objekt übergeben wir das Ergebnis bei zwei minus eins in absteigender Reihenfolge Hier aus der Sammlung von Bestellungen möchten wir nicht alle Füllungen anzeigen Punkt auswählen, abzüglich Benutzer, abzüglich Postleitzahl, abzüglich Zahlungsnummer, und am Ende können wir eine Antwort, den Punkt JSN senden und die Bestellungen hier weiterleiten. Lassen Sie uns diese API testen. Also erstellen wir auf Postman hier im CardWzPject einen neuen Ordner erstellen wir auf Postman hier im CardWzPject einen Im Ordner Bestellungen fügen wir eine neue Anfrage mit dem Namen Bestellverlauf hinzu Jetzt Endpunkt zu SCTP, Spalte Double für unseren Slash-Local-Host, Spalte 3.000 API-Slash Order und die Anfrage senden Leider haben wir vergessen, das JWT-Token weiterzugeben. Gehen Sie also zu den Überschriften. Zuerst geben wir die Autorisierung an den Inhaber weiter, und hier übergeben wir Also melden wir uns wieder an. Hier erhalten wir ein Token, kopieren dieses Token und fügen es in diese API ein und senden die Anfrage. Siehst du, hier bekommen wir die Daten der Bestellungen wunderbar. In der nächsten Lektion werden wir nun unsere letzte API für dieses Projekt definieren . 152. Status durch Admin aktualisieren: Lassen Sie uns eine API für den Administrator erstellen. Über diese API kann er oder sie den Status der Bestellung auf „In Bearbeitung“, „ C geliefert“ oder was auch immer sie wollen ändern . Also Router-Punktseite, weil wir nur eine Eigenschaft ändern wollen, nicht das ganze Dokument, und hier auf den Status der Schrägstrich-Reihenfolge D zeigen . Wir benötigen hier auch die ID der Bestellung, also übergeben wir die Spalte Order ID Also fügen wir OS-Middleware für das JWT-Token hinzu. Und hier müssen wir auch die Benutzerregel überprüfen. Ist es Admin oder nicht? Also fügen wir hier Jack Rule hinzu, Middleware, C Auto Input hat nicht funktioniert Und darin müssen wir die Rolle admin übergeben. Geben wir nun oben diese Middleware ein. Const, Prüfrolle ist gleichbedeutend damit, dass wir einen Ordner nach oben gehen, Middleware, und Wir verwenden das bereits in der Produktroute. Wenn Sie es vergessen haben, können Sie sich den Routencode ansehen. Jetzt übergeben wir einfach Acing-Funktion mit Anfrage und Antwort. Großartig. Jetzt erhalten wir zuerst die Bestellung aus der Sammlung der Bestellungen. SecctuDated Order entspricht Await Order Dot Find By ID. Stattdessen können wir auch fine by ID und Update verwenden Hier beim ersten Argument müssen wir die Bestellungs-ID übergeben, das ist Request Dot Params Dot Order ID Und beim zweiten Argument übergeben wir das Objekt mit den aktualisierten Werten Der Status der Objektreihenfolge wird also auf einen beliebigen Wert beim Mittelwert übergeben. Und wie können wir diesen Wert direkt aus dem Anfragetext abrufen ? Hier vor der aktualisierten Bestellung hatten wir den Kostenstatus, der der Anfrage, dem Hauptteil der Anfrage, dem Punktstatus, entsprach. Und hier geben wir den Bestellstatus an den Status weiter. Und danach, beim dritten Argument, übergeben wir object with new an true. Weist Mangos an, neue aktualisierte Daten in dieser Reihenfolge zurückzugeben . Das haben wir bereits im Abschnitt Mongo DB gesehen. Jetzt ist es möglich, dass wir keine Bestellung gefunden haben. Wenn die aktualisierte Bestellung nicht verfügbar ist, geben wir die Antwort zurück, Punktstatus 404 Punkt Json-Objekt, Nachrichteneigenschaft zur Bestellung nicht gefunden Schließlich übergeben wir einfach die Antwort Punkt json, Objekt, Nachrichteneigenschaft an den Auftragsstatus, der erfolgreich aktualisiert wurde, und danach die aktualisierte Bestellung an die aktualisierte Bestellung Oder wir können das auch entfernen und fertig. Wenn Sie etwas ändern möchten, können Sie diese Änderungen Ihren Bedürfnissen entsprechend vornehmen. Lassen Sie uns diese API testen, Postman öffnen, eine neue Anfrage mit dem Namen Bestellstatus aktualisieren hinzufügen der Bestellsammlung eine neue Anfrage mit dem Namen Bestellstatus aktualisieren hinzufügen, Anfrage an Seite, Endpunkt zur Slash-API, Bestellung auswählen Endpunkt zur Slash-API, Wählen Sie auch Seite und Bestellstatus aus, und hier fügen wir die Bestell-ID hinzu Aus dem vorherigen API-Aufruf kopiere ich einfach diese Bestell-ID und füge sie in den Endpunkt ein. In unserer API übergeben wir jetzt den Header an die Autorisierung, und wir kopieren auch den Wert aus der vorherigen API und fügen ihn hier ein. Senden Sie die Anfrage. Hier erhalte ich eine Fehlermeldung. Lass mich das Terminal überprüfen. Ich weiß, Check Role Error. Also oben habe ich einen Tippfehler, also ändere ich das, um die Rolle zu überprüfen Die Änderungen und die Anfrage abschicken. Sehen Sie, hier erhalten wir den Fehler 403 Forbidden, access denied only admin. Wir müssen die Benutzerregel für dieses Konto ändern. Gehen Sie zu MongoIVCompass, öffnen Sie die Benutzersammlung und suchen Sie Ihr Konto , mit dem Sie sich angemeldet haben Abgesehen davon ändere ich einfach die Regel, um sie vom Administrator zu aktualisieren. Jetzt müssen wir das JSN-Webtoken erneut generieren. Loggen Sie sich ein und senden Sie die Anfrage, kopieren Sie dieses Token und ersetzen Sie unser Token durch dieses neue Token Jetzt müssen wir in Body Raw auch das JSON-Objekt mit dem Feldstatus an IB übergeben und die Anfrage senden. Sehen Sie, hier erhalten wir eine Erfolgsmeldung und auch aktualisierte Bestelldaten. Wunderbar. 153. Bereinigen von Code für Indexdatei: Derzeit ist unsere Anwendung also sauber. Lass dich einfach mit der Indexpunkt-JS-Datei durcheinander bringen. Wir können sehen, dass das nicht sauber aussieht. Ganz oben benötigen viele, viele Funktionen für die Eingabe. Danach haben wir Code zum Erstellen von Loggern und globalen Fehlerhandlern Danach haben wir eine Verbindung zu MongoDB, dann wenden wir einige Middlewares und einige Routen an und hören endlich auf unseren Server In dieser Index-Punkt-Datei passieren viele Dinge. Wir können es sauber machen und jede Logik in einer separaten Datei speichern. Es ist nicht verpflichtend, aber viele Entwickler tun das, aber das kann Sie verwirren Es gibt also einen anderen Weg Anstatt den Code zu trennen, können wir ihn sauber machen, indem wir Befehle hinzufügen und sie voneinander trennen Ich kann trotzdem wählen, es hängt ganz von dir ab. Lass mich dir meinen Weg zeigen. Oben haben wir einige Konfigurationen, also halten Sie sich an den Befehl global config. Danach haben wir Express, Mongoose, Winston und natürlich Wir fügen Befehle und Module von Drittanbietern hinzu . Dass wir diese App haben. Wir wollen es jetzt nicht anfassen. Oben fügen wir alle unsere Eingaben hinzu. Einige davon leiten alle Importe über diese App weiter und fügen Kommentare, benutzerdefinierte Module oder, du kannst sagen, Routenmodul Es gibt keine Regeln für den Kommentar. Du kannst den Kommentar schreiben, wie auch immer du ihn nennen möchtest. Denken Sie daran, dass dieser Kommentar in Zukunft von Ihnen gesehen werden wird. Zu diesem Zeitpunkt werden Sie also nicht verwirrt. Danach können wir den Befehl für diese App hinzufügen und die Express-App initialisieren Jetzt haben wir hier diesen Logger und auch unten haben wir diesen Port, also können wir ihn hierher verschieben und ihn konstant nennen Danach fügen wir für diese nicht abgefangene Ausnahme catch hinzu und behandeln synchrone Fehler, die nicht in try-catch-Blöcken abgefangen wurden . Bei unbehandelten Ablehnungen fügen wir Catch-UnhandlePmise-Ablehnungen hinzu Durch diese Kommentare können wir uns auch nach der langen Zeit daran erinnern, warum wir den Code hinzugefügt haben Danach haben wir hier eine Datenbankverbindung. Dann haben wir diese beiden Middlewares, also Middleware, für statische Dateien fügen wir serve-statische Dateien hinzu wir Dann fügen wir für Routen API-Routen hinzu . Danach haben wir Fehler-Middleware, also fügen wir einen benutzerdefinierten Fehlerhandler und starten endlich den Server Wenn wir nun unsere JS-Datei mit dem Indexpunkt überprüfen, sehen Sie, jetzt sieht sie ein bisschen sauberer Ja, die Trennung des Codes wird das Ganze sauberer machen, aber es kann uns auch verwirren Sie können den Code auch trennen. Ich bin total auf dich angewiesen. Also hier ist unser E-Commerce-Projekt vorbei. Im nächsten Abschnitt werden wir uns nun mit unserem dritten Projekt befassen, bei dem eine Social-Media-Anwendung handelt. 154. Abschnitt 13 - Einführung in Projekt 03: Willkommen im neuen Abschnitt des ultimativen Node JS-Kurses. In diesem Abschnitt werden wir ein brandneues Projekt erstellen . Kannst du es erraten? Ja, wir werden das Backend für Social-Media-Anwendungen mit NodeJS erstellen Backend für Social-Media-Anwendungen mit NodeJS Wir werden dieses Projekt unseren Linky Pi nennen. Dieses Projekt ist eines meiner Lieblingsprojekte. Lassen Sie mich Ihnen erklären, was wir in diesem Projekt behandeln werden. In diesem Projekt werden wir eine API für Follower erstellen, die Folgendes ermöglichen, einschließlich des Sendens von Anfragen an private Konten Versendens von E-Mails aus unserer Anwendung. Außerdem werden wir APIs für Beiträge mit Likes und Kommentaren erstellen . Dann werden wir eine API für Chat, persönlichen Chat und Gruppenchat erstellen . Außerdem werden wir Chat-Erlebnisse in Echtzeit mit Socket und vielen anderen Dingen anwenden . Wenn Sie dieses Projekt wirklich verstehen und umsetzen, wird sich Ihr Portfolio wirklich verbessern. Das wird Spaß machen. Freust du dich darauf? Ich freue mich riesig und hoffe du auch. Also lasst uns anfangen, dieses tolle Projekt zu bauen. 155. Einrichten von Projekt 03: Lassen Sie uns jetzt unser neues Projekt einrichten. Also erstelle ich im Projektordner einen neuen Ordner namens Linky File Lassen Sie uns nun diesen Ordner im VS-Code öffnen. Gut. Im Terminal schreiben wir NPM in Y zur Initialisierung und zum Erstellen des Pakets Lassen Sie uns außerdem die Index-Dogs-Datei erstellen, die unsere Hauptdatei ist Wie wir wissen, werden wir nun unsere Anwendung in dieser Datei einrichten . Und dafür benötigen wir einige Pakete. Also schreiben wir im Terminal NPM, install, Express, Mongos for Mongo DB, Course zur Aktivierung des Kurses Außerdem fügen wir Dt NV hinzu, wir brauchen das und drücken Enter Es wird einige Zeit dauern. Gut. Lassen Sie uns nun schnell unsere Anwendung einrichten. Zuallererst entspricht Const Express der Anforderung von Express Danach ist st app gleich, hier rufen wir Express auf, um diese App abzuhören, wir fügen hier Punkt LISN Hier beim ersten Argument müssen wir den Port übergeben Nach const app definieren wir einen weiteren Const-Port, der der Verarbeitung eines neuen Punktports oder 3.000 oder 5.000 entspricht , was auch immer Sie möchten In der Produktion wird unsere Anwendung den Port von der ENV-Port-Variablen übernehmen Beim zweiten Argument müssen wir die Callback-Funktion übergeben, die einfach das Punktprotokoll der Konsole anzeigt In diesem Fall läuft der Server auf dem Port, und hier drucken wir unseren Port Dollar Calibracets Außerdem müssen wir einige App-Middleware hinzufügen. Oberster Kurs ist gleichbedeutend mit Pflichtkurs. Und hier fügen wir App Punkt G hinzu, rufen Sie einfach hier Kurs an. Und danach verwenden wir für die Übergabe von Daten in JSON app.us, Express Dot Ohne diese Middleware können wir keine Daten in der Anfrage des Hauptteils abrufen Sehen wir uns nun diese Implementierung an. Sehen Sie sich die Änderungen an und im Terminal nodemon index dot js C, Server läuft. Großartig. Lassen Sie uns nun auch diese Anwendung mit der Datenbank verbinden. Dafür brauchen wir Mangos. Im Großen und Ganzen entsprechen die Kosten für Mangos also dem Bedarf an Mangusten Nach dieser Variablen fügen wir nun Mongoose Dot Connect hinzu Hier müssen wir die Verbindungszeichenfolge unserer Datenbank übergeben die Verbindungszeichenfolge unserer Datenbank Bisher haben wir die Zeichenfolge hier direkt übergeben, aber das ist wenig riskant. Machen wir das sicher. In unserem Projekt erstellen wir eine neue Datei namens dot ENV. In dieser Datei erstellen wir eine neue Variable namens DVes equal do, Mongo DB, column, double for slash, local host, column 27017, was unsere lokale column 27017, Mongo B-Verbindungszeichenfolge ist Sie können das vom Mongo Divi Compass abrufen und danach weniger weiterleiten. Und hier geben wir unseren Projektnamen ein, unseren Slinky Pi. Um diese Umgebungsvariable zu verwenden, müssen wir nun D, E und V konfigurieren. In der Index-Gs-Datei, ganz oben, benötigen wir also den Punkt Env dot config Was werden wir in der Mangos Dot Connect-Methode übergeben? Richtig, wir übergeben den Prozesspunkt w Punkt d. Wir können sehen, wie einfach das wird nur ein oder zwei Knotenanwendungen erstellt Dies wird sich allmählich verbessern und Sie werden sich mit Node wohler fühlen. Wie wir wissen, dieser Mangos Dot Connect ein Versprechen zurück, also müssen wir dieses Versprechen einhalten Punkt, dann Methode, Callback-Funktion, und hier konsultieren wir einfach das Punktprotokoll, Mango Div hat erfolgreich eine Verbindung hergestellt Außerdem fügen wir nach dieser Methode die Catch-Methode für die Behandlung der Ablehnung von Zusagen Hier erhalten wir einen Fehler, eine Fehlerfunktion , und wir konsolen das Punktprotokoll, Verbindung zu Mongo Di ist fehlgeschlagen und wir halten diesen Fehler einfach fest Lassen Sie uns auch diese Implementierung überprüfen. Speichern Sie diese Datei und sehen Sie im Terminal, hier wird Mongo Di B erfolgreich verbunden Im Moment ist das okay. Wir werden Winston und Lager ganz am Ende dieses Projekts hinzufügen , wenn wir sie benötigen. In der nächsten Lektion werden wir nun unser Benutzermodell erstellen 156. Benutzermodell erstellen: Jetzt ist Trainingszeit. Das ist also das kleine Beispiel eines Benutzerdokuments. Auf dieser Grundlage müssen Sie ein Benutzerschema erstellen. Sie können sich auch den vorherigen Projektcode ansehen. Mach dir darüber keine Sorgen. Nehmen Sie sich also etwas Zeit und beenden Sie diese Übung. Und danach schau dir die Lösung an. Sehen wir uns jetzt die Lösung an. In unserem Projekt erstellen wir also einen neuen Ordner namens models, und darin erstellen wir eine neue Datei namens users dot js. Gut. Zuallererst importieren wir die Kosten, Mangos entsprechen dem Bedarf an Mangos Danach definieren wir const, das Benutzerschema entspricht neuen Mango-Punktschema und hier übergeben wir das Schema im Objekt Zuallererst benötigen wir für unsere Social-Media-App den Wert username für das Objekt, den Typ, die erforderliche Zeichenfolge und den Wert true Außerdem wollen wir keinen Leerraum im Benutzernamen haben. Dafür geben wir Stream an true weiter. Auch die mittlere Länge bis drei und die maximale Länge, sagen wir 30 oder 40, was auch immer Sie nehmen möchten. Nach dem Benutzernamen fügen wir E-Mail zum Objekt hinzu, Typ zur Zeichenfolge, required auf true, unique auf true, dream auf true, weil wir auch keinen Platz in der E-Mail benötigen. Und wir konvertieren unsere E-Mail immer in Kleinbuchstaben, also auch Kleinbuchstaben in True Danach benötigen wir das Passwort für das Objekt, den Typ für die Zeichenfolge und für required den Wert true Wir möchten auch einige Profildetails des Benutzers speichern, und diese Details kann der Benutzer über Einstellungen wie Instagram hinzufügen. Es sollte nicht verpflichtend sein. Wir können also einen einfachen Profilnamen erhalten , der vom Typ zu einer Zeichenfolge ist, und wir brauchen ihn nicht eindeutig und wir brauchen ihn auch nicht verpflichtend, also fügen wir hier keine Validatoren Jetzt Bio zu Objekt, Typ zu Zeichenfolge. Und die maximale Länge beträgt 150. Als Nächstes fügen wir Konten, Status, Typ zur Zeichenfolge, ähm, zum Array hinzu. Hier übergeben wir die Werte active, next, disable und bend. Wir setzen den Standardwert auf aktiv. Als Nächstes können wir verifizieren, dass Objekt, Typ auf Bullian und der Standardwert auf Falsch steht verifizieren, dass Objekt, Typ auf Bullian und der Standardwert auf Falsch Danach fügen wir auch is private, object, type zu bullian und standardmäßig zu Als Nächstes kann der Benutzer den Geschlechtstyp zur Zeichenfolge und um zum Array hinzufügen, und hier übergeben wir männlich, weiblich, nicht binär, oder der Benutzer kann sagen, lieber nicht sagen Als Nächstes nehmen wir auch die Telefonnummer zum Objekt und den Typ zur Zeichenfolge, weil der Benutzer hier die Landesvorwahl hinzufügen kann. Und hier schneiden wir auch auf wahr zu. Nun, was wir hinzufügen können, ich denke, das ist vorerst genug. Wenn wir in Zukunft mehr Details benötigen, können wir in Zukunft weitere Felder hinzufügen. Hier haben wir unser Schema. Lassen Sie uns nun ein Benutzermodell erstellen. Der Cost-User entspricht also dem Punktmodell von Mongos. Hier übergeben wir einen singulären Namen, nämlich user. Und zweitens übergeben wir das Schema, das Benutzerschema ist Um nun mit diesem Benutzermodell zu interagieren, müssen wir es exportieren. Der Export von Modulen entspricht also dem Benutzer und ist fertig. In der nächsten Lektion werden wir nun eine API für die Registrierung eines neuen Benutzers erstellen . 157. Registrieren eines neuen Benutzers: Lassen Sie uns unser erstes EPI für diese Anwendung erstellen. Hier erstellen wir einen neuen Ordner namens Routes und in diesem Ordner erstellen wir eine neue Datei namens users dot js Gut. Jetzt müssen wir zunächst einen Router erstellen. Wir importieren Express, was Express erfordert, und danach entspricht der Cost-Router dem Express-Punkt-Router. Am Ende modulieren wir einfach, Punktexporte gleich Router sind. Fügen wir nun diese Route zu unserer Haupt-Indexpunkt-JS-Datei hinzu. Nach diesen Eingaben geben wir die Kosten für Benutzerrouten ein, die dem Wert „ Erforderlich“ entsprechen. Hier gehen wir zum Ordner Routes mit Schrägstrich für Benutzer. Jetzt fügen wir nach den Middlewares den App-Punkt U hinzu. Hier an der ersten Position fügen wir das Präfix für diese Route hinzu Also API-Benutzer mit einem Schrägstrich. Und hier fügen wir einfach Benutzerrouten hinzu. Lassen Sie uns nun die Anmelde-API erstellen. Also zurück zur Route-Datei der Benutzer. Hier fügen wir Router-Punktpost und Zeiger zum Schrägstrich und dann die asynchrone Callback-Funktion mit Anfrage Jetzt müssen wir zunächst die Füllungen aus der Anfrage des Hauptteils abrufen Füllungen aus der Anfrage des Aber die Frage ist, welche Füllungen wir für die Registrierung eines neuen Benutzers benötigen. Für Social-Media-Anwendungen benötigen Unternehmen also meistens Mindestdaten für die Registrierung eines neuen Benutzers. Denn wenn wir zehn bis 15 Felder als ersten Schritt des Prozesses ausfüllen, werden nicht viele Personen ein Konto in unserer Social-Media-Anwendung erstellen . Es ist also besser, nur die Daten zu verwenden, die für unser Schema erforderlich sind. Außerdem kann der Benutzer diese Daten problemlos eingeben Wenn Sie feststellen, fast alle Social-Media-Anwendungen nur den Namen, E-Mail-ID des Benutzers und das Passwort. Nur diese Füllungen. Andere Füllungen werden später aus den Benutzereinstellungen übernommen. Aus diesem Grund ist es sehr einfach, ein Konto in Social-Media-Apps zu eröffnen . Hier nehmen wir vom Benutzer nur drei Füllungen entgegen. Kostenobjekt entspricht dem Hauptteil der Anfrage Hier erhalten wir den Benutzernamen, die E-Mail-Adresse und das Passwort. Wenn wir diese Füllungen nicht erhalten, geben wir einen Fehler zurück. Wenn also der Benutzername nicht gültig ist oder die E-Mail-Adresse nicht verfügbar ist oder das Passwort nicht verfügbar ist, geben wir eine Antwort mit dem Status 400 zurück und übergeben JSON-Objekt mit der Fehlermeldung erforderlichen Formularfelder fehlen. Danach geben wir auch den Erfolg an Stürze weiter. Dieses Erfolgsfeld hilft dem Frontend, Fehler anzuzeigen. Jetzt stellen wir auch hier fest, dass der Benutzer bereits in unserer Datenbank verfügbar ist oder nicht. Der Const-Benutzer entspricht einer Gewichtung. Hier fügen wir das Benutzermodell C hinzu, Auto Input funktioniert Punkt Fine one Object Und hier benötigen wir Dollar oder Operator für die Anordnung, und hier übergeben wir mehrere Bedingungen in separaten Objekten. Unsere erste Bedingung ist also von Benutzername zu Benutzername und zweitens E-Mail zu E-Mail. Wenn eine dieser Bedingungen zutrifft, erhalten wir diesen Benutzer. Also hier bestehen wir die Bedingung. Wenn der Benutzer verfügbar ist, geben Sie die Antwort mit dem Statuscode 400-Punkt-Json-Objektnachricht zurück Statuscode 400-Punkt-Json-Objektnachricht . Hier übergeben wir die Bedingung. Der User-Punkt-Benutzername entspricht unserem Benutzernamen. Wenn dies zutrifft, ist das Fragezeichen und Benutzername bereits vergeben, andernfalls ist die E-Mail-Adresse bereits registriert. Und danach geben wir den Erfolg an Stürze weiter. Wenn der Benutzer noch nicht registriert ist, erstellen wir einfach einen neuen Benutzer. Die Kosten für einen neuen Benutzer entsprechen also den Kosten für einen neuen Benutzer. Hier übergeben wir das Benutzerobjekt, Benutzernamen an den Benutzer, oder wir können diese E-Mail einfach an E-Mail und das Passwort an das Passwort entfernen . Wie wir wissen, geben wir hier das Passwort nicht im normalen Text weiter, wir müssen es verschlüsseln Und dafür, welches Paket wir verwenden, versuchen Sie es sich zu merken. Ja, es ist Krypta. Also NPM installieren, verschlüsseln und Enter drücken. Gut, minimiere das Terminal und in unserer Routes-Datei oben ist const, crypt entspricht require crypt Jetzt erstellen wir in unserer API Cost het pass is equal to await, wir erzeugen Punkt s. Und hier beim ersten Argument müssen wir unser Passwort übergeben, und beim zweiten Argument übergeben wir die Salt-Zahl, die Jetzt können wir einfach das Passwort auf das Passwort setzen. Danach können wir einfach auf den neuen Benutzer warten Punkt c. Was wollen wir tun, nachdem wir einen neuen Benutzer erstellt haben? Richtig, wir generieren ein JWT-Token für diesen Benutzer, und dafür benötigen wir das JSN-Web-Token-Paket Also installiert NPM das JSON-Webtoken der Rate 9,0 0,2 und drückt die Eingabetaste Gut. Minimiere nun dieses Terminal und lass uns dieses JSN-Webtoken oben eingeben Sacst JWT entspricht require JSN bgon. Jetzt, wie wir es zuvor getan haben, erstellen wir eine Funktion zum Generieren von JSN WebTgon, weil wir auch in unserer Login-API sacstGenerate das Token benötigen, das entspricht hier, wo wir die Daten als Parameter-Fehlerfunktion erstellen wir eine Funktion zum Generieren von JSN WebTgon, weil wir auch in unserer Login-API sacstGenerate das Token benötigen, das entspricht hier, wo wir die Daten als Parameter-Fehlerfunktion erhalten. Und dabei geben wir einfach das JWT-Punktzeichen zurück. Zuerst übergeben wir die Daten und danach müssen wir den geheimen Schlüssel von JWT übergeben Also verarbeiten Sie den Punkt und den JWT-Unterstrichschlüssel. Jetzt müssen wir diese Schlüsselvariable zu unserer ENV-Datei hinzufügen. JWT-Unterstrichschlüssel entspricht hier, wir können jeden Schlüssel übergeben , Zum Beispiel der JWT-Sicherheitsschlüssel. Verwenden Sie das nicht für die Produktion. Ich gebe es nach dem Zufallsprinzip weiter. Sie müssen Ihren eigenen Sicherheitsschlüssel erstellen. Außerdem füge ich hier kein Ablaufdatum für unser Token hinzu, da das Ablaufen des Tokens für Social-Media-Anwendungen nicht gut ist. Benutzer möchten schnell auf unsere Website zugreifen. Stellen Sie sich auch vor, Sie besuchen Instagram jeden Tag und jeden Tag müssen Sie sich anmelden. Sollten Sie diese App für eine lange Zeit verwenden, nein. Als Entwickler müssen wir also immer aus der Perspektive des Benutzers denken. In unserem API-Route-Callback entspricht das Const-Token nun einfach dem Generate-Token Hier unten entferne ich Typo aus meinem Jetzt müssen wir in unserer Funktion zum Generieren von Token die Benutzerdaten übergeben, müssen wir in unserer Funktion zum Generieren von Token die Benutzerdaten übergeben wir zu unserer Token-Payload hinzufügen möchten Also Objekt, Unterstrich ID zu neuem Benutzerpunkt, Unterstrich-ID und Benutzername zu neuerem Punkt Und am Ende setzen wir einfach den Antwortpunktstatus auf 01 zurück, um den neuen Datenerstellungspunkt GSN zu verwenden, und wir übergeben dieses Token direkt Lassen Sie uns nun diese API probieren. Also öffne Postman. Hier erstellen wir eine neue Kollektion, leere Sammlung für unser neues Projekt namens Our Linky Fi Und in diesem Ordner fügen wir einen neuen Ordner namens users hinzu, und in diesem Ordner fügen wir eine neue Anfrage hinzu, genannt register, einen neuen Benutzer Gut. Geben Sie nun den Typ zum Posten und verweisen Sie auf SDDP, Spalte mit doppeltem Schrägstrich, lokaler Host, Spalte 3.000 Schrägstrich, API-Slash-Benutzer Spalte 3.000 Schrägstrich, API-Slash-Benutzer Und senden Sie die Anfrage. Siehst du, hier bekommen wir die Fehlermeldung, 500 kann fehlende Füllungen nicht destrukturieren Lassen Sie uns alle benötigten Formularausfüllungen übergeben. Wählen Sie body, raw und hier übergeben wir unser JSON-Objekt. Benutzername zum Codieren, Unterstreichen, Segnen. Das ist übrigens mein Instagram-Handle. Nächste E-Mail zum Code auf der roten Gmail.com. Und zuletzt senden wir das Passwort 212-34-5678 Siehst du, hier bekommen wir Token als Antwort. Und wenn wir unsere Datenbank überprüfen, erhalten wir hier unsere verknüpfte Datenbank, und in der Sammlung des Benutzers, sehen Sie, hier erhalten wir auch neue Benutzerdaten Außerdem setzen wir den Kontostatus auf „ Aktiv“, „verifiziert“ und „ Privat“. Beides ist Wir haben all diese Werte als Standard in unserem Benutzerschema festgelegt. Außerdem habe ich hier vergessen, für diesen Benutzernamen unique zu true hinzuzufügen , da wir möchten, dass dieser Benutzername für alle unsere Benutzer eindeutig ist. 158. Übung - Benutzeranmeldungs-API: Lass uns jetzt eine weitere Übung machen. In dieser Übung müssen Sie eine Login-API erstellen, die den Benutzernamen und das Passwort des Benutzers überprüft. Das haben wir bereits in unserem vorherigen Projekt gemacht, aber ich möchte , dass Sie das selbst machen. Sie können diesen Bestätigungskennwortcode sehen, aber den Rest der API müssen Sie selbst erstellen. Ich weiß, dass du das kannst, also führe diese Übung und was ist dann die Lösung. 159. Lösung – Benutzeranmeldungs-API: Ich hoffe, Sie beenden die Übung oder versuchen, sie zu lösen. Sehen wir uns nun die Lösung an. Also Router, Punkt Post und Zeiger auf Slash-Login Und hier übergeben wir asynchrone Funktion mit Anfrage und Antwort In dieser Callback-Funktion erhalten wir nun zunächst die Daten aus dem Anforderungstext Das Kostenobjekt entspricht also dem Hauptteil der Anfrage. Und hier kommen wir zu Benutzername und Passwort. Jetzt können wir die Bedingung bestehen, wenn der Benutzername nicht verfügbar ist oder das Passwort nicht verfügbar ist, dann geben wir einen Fehler zurück. Also Antwort zurückgeben, Status, 400 Json. Hier geben wir den Objekterfolg an false weiter und Meldung an, dass Sie bitte einen Benutzernamen und ein Passwort angeben müssen. Danach werden wir den Benutzer mit diesem Benutzernamen finden . Cost user entspricht await user dot Fine one. Hier im Objekt übergeben wir den Benutzernamen an den Benutzernamen, oder wir können ihn auch entfernen. Jetzt ist es möglich, dass wir keinen Benutzer mit dem angegebenen Benutzernamen finden . Wenn der Benutzer nicht verfügbar ist, geben wir den Antwortstatus, das 400-Punkt-Json-Objekt bei Erfolg auf False und die Nachricht auf ungültige Anmeldeinformationen zurück. Wenn wir nun den Benutzer gefunden haben, müssen wir das Passwort mithilfe der BCRP-Bibliothek vergleichen Zweitens entspricht ein gültiges Passwort await, B crypt Zuerst übergeben wir das Eingabekennwort, das im Hauptteil der Anfrage im Frontend angezeigt wird, und beim zweiten Argument übergeben wir das Benutzer-Punktpasswort Wir übergeben hier einfach eine weitere Bedingung das gültige Passwort falsch oder nicht verfügbar ist, dann den Antwortpunktstatuscode 401 zurück , der für ein ungültiges oder fehlendes Authentifizierungstoken steht Außerdem senden wir das Json-Objekt erfolgreich an false und eine Nachricht an ungültige Anmeldeinformationen. Wenn wir hier angeben, dass das Passwort nicht übereinstimmt, bedeutet das, dass wir einen Benutzer gefunden haben und nur das Passwort nicht übereinstimmt. Außerdem denke ich, dass wir hier den gleichen Statuscode für den Benutzer nicht gefunden übergeben müssen. Ändern Sie diese 400 mit 401 und die Meldung lautet ebenfalls, dass die Anmeldeinformationen ungültig sind. Wenn das Passwort nun verifiziert ist, können wir ein neues Token generieren und es in der Antwort senden. Das const-Token entspricht also dem generierten Token. Hier übergeben wir ein Datenobjekt mit Unterstrich-ID an die Benutzerpunkt-Unterstrich-ID und den Benutzernamen an den Benutzerpunkt-Benutzernamen Bei der letzten Antwort sendet Dot Json dieses Token. Das ist es. Lassen Sie uns nun diese API probieren. Im Postman erstellen wir eine neue Anfrage namens Login a user Hier wählen wir die SDTP-Methode, um den Endpunkt an SDTP zu senden, Column Double for oder Slash, Local Host, Column 3.000, Slash-API, Slash-Benutzer-Slash-Login und senden die Anfrage Column Double for oder Slash, Local Host, Column 3.000, Slash-API, Slash-Benutzer-Slash-Login und senden die Anfrage. Sehen Sie, hier erhalten wir die Fehlermeldung, dass der Eigenschaftsbenutzername nicht destrukturiert werden kann. Also hier müssen wir die Daten im Hauptteil übergeben. Wählen Sie body, raw, hier übergeben wir das Objekt mit dem Benutzernamen zum Code, Segen und dem Passwort an 12345678 und senden Siehst du, hier bekommen wir die Meldung, ungültige Zugangsdaten, weil ich einen falschen Benutzernamen übergebe Ich ändere meinen Benutzernamen in den Originalcode, unterstreiche segne und schicke die Anfrage ab Siehst du, hier bekommen wir das Token, was bedeutet, dass unsere API gut funktioniert 160. Implementieren von Zugriffstoken und Aktualisieren von Token [AKTUALISIERT]: Wie wir in unserem vorherigen Projekt zur Registrierung und Anmeldung gesehen haben, kehren wir nun zu Tokens zurück, einem 14-Zugriffstoken, was einem Sort-Leaf- oder SOT-Ablauf entspricht, und einem anderen ist das Refresh-Token, und einem anderen ist das Refresh-Token, dem es sich um ein Long Leaf- oder Long-Expiration-Token handelt. Kurz gesagt, wenn das Zugriffstoken abgelaufen ist, sendet das Frontend eine Anfrage an einen Endpunkt wie Repress Beim Repress überprüfen wir das Aktualisierungstoken und geben dann ein neues Zugriffstoken zurück Das ist die Logik. Lassen Sie uns das jetzt schnell in unserem dritten Projekt implementieren. Unten haben wir also die Funktion zum Generieren von Tokens. Wir können dies umbenennen , um Token zu generieren. Jetzt müssen wir von hier aus zu Tokens zurückkehren. Also speichern wir dieses erste Token in der Variablen Excess Token, und dann legen wir hier fest, dass es in der Eigenschaft abläuft , sagen wir, 1 Stunde beträgt. In der Produktion können wir Ablauf von überschüssigen Tokens auf drei oder vier Stunden erhöhen. Aber um diese Anwendung einfach zu testen, lege ich keine Ablaufzeit für überschüssige Token fest. Nochmals, ich sage es Ihnen nur für die Tests, damit wir für unsere kommenden APIs kein weiteres überschüssiges Token generieren müssen . Duplizieren Sie nun diese Zeile, ändern Sie sie als Variable, um das Token zu aktualisieren, ta, wir ändern sie in Objekt, Unterstrich-ID in Datenpunkt-Unterstrich-ID Und hier fügen wir die Ablaufszene zu 30 Tagen hinzu, weil es sich hier endlich um eine Social-Media-Anwendung handelt Wir ändern einfach ein Objekt mit Zugriffstoken und Aktualisierungstoken Außerdem legen wir unterschiedliche geheime Schlüssel für das Zugriffstoken und das Aktualisierungstoken fest. Es ist nicht notwendig, aber es ist besser, dass wir das tun. NV-Datei an der Stelle des JWT-Schlüssels, fügen wir das Zugriffstoken und den Schlüssel hinzu und definieren danach eine weitere Variable, Repress-Token. Der Schlüssel entspricht unserem geheimen Speichern Sie dies und kehren Sie zu unserer User-Out-Datei zurück. Hier ändern wir den geheimen Schlüssel in einen Zugriffstoken-Schlüssel. Und für das Aktualisierungstoken ändern wir es, um den Token-Schlüssel zu aktualisieren. jetzt in der Anmelde-API den Namen dieser Funktion, Ändern Sie jetzt in der Anmelde-API den Namen dieser Funktion, um Token zu generieren. An der Stelle, an der das Token abgerufen wird, erhalten ein Objekt und wir destrukturieren überschüssiges Token und aktualisieren das Token von dieser Funktion aus Gut. Nun, hier sind wir ein überschüssiges Zeichen in der Antwort. Können Sie mir auch sagen, was wir tun müssen, bevor wir das überschüssige Token in der Antwort senden? Richtig. Wir müssen das Aktualisierungstoken in der Sammlung des Benutzers und dann das Aktualisierungstoken nur im SDTP-Cookie verkaufen Hier warten wir also auf Bcrt Punkt s. Hier übergeben wir das Aktualisierungstoken, Koma, wir übergeben hier Salz Dieser Ausdruck gibt das Token zurück. Also speichern wir es in einer Variablen namens Nu, der ein Token darstellt. Danach entspricht das Benutzer-Punkt-Repress-Token dem Wert New hat das entspricht das Benutzer-Punkt-Repress-Token dem Wert New hat Dann müssen wir auf den Benutzerpunkt C warten. Jetzt müssen wir nur noch das Aktualisierungstoken im Cookie setzen, um uns daran zu erinnern, wie wir den Antwortpunkt Cookie verwenden Hier übergeben wir den Namen des Cookies, bei dem sich um ein Aktualisierungstoken handelt. Hier fügen wir das Aktualisierungstoken hinzu und beim dritten Parameter müssen wir das Konfigurationsobjekt übergeben. Hier ist die erste Eigenschaft nur SDDP, die wir auf true und secure auf false setzen, aber stellen Sie sicher, dass Sie sie für die Produktion auf wahr setzen Dieselbe Site zum Streamen für dieselbe Domain, aber derzeit setzen wir sie auf Keine, und endlich können wir Nachrichten an 30 Tage in 24 Stunden in 60 Minuten in 60 Sekunden in 1.000 Millisekunden weiterleiten 60 Minuten in 60 Sekunden 1.000 Millisekunden Jetzt müssen wir einfach diese Logik von der Token-Generierung bis zum Senden der Antwort kopieren diese Logik von der Token-Generierung bis zum Senden und sie hier in diese API einfügen Und hier müssen wir nur die Benutzerpunkt-Unterstrich-ID in die neue Benutzerpunkt-Unterstrich-ID , den neuen Benutzer-Punkt-Benutzernamen, den neuen Benutzer, das Punkt-Aktualisierungstoken und auch Nwuser Dot Save ändern nur die Benutzerpunkt-Unterstrich-ID in die neue Benutzerpunkt-Unterstrich-ID , den neuen Benutzer-Punkt-Benutzernamen, den neuen Benutzer, das Punkt-Aktualisierungstoken und auch Nwuser Dot Endlich fügen wir in der Antwort auch den Status 201 hinzu 161. Aktualisieren und Abmelden von Route [AKTUALISIERT]: Lassen Sie uns nun eine Route für die Aktualisierung erstellen, also Route dot post slash refresh und hier fügen wir ASN-Callback-Funktion mit Jetzt müssen wir zunächst Aktualisierungstoken aus dem Cookie abrufen Das Const-Benutzer-Aktualisierungstoken entspricht also dem Request Dot Cookie, Dot Refresh Token Hier bekommen wir dieses Cookie nicht , weil wir in unserer Express-Middleware keine DDT Cookie-Parser-Middleware hatten, und dafür benötigen wir das Cookie-Parser-Paket, öffnen das Terminal und hier schreiben wir NPM install Cookies Parser und drücken Enter. Gut. Öffnen Sie jetzt die Index Dot GS-Datei. Oben geben wir ein const Cookie parser entspricht require Cookie Unten fügen wir App Dot G, Cookie Parser, hinzu. Stellen Sie sicher, dass Sie diese Funktion hier aufrufen. Speichern Sie diese Datei und kehren Sie zu unserer Route zurück. Hier haben wir die Bedingung bestanden. Wenn das Benutzeraktualisierungstoken nicht verfügbar ist, geben wir den Antwortstatus 401 Punkt Json zurück, und hier übergeben wir die Nachricht. Nein, das Aktualisierungstoken wird bereitgestellt. Danach benötigen wir die Benutzer-ID, die die Anfrage nach einem Zugriffstoken sendet und wie wir das aus dem Aktualisierungstoken abrufen Wir müssen dieses Aktualisierungstoken dekodieren Die Kosten für den dekodierten Benutzer entsprechen JWT Punkt Verify. Hier übergeben wir den Benutzeraktualisierungstoken und danach den geheimen Aktualisierungsschlüssel, den Prozesspunkt ENV Punkt, Aktualisierungstoken, Schlüssel ENV Punkt, Aktualisierungstoken Nun könnte dieser Ausdruck einen Fehler zurückgeben, also fügen wir hier, try und gatchblog einfach diese Zeile in das trockene Blog Und im Cache-Blog geben wir den Antwortstatus 403, 44 PDN-Punkt-JSON zurück 44 PDN-Punkt-JSON und leiten Ihre Nachricht an ein ungültiges Aktualisierungstoken Außerdem wissen wir, dass, wenn wir Variablen unter Verwendung von Kosten definieren, nur in diesem trockenen Blog darauf zugegriffen werden kann Also müssen wir es vor dem Trockenblog definieren. Und entfernen Sie die Kosten von hier aus. Danach entspricht der Wert des Benutzers einem Gewicht, der Benutzerpunkt ist frei von BYD Und hier übergeben wir die dekodierte Benutzerpunkt-Underscore-ID. Und wenn der Benutzer dann nicht verfügbar ist, geben wir den Antwortstatus 404 Punkt Json zurück Und hier fügen wir die Nachrichteneigenschaft zu „Benutzer nicht gefunden“ hinzu. Wenn wir nun einen Benutzer gefunden haben, müssen wir die Token vergleichen, und dafür verwenden wir einfach das BCRP-Paket Also warte, BCRP nicht vergleichen. Wir übergeben das Benutzer-Aktualisierungstoken, das wir aus dem Cookie erhalten, und vergleichen es mit dem Benutzer-Punkt-Aktualisierungstoken Dieser Ausdruck gibt das Ergebnis für den Vergleich zurück. Second ist gültig. Und auch hier übergeben wir eine weitere Bedingung I ist gültig ist falsch, dann geben wir wieder den Antwortstatus 403 Punkt Json mit der Meldung zurück , dass das Token nicht gültig ist zu aktualisieren Nun, wenn die Token gültig sind, was werden wir dann tun? Wir werden neue Token erstellen, Aktualisierungstoken in der Sammlung des Benutzers speichern, Aktualisierungstoken im SDDPoly-Cookie festlegen und dann das überschüssige Token zurückgeben Diese Schritte haben wir bereits in der Registrierungs- und Anmelde-API ausgeführt in der Registrierungs- und Kopieren Sie das, wir fügen es einfach ein, um die API zu aktualisieren und fertig. Lassen Sie uns jetzt auch schnell die API für die Abmeldung definieren. Dann werden wir diese beiden APIs zusammen probieren. Route, Pfeilpost, Zeiger zum Schrägstrich Logout. Denken Sie daran, dass wir bei diesem Projekt im Frontend API für Slash-API, Schrägstrich für Benutzer, Schrägstrich für Aktualisierung oder Abmeldepunkt eingeben müssen , da wir sie zur Route da wir sie Hier fügen wir einen ASN-Rückruf mit Anfrage und Antwort hinzu. Können Sie mir jetzt sagen, was wir bei der Aussperrung tun sollen? Stimmt, es ist wirklich einfach. Wir müssen das Aktualisierungstoken aus dem Cookie entfernen, und dann entfernen wir das Token einfach auch aus der Sammlung des Benutzers. Außerdem erinnere ich mich, als ich mit Ihnen über die Sammlung des Benutzers gesprochen habe, dass wir der Sammlung des Benutzers kein Aktualisierungstoken hinzugefügt haben. Lassen Sie uns das zuerst tun und dann werden wir diese Lockout-Route abschließen Also das Modell eines Benutzers, und unten fügen wir ein gefülltes Astken zum Objekt, zum Typ und zur Wir halten uns nicht an das Erforderliche, denn wenn unser Benutzer sich aussperrt, müssen wir das Astken entfernen Wenn wir erforderlich hinzufügen, können wir das nicht tun So einfach ist das. In der Logout-API ist die Startaufgabe jetzt der Refresh-API sehr ähnlich Zum Beispiel müssen wir auch das Token aus dem Cookie abrufen, das Aktualisierungstoken des Benutzers finden und es dann auf Null setzen Kopieren wir also den Code aus der Refresh-API und fügen ihn hier ein. Gut. Lassen Sie uns diesen Code jetzt von Anfang an überprüfen. Das ist gut. Das ist auch gut, bis wir den Benutzer haben. Hier müssen wir keine Tokens erstellen , also können wir diese entfernen. Außerdem brauchen wir das Token nicht, also können wir diese Zeile entfernen, und dann speichern wir hier Null im Repress-Token An der Stelle der Antwort, Dart Cookie, verwenden wir Response, Punkt Clear Zuerst übergeben wir den Namen des Cookies, was in Ordnung ist. Danach müssen wir hier diese Aktualisierungstoken-Variable nicht übergeben, sondern wir benötigen dieses Konfigurationsobjekt, und zum Schluss geben wir einfach Nachricht an der Stelle des Zugriffstokens zurück, erfolgreich gesperrt und fertig. Lassen Sie uns diese APIs jetzt schnell testen. Also, ein Postbote im Ordner des Benutzers, wir erstellen eine neue Anfrage namens Repress Access Token Wir benötigen eine Post-Anfrage. Zeigen Sie auf SDD P, Spalte mit doppeltem Schrägstrich, lokaler Host Spalte 3.000, Schrägstrich „API-Benutzer“, Schrägstrich „Repress“ und „ Anfrage Sehen Sie, hier erhalten wir eine Fehlermeldung, weil wir kein Cookie haben Gehen Sie zur Anmelderoute senden Sie die Anfrage mit den Schreibdetails Sehen Sie hier, wir bekommen ein Token und auch das Repress-Token ist auf Cookie gesetzt Nun zurück zur Repress-API, sende die Anfrage Siehst du, hier bekommen wir das neue Token. Großartig. Lassen Sie uns jetzt die Logout-API probieren. Duplizieren Sie einfach diesen Anforderungsgeschmack und wir ändern den Namen der Anfrage, um beispielsweise einen Benutzer abzumelden Außerdem ändern wir den API-Endpunkt in Schrägstrich user, slash Logout und Sehen Sie, wir erhalten eine Erfolgsmeldung, und wenn wir das Cookie überprüfen, sehen Sie, hier erhalten wir kein Aktualisierungstoken, beide APIs funktionieren einwandfrei Außerdem möchte ich Ihnen sagen, dass es sich dieser aktuellen und der vorherigen Lektion um aktualisierte Lektionen handelt. Wenn Sie diesen Code in Zukunft nicht in meiner Bildschirmaufnahme sehen, Sie sich keine Sorgen, Sie können diesen Lektionen absolut folgen. Ich möchte den Kurs nur so aktuell wie möglich gestalten. Sie lernen auch aktuelle Best Practices für Node Jazz kennen. 162. Details zum aktuell angemeldeten Benutzer: Lassen Sie uns eine weitere API erstellen um die Details der angemeldeten Benutzer zu senden. Hier fügen wir also einen weiteren Router-Punkt Get Point zum Forward Slash hinzu und übergeben hier einfach ASN-Callback-Funktion mit Anfrage Gut. In dieser Funktion entspricht „ cost user“ nun dem Wert await user dot find By ID. Und hier übergeben wir einfach die Benutzer-ID. Aber wie können wir diese ID bekommen? Ja, wir müssen diese ID aus dem JWT-Token extrahieren. Und dafür müssen wir Osmddalware erstellen. Im Moment vervollständigen wir diese API und fügen dann Othmidalware und fügen dann Hier übergeben wir die Benutzerpunkt-Unterstrich-ID mit dem Punkt der Anfrage. Jetzt möchten wir kein Passwort mit diesen Daten senden. Wir fügen hier die Punktauswahlmethode hinzu, und in der Zeichenfolge fügen wir ein Minus-Passwort hinzu. Wenn wir danach den Benutzer nicht erhalten, geben wir die I-Bedingung, der Benutzer ist nicht verfügbar, Benutzer ist nicht verfügbar, dann den Antwortpunktstatus 404 zurück. Außerdem übergeben wir erfolgreich das Punkt-GSN-Objekt an Falls und die Nachricht an den Benutzer, nicht gefunden Wenn wir den Benutzer gefunden haben, geben wir ihn einfach als Antwort auf den Punkt Json user zurück Jetzt fragen sich vielleicht viele Schüler, können wir den Code des vorherigen Projekts sehen während wir ihn in unserem neuen Projekt anwenden? Ja, natürlich können Sie diesen Code sehen. Denk einfach nach, gibt es etwas, das du an diesem Code verbessern kannst? Falls ja, dann verbessere ihn, und wenn nein, dann bleib bei diesem Code. Daran ist nichts falsch. Lassen Sie uns OS-Middleware erstellen. In unserem Projekt erstellen wir also einen neuen Ordner namens Und in diesem Ordner erstellen wir eine neue Middleware-Datei namens Zuallererst erstellen wir hier eine Funktion namens OT und wir wissen, dass dies eine Middleware-Funktion ist Also werden wir hier drei Parameter bekommen: Anfrage, Antwort und als Nächstes In dieser Funktion erhalten wir nun zuerst ein Token aus dem Anforderungsheader. Erinnerst du dich, in welchem Header unser Frontend das Token übergeben wird? Schreiben Sie in den Autorisierungsheader SecondsTo-Header entspricht Punktautorisierung von Request-Punkt-Headern Danach überprüfen wir den Zustand. Wenn der Auth-Header nicht verfügbar ist oder beide Header-Punkte im Code mit hier beginnen, übergeben wir ein Barr-Leerzeichen Wenn das nicht stimmt, geben wir einen Fehler zurück Also Antwort zurückgeben, Punktstatus 401 für nicht autorisiertes JSON-Objekt, Erfolg beim Erzwingen und Nachricht an die Autorisierung, Token erforderlich. Wenn wir nun beide Header erhalten, müssen wir unser Token aus diesem Header extrahieren. Cost-Token entspricht also der Punktaufteilungsmethode für beide Header In Codes übergeben wir Leerzeichen, und hier benötigen wir ein zweites Element, also eckige Klammer, Index eins. Das haben wir bereits im vorherigen Projekt gesehen. Richtig. Jetzt haben wir also ein Token. Das einzige, was wir tun müssen, ist, das Token zu verifizieren und unsere Benutzerdaten in Request Dot User einzugeben. Der dekodierte Secct-Benutzer entspricht JWT Dot Verify. Hier übergeben wir zuerst unser Token, das wir aus dem Header erhalten Und dann übergeben wir im zweiten Argument den Prozesspunkt EV Punkt JWT Unterstrichschlüssel. Wir können diese Variable einfach als Request Dot User setzen. Request-Punkt-Benutzer entspricht dem dekodierten Benutzer, und dann rufen wir die nächste Funktion Das ist das Wichtigste. Was ist, wenn wir diesen dekodierten Benutzer nicht bekommen? Wenn wir das nicht handhaben, erhalten wir eine Fehlermeldung Also behandeln wir das mit Try and Catch Block. Hier versuchen wir es mit Cache-Block und verschieben diese drei Zeilen einfach in den Try-Block. Im Cache-Block geben wir einfach Antwort, Punktstatus, 401, Punkt Json, Objekt, Erfolg auf False und Nachricht auf ungültiges Token zurück. Und fertig. Lassen Sie uns nun diese Funktion exportieren. Der Export von Modulpunkten entspricht also OT. Nun zurück zur Route unserer Benutzer. Hier in unserer GIPI fügen wir beide Middleware hinzu, siehe Nett. Lass uns das jetzt probieren. Also bei Postman fügen wir hier eine neue Anfrage namens current locked in user point zu SJDP, Spalte double four slash local host, Spalte 3.000 API slash user hinzu und Sehen Sie, hier erhalten wir eine Fehlermeldung, ein Autorisierungstoken ist erforderlich Aus dem vorherigen API-Aufruf kopieren wir also dieses JWT-Token, und in unserer aktuellen API gehen wir zu den Headern Hier fügen wir den Autorisierungsheader hinzu. Geben Sie den Wert in das Leerzeichen fügen Sie unser Token ein und senden Sie die Anfrage Siehst du, hier erhalte ich ein ungültiges Token, aber warum übergebe ich das gültige Token Lass uns das Terminal überprüfen. Siehst du, der Server läuft auch. Ich denke, im Dry- und Cache-Block ist ein Fehler aufgetreten. Deshalb läuft mein Server immer noch. Also hier im Cache-Block fügen wir den Konsolenpunkt hinzu, um diesen Fehler zu protokollieren. Stellen Sie die Änderungen ein und senden Sie die Anfrage erneut. Jetzt zurück zum VS-Code, zurück zum Terminal, und hier erhalten wir die Fehlermeldung, JWT ist nicht definiert Oh, ich habe vergessen, JWT aus dem JSON-Web-Token-Paket zu importieren JWT aus dem JSON-Web-Token-Paket In der obersten Konstante entspricht JWT also dem erforderlichen JSN-Webtoken Sie können sehen, dass wir auf diese Weise Fehler beheben können. Geraten Sie nicht in Panik, wenn Fehler in Ihrem Code auftreten. Versuche es Schritt für Schritt zu lösen. Wenn viele Fehler auftreten, können wir mehr über unsere Fehler erfahren und dadurch unseren Code verbessern. Machen Sie sich also keine Sorgen über Fehler. Sehen Sie sich die Änderungen an und werfen Sie einen Blick darauf. Schau, hier bekommen wir die Nutzungsdetails ohne Passwort. 163. Benutzerkennwort zurücksetzen: Lassen Sie uns nun die Funktion zum Zurücksetzen des Passworts in unserer Anwendung implementieren Funktion zum Zurücksetzen des Passworts in unserer Lassen Sie uns zunächst den Überblick über diese Funktion verstehen. Wenn der Benutzer also seine E-Mail-Adresse eingibt und auf die Schaltfläche zum Zurücksetzen des Passworts klickt, rufen wir unsere erste API-Anfrage Password Reset auf. Jetzt generiert diese API ein neues Token und sendet eine URL mit diesem Token an ihre E-Mail. Wenn Benutzer auf diesen Link zur Website klicken, erhalten wir vom Benutzer ein neues Passwort Wenn Benutzer auf Senden klicken, rufen wir unser zweites API-Reset-Passwort auf. In dieser API überprüfen wir das Token und aktualisieren das neue Passwort im Benutzerdokument. Wenn das alles einwandfrei funktioniert, geben wir die Nachricht und das Passwort zurück und werden erfolgreich zurückgesetzt. Hier müssen wir zwei APIs erstellen, Zurücksetzen des Passworts anfordern und das Passwort zurücksetzen. Beginnen wir also mit der Erstellung der ersten API, sodass der Router den Endpunkt sendet, um das DS-Passwort und den D-Reset anzufordern . Außerdem fügen wir ASN-Callback-Funktion mit Anfrage und Antwort Hier fügen wir also keine Orthomidalware hinzu weil wir wollen, dass jeder sein Passwort zurücksetzen kann Sie setzen das Passwort zurück, weil sie in 99% der Fälle ihr Passwort vergessen haben, sodass sie sich nicht anmelden können, und deshalb fügen wir hier keine Orthomidalware hinzu. Jetzt erhalten wir zunächst eine Benutzer-E-Mail aus Das zweite Objekt entspricht dem Hauptteil der Anfrage. Und hier bekommen wir die E-Mail. nun anhand dieser E-Mail zunächst überprüfen, Lassen Sie uns nun anhand dieser E-Mail zunächst überprüfen, ob der Benutzer verfügbar ist oder nicht. Const user entspricht also await user dot Fine one. Und hier übergeben wir das Vergleichsobjekt mit E-Mail an E-Mail. Als nächstes bestehen wir die Bedingung. Wenn der Benutzer nicht verfügbar ist, geben wir eine Antwort zurück, bei der der Statuscode 404 Punkt Json Object erfolgreich ist, und die zweite Meldung, diese E-Mail nicht registriert ist, oder wir können auch den Benutzer nicht gefunden übergeben. Es liegt ganz bei dir. Wenn der Benutzer verfügbar ist, was werden wir dann tun? Richtig, wir werden ein Token generieren. Die Kosten für das Zurücksetzen des Tokens entsprechen also dem JWT-Punkt-Sinus. Zuerst übergeben wir unsere Daten, also Objekt, Unterstrich-ID, an die Benutzerpunkt-Unterstrich-ID Und beim zweiten Parameter übergeben wir den JWT-Schlüssel, also verarbeiten wir den Punkt Env Dot Und auch beim dritten Argument übergeben wir das Objekt mit Abläufen in der Eigenschaft auf 1 Stunde, weil wir hier diese Ablaufzeiten in der Eigenschaft hinzufügen wollen, und deshalb verwenden wir Wir haben das Token zurückgesetzt. Jetzt wollen wir es nur noch an die E-Mail unseres Benutzers senden. Senden einer E-Mail ist eine separate Logik, daher implementieren wir sie derzeit nicht. Zunächst erstellen wir unsere beiden Reset-APIs , damit Sie nicht verwirrt werden Hier schreiben wir also einen Kommentar zum Senden von E-Mails und geben dann einfach die Antwort Json zurück Hier übergeben wir Objekt mit Nachrichteneigenschaft, Passwort zurücksetzen, Link, Senden an E-Mail. Und danach übergeben wir auch Reset-Token an Reset-Token. senden dieses Reset-Token als Antwort, da wir noch keine E-Mail senden. Es dient nur zum Testen. Nach dem Senden der E-Mail müssen wir in der Antwort kein Reset-Token angeben. Definieren wir nun unsere zweite API, in der wir das Reset-Token überprüfen und das neue Passwort speichern. Der Router sendet also einen Punkt und zeigt auf den Schrägstrich zum Zurücksetzen des Passworts. Und hier fügen wir ASN-Rückruffunktion mit Anfrage Zuallererst erhalten wir Füllungen aus dem Anfragetext. Const-Objekt entspricht also dem Hauptteil der Anfrage Hier destrukturieren wir das Reset-Token und erhalten auch das neue Passwort, das der Benutzer aktualisieren möchte Hier müssen wir zwei Schritte ausführen. Schritt eins, verifizieren Sie das Token, und Schritt zwei, wenn das Token verifiziert ist, aktualisieren Sie dann das Passwort. So einfach ist das. das Token zu verifizieren, können wir also JWT dot Verify verwenden Zuerst übergeben wir unser Reset-Token. Als zweites Argument müssen wir unseren JWT-Schlüsselprozesspunkt ENV-Punkt JWT-Unterstrichschlüssel hinzufügen unseren JWT-Schlüsselprozesspunkt ENV-Punkt JWT-Unterstrichschlüssel Dieser Ausdruck gibt uns nun Benutzerdaten, die wir bei der Generierung dieses Tokens weitergeben Sehen Sie hier oben, wir übergeben die Unterstrich-ID an die Benutzerpunkt-Underscore-ID Wir speichern das in einer Variablen namens decodierter Benutzer. Jetzt finden wir den Benutzer, der diese Unterstrich-ID verwendet, und aktualisieren dann das Passwort Lassen Sie den Benutzer gleich warten, bis der Benutzer nach der ID gesucht hat. Und hier übergeben wir die dekodierte Benutzerpunkt-Unterstrich-ID. Danach bestehen wir die Bedingung. Wenn der Benutzer nicht verfügbar ist, geben wir die Antwort mit dem Statuscode 400 Punkt Json Object zurück , wobei Erfolg auf False gesetzt wurde, und die Nachricht auf ein ungültiges oder abgelaufenes Token. Wenn wir jetzt den Benutzer bekommen, werden wir einfach das Passwort aktualisieren. Hier müssen wir für das Passwort zuerst dieses Passwort haben. Wir können es nicht so speichern, wie es ist. Warte, Crypt Dot hat hier, zuerst übergeben wir ein neues Passwort und beim zweiten Argument übergeben wir das Salt, das ist zehn Dadurch wird ein Passwort generiert, sodass wir es direkt im Benutzerpunktpasswort speichern können, und darunter warten wir einfach auf den Benutzerpunkt CV Und zum Schluss geben wir einfach Antwort-Dot-Json-Objekt mit der Nachrichteneigenschaft zurück, das Passwort wurde erfolgreich zurückgesetzt, und das war's. In der ersten API generieren wir das Reset-Token und senden es per E-Mail In der zweiten API sendet der Benutzer das Reset-Token an uns zurück und wir werden es überprüfen. Wenn es verifiziert ist, werden wir dieses Passwort erst dann aktualisieren. Hier bei der Token-Verifizierung haben wir kaum ein Sicherheitsproblem. Hier verifizieren wir nur das Token mit JWTKey, aber das ist nicht Lassen Sie mich Ihnen das anhand eines einfachen Beispiels erklären. Angenommen, Benutzer senden Anfragen zum Zurücksetzen des Passworts. Im Backend generieren wir ein Reset-Token und senden es an den Benutzer. Jetzt kann es passieren, dass der Benutzer erneut die Anfrage für das Reset-Passwort senden kann und wir das neue Reset-Token erneut an den Benutzer senden. Jetzt sind dies zwei Token, die für das Zurücksetzen des Passworts validiert Angenommen, der Benutzer übergibt das zweite Token und ändert das Passwort Was ist nun, wenn Hacker das erste alte Token bekommen und das Passwort mit diesem alten Reset-Token ändern . Diese Implementierung ist wenig riskant. Nun, was ist hier die Lösung? Es ist wirklich einfach. Wenn wir zum Zeitpunkt des Versendens der E-Mail in unserer ersten API ein Reset-Token generieren , speichern wir das Reset-Token in der Sammlung unseres Benutzers. Außerdem speichern wir die Ablaufzeiten und die Uhrzeit des Tokens. Wenn wir nun das Token verifizieren, vergleichen wir das gespeicherte Reset-Token mit dem Reset-Token des Benutzers. Wenn beide übereinstimmen und das Token nicht abgelaufen ist, werden wir das Passwort aktualisieren. Nur bei diesem Ansatz ist das neueste Reset-Token gültig, ist das neueste Reset-Token und zwar nur für den Ablauf und die Zeit. Dieser Ansatz ist sicherer als der vorherige. Lassen Sie uns das also implementieren. Bevor wir eine E-Mail senden, schreiben wir, dass der Benutzerpunkt Reset-Token dem Reset-Token entspricht und der Benutzer-Punkt-Reset-Token, abläuft dem aktuellen Datum entspricht Außerdem möchten wir hinzufügen, dass 1 Stunde abläuft. Aus 60 Minuten werden also 60 Sekunden und 1.000. Sekunden in Millisekunden umrechnen. Danach können wir auf den Benutzer Punkt C warten. Ebenfalls oben konvertieren wir diesen Benutzer const in at user Außerdem müssen wir diese beiden Füllungen in das Modell unseres Benutzers aufnehmen. Beim Benutzerschema hier am Ende das fügen wir hier am Ende das Reset-Token zum Objekt und den Typ zur Zeichenfolge hinzu. Danach läuft das Reset-Token auf Objekt und Typ bis Datum ab, speichern die Änderungen und kehren zu unserer Reset-API zurück. Im Verifizierungsteil fügen wir eine Bedingung hinzu, wenn der Benutzer nicht verfügbar ist oder wenn das Benutzerpunkt-Reset-Token dem Zurücksetzen-Token entspricht oder das Benutzer-Punkt-Reset-Token abläuft kleiner oder gleich dem aktuellen Datum ist Wenn eine dieser Bedingungen zutrifft, geben wir das Token als abgelaufen und das Token nicht verifiziert zurück und das Token nicht verifiziert Außerdem müssen wir nach der Aktualisierung des Passworts diese beiden Füllungen auf Null setzen. Vor Benutzerpunkt C setzen wir Benutzerpunkt-Reset, Token ist gleich Null und Benutzerpunkt-Reset-Token läuft gleich Null. Das ist sicherer. Wenn der Benutzer das Passwort erfolgreich zurückgesetzt hat, gibt es keine Token, die für das Zurücksetzen des Passworts gültig sind. Lassen Sie uns nun diese Implementierung testen. Im Postman erstellen wir eine neue Anfrage namens request , reset password, method, to post point to SDDP, Column double forward slash local host, Spalte 3.000, slash API, slash user, slash request, user Und im Hauptteil gehen wir zu Raw und hier Stellen Sie sicher, dass Sie eine gültige E-Mail-Adresse angeben und dass diese E-Mail auch in Ihrer Benutzer-E-Mail enthalten sein sollte. Andernfalls erhalten wir, dass der Benutzer nicht gefunden wurde. Wenn Sie in den Benutzerdaten keine gültige E-Mail-Adresse angeben, können Sie dies über den Mongo Di Become Pass ändern Jetzt sende die Anfrage hier, ich kriege, dass Ken nicht gefunden Lass mich den Endpunkt überprüfen. Oh, hier ist die Anfrage, da ist das Passwort, lass uns zurücksetzen. Und in meinen Endpunkt schreibe ich request, let's reset, des-Passwort. Also ändere ich diesen Endpunkt und sende diese Anfrage. Sehen Sie, hier erhalten wir ein Reset-Token, kopieren dieses Token und wir müssen eine neue Anfrage namens Reset-Passwort-Methode erstellen, um den Endpunkt an SDDP zu senden, Spalte Double Forward Slash Local Host, Spalte 3.000, Slash-API-Benutzer, Schrägstrich Außerdem müssen wir hier den Hauptteil, das Rohobjekt mit dem Reset-Token übergeben und das Token einfügen . Und dann übergeben wir das neue Passwort. 123-45-6789. Senden Sie jetzt die Anfrage. Siehst du, wir haben das Passwort erfolgreich zurückgesetzt. Beide APIs funktionieren also. Jetzt wollen wir nur noch dieses Token oder den Link zum Zurücksetzen der Seite in der E-Mail des Benutzers senden , und das werden wir in der nächsten Lektion sehen. 164. Möglichkeiten zum Senden von E-Mail in Node JS: Jetzt gibt es viele Möglichkeiten, E-Mails von der Node-Anwendung aus zu senden. Die erste Möglichkeit besteht in der Verwendung von SMTP , einem einfachen E-Mail-Übertragungsprotokoll Der zweite Weg ist die Verwendung der SendGrid-API und der dritte Weg ist Amazon SS , ein einfacher Sehen wir uns nun die Vor- und Nachteile der einzelnen Methoden an, anhand derer wir entscheiden , welchen E-Mail-Dienst wir für unsere Anwendung verwenden können SMTP eignet sich also am besten für kleine Anwendungen, da es einfach einzurichten ist Wir müssen nur die E-Mail-Adresse und das Passwort unseres Kontos weitergeben, und dann sendet SMTP diese E-Mail von unserem Konto aus SMTP ist jedoch im Vergleich zu anderen E-Mail-Diensten etwas langsam Außerdem können wir mit SMTP nur eine begrenzte Anzahl von E-Mails versenden Wenn wir beispielsweise Gmail verwenden, können wir nur 500 E-Mails pro Tag senden Wenn wir Yahoo verwenden, können wir nur 100 E-Mails pro Tag senden. SMTP ist für große Unternehmen nicht skalierbar. Für kleine Anwendungen ist es in Ordnung. Gehen wir jetzt zu SNGrid. In SendGrid müssen wir die E-Mail-Adresse und das Passwort unseres Kontos nicht weitergeben E-Mail-Adresse und das Passwort unseres Stattdessen müssen wir ApiKey generieren und E-Mails mithilfe der SendGrids-API senden Das ist also schnell und zuverlässig. Es ist auch einfach einzurichten. Viele Unternehmen verwenden SendGrid für den Versand von Massen-E-Mails wie Uber, AirBnB, App usw. jedoch unbegrenzt E-Mails versenden zu können, müssen wir den kostenpflichtigen Tarif erwerben Gehen wir nun zu Amazon SES über. Dies ist der vertrauenswürdigste und sicherste E-Mail-Dienst, der von großen Unternehmen wie Netflix, LinkedIn usw. verwendet wird . Es ist auch sehr schnell. Wir können Millionen von E-Mails pro Tag versenden, und auch ihr kostenpflichtiger Tarif ist günstiger als der von Sandgrad, aber der einzige Nachteil ist, dass es etwas schwierig ist, ihn einzurichten Wir können das schaffen. Hier können wir also klar erkennen , dass wir Amazon SES verwenden können, wenn wir Geschwindigkeit, Sicherheit und niedrige Kosten benötigen , wenn wir Geschwindigkeit, Sicherheit und niedrige Kosten . In der nächsten Lektion werden wir also Amazon SES in unserer Anwendung implementieren. 165. Einrichten von Amazon SES für das Senden von E-Mails: Lassen Sie uns Amazon Simple Email Survey in unserer Node-Anwendung implementieren . Es ist wirklich einfach. Ich teile das in drei Schritten auf. Schritt eins: Konfigurieren Sie das SS in der Knotenanwendung. Schritt zwei: Erstellen Sie ein Amazon SS-Konto und überprüfen Sie die E-Mail-Adresse zum Testen. Schritt drei: Wir senden Test-E-Mails von unserer API aus. Hier möchte ich eines für die Einrichtung des Amazon SS-Kontos klarstellen für die Einrichtung des Amazon SS-Kontos Wir benötigen Zahlungskartendaten und Identitätsdaten. Wir müssen nichts bezahlen, wir benötigen Kartendaten. Hier werden wir eine Vorversion von Amazon SES verwenden. Wenn Sie also nicht über diese Details verfügen, können Sie diese Lektion überspringen und in der nächsten Lektion einen kostenlosen E-Mail-Absender mit SMTP beantragen in der nächsten Lektion einen kostenlosen E-Mail-Absender mit SMTP Um Amazon SES zu implementieren, müssen wir das AWS-Paket installieren Also installieren Sie NPM auf dem AWS-SDK-Client Ss der Rate 3.738 0.0 und drücken Gut. Minimiere das Terminal. Jetzt erstellen wir in unserem Projekt einen neuen Ordner namens Config und in diesem Ordner erstellen wir eine neue Datei namens Amazons dot js Zuallererst müssen wir SS-Client konfigurieren und dafür benötigen wir die SS-Client-Methode Also Const CL-Klammern. Hier erhalten wir SS client is equal to require mit der Rate aws SDK client Ss Danach, const, da client gleich new as client ist , müssen wir innerhalb des Programms das Initialisierungsobjekt übergeben Jetzt ist die erste Eigenschaft des Objekts Region. Hier müssen wir unsere Region passieren. Wir werden die Region in der ENV-Datei speichern, also fügen wir hier den Prozesspunkt ENV Aws Score-Region Danach müssen wir das Eigentum an den Anmeldeinformationen übergeben. Nun, das ist wirklich wichtig. Ohne das können wir keine E-Mail senden. Hier übergeben wir ein Objekt mit einer überschüssigen Schlüssel-ID, und wir müssen auch den geheimen Überschlüssel übergeben. Diese beiden Eigenschaften erhalten wir, wenn wir ein Konto bei Amazon AWS erstellen . Mach dir keine Sorgen. Zuerst richten wir all diese in unserer Node-Anwendung und dann erstellen wir ein neues Konto bei Amazon Aws. Hier übergeben wir also auch den Prozesspunkt An Punkt Aws, Unterstrich Xs, Unterstrichtaste Für geheim übergeben wir den Prozesspunkt n Punkt Aws, Unterstrich, geheime Unterstrichtaste und fertig Jetzt müssen wir nur noch die Funktion „E-Mail senden“ erstellen und einige E-Mail-Ausfüllungen hinzufügen Const Send E-Mail entspricht also der Pfeilfunktion. Bevor wir vergessen haben, Try und Cache Block hinzuzufügen , fügen wir sie hinzu, und im Cache konsolen wir einfach Dot Log, Amazon, SCS-Fehler Hier fügen wir diesen Fehler hinzu. Lassen Sie uns nun unseren Code in den Try-Blog schreiben. Wenn etwas schief geht, wird unser Cache-Block diesen Fehler beheben. die E-Mail zu senden, müssen wir nun einige Informationen aus der E-Mail angeben. Wir möchten eine E-Mail senden, an welche E-Mail wir senden möchten, was ist der Betreff, was ist der Text usw. Cost params entspricht also Objekt. Hier haben wir zuerst eine Quelle, hier müssen wir unsere verifizierte E-Mail-Adresse angeben, die wir auf der Amazon SS-Website verifizieren werden Keine Sorge, schreibe vorerst nichts. Lass es planen. Stellen Sie sicher, dass Sie den Namen dieser Immobilie in der Großbuchstaben schreiben, genau wie ich. Andernfalls erhalten Sie eine Fehlermeldung. Jetzt fügen wir nach der Quelle das Ziel, Addhee-Objekt mit der Eigenschaft zur Adresse hinzu, und hier müssen wir eine Reihe von E-Mails übergeben , an die wir E-Mails senden möchten Wir können auch E-Mails an mehrere Benutzer senden. Wie können wir nun diese E-Mail-Adresse in dieser Funktion abrufen? Richtig, von den Parametern aus. Also hier fügen wir zwei hinzu , nämlich die E-Mail-Adresse. Außerdem benötigen wir den Betreff der E-Mail und den Text der E-Mail. Jetzt fügen wir hier in den beiden Adressen zwei Parameter hinzu. Wenn wir hier mehrere haben, können wir diese E-Mail-IDs auch mit Komma hinzufügen Nach dem Ziel fügen wir dem Objekt nun die Nachrichteneigenschaft hinzu Zuerst fügen wir hier ein Subjekt zum Objekt mit Dateneigenschaft Wir müssen das Subjekt übergeben , das wir aus dem Parameter erhalten. Nach dem Subjekt fügen wir nun Körper zu Objekt, Text zu Objekt und innerhalb dieser Daten zum Text hinzu, wir wiederum aus dem Parameter erhalten. Ich weiß, das ist eine etwas seltsame Syntax, aber es ist was es ist. Wir müssen dem folgen. Jetzt haben wir unsere Dauerwellen fertig Jetzt können wir einen Befehl für diese Perams erstellen. Const, command entspricht New send email, command. S, die automatische Eingabe funktioniert, und hier übergeben wir einfach Perams Jetzt müssen wir diesen Befehl zum Senden der E-Mail senden. Also Ss Client dot SN, und hier übergeben wir den Befehl. Wie wir jetzt wissen, wird das Senden der E-Mail einige Zeit dauern, es wird also eine asynchrone Aufgabe sein Und dafür halten wir uns an, warten ab. Und wegen Await müssen wir diese Funktion asynchron machen Lassen Sie uns nun die Antwort in der Antwortvariablen ausführen, und am Ende fügen wir einfach das Punktprotokoll der Konsole, Spalte mit der erfolgreich gesendeten E-Mail hinzu, und hier geben wir die Antwortpunkt-Nachrichten-ID zurück Am Ende dieser Datei modulieren wir einfach, dass Punktexporte dem Senden von E-Mails entsprechen. Stellen Sie sicher, dass Sie diese Funktion hier nicht aufrufen. Wir müssen nur die Referenz weitergeben. Außerdem übergeben wir hier in den Quellen den Prozesspunkt En dot Aws underscore, email, was unsere E-Mail sein wird , von der aus wir E-Mails senden möchten Also hier ist unser Schritt Nummer eins erledigt. Wir müssen nur diese drei Variablen zur ENV-Datei hinzufügen und wir müssen auch diese Quell-E-Mail übergeben Gehen Sie zum Browser und gehen Sie zu aws.amazon.com. Und hier müssen wir ein neues AWS-Konto erstellen. Hier schreiben wir unsere E-Mail-Adresse und hier müssen wir unseren AWS-Kontonamen weitergeben. Übergeben Sie vorerst alles, wir können es später in den Einstellungen ändern. Klicken Sie auf E-Mail-Adresse verifizieren. Danach werden Sie nach einem Passwort gefragt Erstellen Sie einfach ein Passwort und fahren Sie hier fort . Wir sehen einen persönlichen Plan und müssen auch unsere Daten weitergeben. Ich schreibe schnell meine Daten und stimme zu und fahre fort. Jetzt müssen wir hier die Kartendetails weitergeben. Wenn Sie die Kartendaten nicht haben oder Ihre Informationen nicht angeben möchten, können Sie SMTP implementieren da die meisten Schüler keine Karte haben Sie können also SMTP implementieren, das nur Ihre E-Mail-Adresse verwendet Das werde ich dir in der nächsten Lektion zeigen. Im Moment gebe ich Ihre Kartendaten weiter und verifiziere dann und fahre fort. Dadurch werden kleine Zahlungen wie 1 USD oder noch weniger für Ihre Kartenverifizierung verarbeitet . Also hier gebe ich ein, dass meine OTP-Zahlung bearbeitet wird und hier ist die Zahlung erledigt Jetzt müssen wir die Identität angeben. Wählen Sie Ihren persönlichen Gebrauch aus. Wenn Sie es für geschäftliche Zwecke verwenden möchten, können Sie dies auch auswählen. Als Nächstes wählen wir eine Person aus, und hier müssen wir einen Ausweis vorlegen. Also fülle ich schnell dieses Formular aus und lade auch mein Dokument hoch und klicke auf Weiter. Hier finden Sie weitere Details zur Überprüfung. Ich schreibe hier meine Telefonnummer und sende SMS. Wenn du aus einem anderen Land kommst, bekommst du vielleicht eine andere Füllung. Hier verifiziere ich meine Nummer mit OTP und fahre dann fort. Jetzt stellen wir hier einfach diesen kostenlosen Basisplan und schließen schließlich die Registrierung ab und gehen zur AWS-Managementkonsole Siehst du, hier sind wir an der Konsole. Zunächst überprüfen wir unsere Absender-E-Mail. Fügen Sie also oben SE ein und öffnen Sie diese Amazon SS-Seite. Klicken Sie auf diese drei Zeilen und gehen Sie zu Identitäten, um E-Mail oder Domain zu verifizieren Hier müssen wir Identitäten erstellen. Wenn Sie es nun für die Produktion verwenden möchten, müssen Sie Ihre Domain hier verifizieren Aber jetzt können wir zum Testen Ihre E-Mail verwenden. Hier schreiben wir unsere E-Mail-Adresse, von der aus wir E-Mails an Benutzer senden möchten , und klicken auf Identität erstellen. Sehen Sie hier, dass die Bestätigung noch aussteht. Amazon hat S gebeten, eine E-Mail an diese E-Mail zu senden , und wir müssen das überprüfen. Also hier öffne ich diese E-Mail. Klicken Sie auf diesen Link, um zu sehen, wie die Überprüfung abgeschlossen Wenn wir diese Seite aktualisieren, sehen Sie hier, werden wir auch verifiziert. Also müssen wir diese E-Mail kopieren und in unserer Node-Anwendung in den Quellen haben wir AWS-Underscore-E-Mail hinzugefügt Fügen wir diese Variable in die ENV-Datei ein. AWS-Underscore-E-Mail entspricht hier, wo ich meine verifizierte E-Mail-Adresse übergebe Jetzt müssen wir den Zugriffsschlüssel und den geheimen Schlüssel für unsere Anwendung erstellen und den geheimen Schlüssel für unsere Anwendung Suchen Sie hier nach IAM, was für Identitäts- und Zugriffsmanagement steht. Hier gehen wir zu Benutzern und erstellen einen neuen Benutzer. Wir schreiben den Benutzernamen, sagen wir, unseren Linky Pi und klicken auf Weiter Hier müssen wir Richtlinien anhängen, hier nach AS full Xs suchen und die Amazon SS Full Cess-Richtlinie auswählen und auf Weiter klicken und Benutzer erstellen nun den Zugriffsschlüssel zu generieren, öffnen Sie diesen Benutzer und gehen Sie zu den Sicherheitsanmeldeinformationen. Hier haben wir keine Zugriffsschlüssel, also erstellen wir den Schlüssel, wählen eine andere Option und klicken auf Weiter. Hier wird nach einer Beschreibung gefragt, aber es ist optional Erstellen Sie einfach einen Zugriffsschlüssel. Siehst du, hier bekommen wir einen Zugangsschlüssel und auch einen geheimen Zugangsschlüssel. Wir müssen sie zu unserer ENV-Datei hinzufügen. Stellen Sie sicher, dass Sie diese Punkt-CNV-Datei herunterladen. In unserer ENV-Datei füge ich hier zunächst den Variablennamen AWS und den Unterstrich Xs Unterstrichtaste entspricht dem Kopieren der Asse-Taste aus dem Browser und Einfügen in Außerdem fügen wir eine weitere Variable namens AWS hinzu. Underscore Secret, Underscore-Schlüssel entspricht dem Kopieren des geheimen Underscore-Schlüssel entspricht Schlüssels aus dem Browser und fügen ihn namens AWS hinzu. Underscore Secret, Underscore-Schlüssel entspricht dem Kopieren des geheimen Schlüssels aus dem Browser und fügen ihn auch hier ein. Jetzt brauchen wir die Region. In der ENV-Datei fügen wir die AWS-Unterstrichregion hinzu. jetzt die Region hier auf der linken Seite unseres Profils vergessen , erhalten wir eine Liste der Ich komme aus Indien. Deshalb wähle ich Mumbai. Meine Region wird AP South One sein. Hier musst du deine auswählen. Wenn Sie keine Vorstellung haben, können Sie einfach Ihre Region bei Google suchen und den Standort Neal auswählen Ich füge diesen Regionswert in die NV-Datei ein. Jetzt ist unser zweiter Schritt abgeschlossen. Also diese Datei, es sei denn die Funktion zum Senden von E-Mails funktioniert oder nicht, was unser dritter Schritt ist. In unserer Anfrage setzt des die Passwort-API rufen wir die Funktion „ E-Mail senden“ auf ersten Argument rufen wir die Funktion „ E-Mail senden“ auf, um die E-Mail-Adresse des Benutzers weiterzuleiten Der Benutzer punktet hier mit einem Komma, wir schreiben den Betreff unserer E-Mail Definieren wir eine neue Variable für Betreff, der dem Zurücksetzen des Passworts und der Anfrage für Ihr Linkifi-Konto entspricht Anfrage für Ihr Linkifi-Konto Außerdem definieren wir den Text , den wir in den hinteren Häkchen senden möchten . Klicken Sie auf diesen Link Setze dein Passwort zurück, SDDP cool und Double Forward Slash, unser linkify.com Slash-Reset-Passwort unser linkify.com Im Abfrageparameter, Fragezeichen, ist reset tocan gleich wie hier fügen wir Dollar Curly Packets hinzu, ist reset tocan gleich wie hier fügen wir Dollar Curly Packets hinzu, reset tocan. Diese URL ist für den direkten Zugriff oder ein Frontend vorgesehen. Also Instagram-Sinn, richtig. Sie können diesen Text auch an Ihre Bedürfnisse anpassen oder den STML-Code als Hauptteil der E-Mail übergeben den STML-Code als Hauptteil der E-Mail Nur in den E-Mail-Parametern an der Stelle dieses Textes müssen wir STML übergeben In der Funktion E-Mail senden übergeben wir jetzt den Betreff und auch Speichern Sie die Änderungen, es sei denn, diese Funktion zum Senden von E-Mails funktioniert oder nicht. Also ein Postbote, und hier ist eine API zum Zurücksetzen des Passworts , unsere erste API zum Zurücksetzen Bevor ich das anrufe, lass mich hier eine gültige E-Mail weiterleiten , damit ich ein Reset-Token für diese E-Mail erhalte Hier ändere ich meine E-Mail-Adresse in eine meiner Dummy-E-Mails, aktualisiere sie und auch im Hauptteil der Anfrage gebe ich dieselbe E-Mail Gut. Lassen Sie uns jetzt die Anfrage senden. Sehen Sie hier, dass wir die Anfrage nicht senden konnten. Oh sorry, ich habe vergessen den Server zu starten. Also keine Indexpunkte Nett. Lassen Sie uns nun die Anfrage senden. Hier erhalte ich, dass sendemail nicht definiert ist. Ich habe vergessen, das einzugeben. Also oben, die Kosten, E-Mail senden, entsprechen dem Wert „Erforderlich“. Hier geht es einen Ordner nach oben, Config Amazon SCS. Speichern Sie dies und senden Sie die Anfrage erneut. Auch hier erhalte ich eine Fehlermeldung. Sie nicht in Panik. Lass uns nachschauen. Es ist ein Validierungsfehler. Wie wir wissen, haben wir gerade unsere Absender-E-Mail bei Amazon SES verifiziert , aber wir müssen auch die Empfänger-E-Mail verifizieren , um die E-Mail-Funktion zu testen. Dies ist die Voraussetzung von Amazon SES zum Testen des Sandbox-Kontos Wenn wir zur Produktion und zum kostenpflichtigen Tarif übergehen, senden wir E-Mails an alle, ohne deren E-Mail-Adresse zu überprüfen Für die Testumgebung müssen wir die E-Mail-Adresse des Empfängers überprüfen Lassen Sie mich also überprüfen, welche E-Mail-Adresse ich für das Benutzerkonto im Mongo DB Compass verwende Benutzerkonto im Mongo DB Compass Siehst du, das ist E-Mail. Also hier muss ich es zu unserer Benutzeridentität hinzufügen. Also suche Ss so. Gehe zu Identitäten. Erstellen Sie eine Identität, wählen Sie E-Mail aus und wir erfassen Ihre E-Mail-Adresse, die in Ihrer Datenbank verfügbar ist Identität erstellen. Sie senden erneut die Bestätigungs-E-Mail an diese E-Mail. Also öffne ich diese E-Mail hier und öffne diesen Link. Siehst du, wir bekommen Glückwünsche. Gut. Lass mich diese Seite aktualisieren. Siehst du, es ist verifiziert. Also lasst uns wieder sterben. Senden Sie die Anfrage trotzdem, ich verstehe, dass Sandymil nicht definiert ist Lassen Sie mich die Amazon SS-Datei einchecken. Oh, ganz unten habe ich vergessen, diese Klammer zu entfernen Ich habe hinzugefügt, um dir einen Fehler zu zeigen, und ich habe vergessen, ihn zu entfernen Speichern Sie das und lassen Sie uns die Anfrage erneut senden. Siehst du, hier bekommen wir das Reset-Token. Aber wenn wir unser Terminal überprüfen, sehen Sie, hier erhalten wir immer noch einen Validierungsfehler, Amazon SS-Fehler, E-Mail. Lassen Sie uns SandyMLFunction überprüfen. Okay. Hier in der Zieladresse müssen wir diese beiden Adressen in zwei Adressen im Plural ändern zwei Adressen im Plural Versuchen wir es jetzt noch einmal. Hier bekommen wir unser Reset-Token. Schauen wir uns jetzt unser Terminal an. Hier bekommen wir einen neuen Fehler. Die E-Mail-Adresse wurde in dieser Region nicht verifiziert. Aber warum haben wir, wie wir wissen, unsere E-Mail bereits verifiziert Trotzdem erhalten wir diesen Fehler. Lass mich dir das erklären. Hier habe ich unsere beiden E-Mails in der falschen Region verifiziert. Lassen Sie mich auch auf der Amazon-Website nachschauen. Sehen Sie, hier habe ich die Region Europa ausgewählt, und in meiner NV-Variablen übergebe ich die Region Mumbai, und deshalb erhalte ich diesen Fehler. Ich wähle hier diese Umbi-Region aus. Jetzt muss ich beide E-Mails in dieser Region erneut verifizieren. Gehen Sie zu Identitäten, erstellen Sie Identität, wählen Sie hier E-Mail aus, schreiben Sie die E-Mail und erstellen Sie eine Identität Lassen Sie uns nun anhand der E-Mail überprüfen, ob dies gut ist. Jetzt muss ich dasselbe für eine andere E-Mail tun. Wenn ich hier esse und fertig bin, Wenn ich hier esse und fertig sind beide E-Mails für meine Region verifiziert. Lassen Sie uns jetzt noch einmal unsere Implementierung testen. Senden Sie den ersten API-Aufruf. Siehst du, wir bekommen ein Reset-Token. Und wenn wir unser Terminal überprüfen, dann sehen Sie hier, dass wir E-Mails erfolgreich gesendet bekommen, und wir erhalten auch die Nachrichten-ID. Und wenn ich in meinem E-Mail-Posteingang nachschaue, erhalte ich hier die E-Mail im Spam, weil wir uns hier im Verkostungsmodus befinden und die Domain auch nicht verifizieren. In der Produktion müssen Sie kleine Änderungen an der Einstellung vornehmen und Ihre E-Mail wird nicht in den Spam-Ordner verschoben. Das ist die Stärke von Amazon SES. Ich weiß, dass die Einrichtung dieses SES-Kontos etwas schwierig und langweilig ist. Aber für ein reibungsloseres Spielerlebnis wie dieses müssen wir uns von dieser süßen Farbe verabschieden. Jetzt kann der Benutzer diesen Frontend-Link öffnen und dann ruft das Frontend unsere zweite API auf. Das ist die Aufgabe des Frontends. auch Frontend-Entwickler , egal ob Sie ein Link sind. Mach dir darüber keine Sorgen. wenn wir Amazon SES für die Produktion verwenden müssen, müssen wir jetzt auch Zugriff auf die Produktion beantragen. Wenn wir unseren aktuellen Status auf der GetSet-Seite überprüfen siehe derzeit), lautet unser Status Sandbox, was Testen bedeutet Hier können wir die Erwähnung auf den folgenden Karten nachlesen, eine E-Mail-Adresse und eine Absenderdomain verifizieren, eine E-Mail-Adresse und eine Absenderdomain verifizieren um Produktions-CES anzufordern, sodass Sie E-Mails auf Produktionsebene versenden und alle Funktionen von SCS nutzen alle Funktionen von SCS Für die Produktion müssen Sie von hier aus die Versanddomäne verifizieren Und wenn Sie Schreibinformationen angeben und eine Anfrage einreichen, genehmigt AWS diese normalerweise innerhalb von 24 bis 48 Stunden Nach Erhalt der Genehmigung können wir eine E-Mail an die E-Mail-Adresse senden Außerdem werde ich im Artikel unter dieser Lektion weitere Informationen geben . Für die Produktion können Sie das also lesen. Okay? So versenden wir E-Mails auf die sicherste, superschnellste und günstigste Amazon SS-Art und Weise. 166. Kostenloses Versenden von E-Mails: Mal sehen, wie wir E-Mails über SMTP versenden können, was kostenlos ist, aber ein Tageslimit hat Wir können nur 500 E-Mails von GML SMTP senden Wenn Sie YahooSMTP verwenden, können wir nur 100 E-Mails pro Aber für deine lokale Bewerbung oder dein Hochschulprojekt Wenn Sie Amazon SS implementieren und es für Sie funktioniert, können Sie diese Lektion auch Amazon SS implementieren und es für Sie funktioniert, können Sie überspringen, da wir in dieser Lektion nur Funktionen zum Senden von E-Mails hinzufügen werden , genau wie in der vorherigen Lektion. Sehen wir uns nun die SMTB-Implementierung an. Ich teile diese Implementierung in drei einfache Schritte auf. Schritt eins: Wir werden die SMTV-Konfiguration in der Knotenanwendung implementieren SMTV-Konfiguration in der Knotenanwendung Dann Schritt zwei, wir werden ein Passwort für SMTB generieren , im letzten Schritt drei werden wir diese Implementierung testen Fangen wir mit Schritt Nummer eins an. Für die Implementierung von SMTP benötigen wir ein Paket namens Node Mailer NPM installiert Node Mailer unter d 6.10 0.0 und drückt die Gut. Erstellen Sie jetzt hier in unserem Projekt einen neuen Ordner namens config, und in diesem Ordner werden wir eine neue Datei namens SMTP dot js erstellen eine neue Datei namens SMTP dot js Gut. Um nun mit der Konfiguration zu beginnen, benötigen wir eine Node-Mailer-Methode aus dem Paket Sconst Node Mailer entspricht Require Node Mailer. Und danach müssen wir den Transport für das Setup erstellen. Also nodemler dot Transport erstellen. Und darin müssen wir das Konfigurationsobjekt übergeben Konfigurationsobjekt übergeben Hier werden wir Eigenschaften hinzufügen und die meisten ihrer Werte werden wir in die ENV-Datei übergeben Also Host-zu-Prozess-Punkt jetzt Punkt SMTP Underscore-Host. Zweitens benötigen wir einen Port, um den SMTP-Underscore-POD mit Punkt zu verarbeiten SMTP-Underscore-POD mit Punkt Danach von Secure to True. Dieser Wert gilt nur für PUT 465. Für andere Pots müssen wir den falschen Wert verwenden. Danach gehen wir zum Objekt über. Und hier müssen wir von Benutzer zu Prozess Punkt für Punkt SMTP übergeben , Benutzer unterstreichen Und danach geben Sie Punkt und Punkt SMTP an den Prozess weiter, Keine Sorge, wir werden diese Werte in nur einer Minute übergeben. Für das Senden der E-Mail erstellen wir nun eine neue Funktion namens SMTP senden E-Mail entspricht der Fehlerfunktion In dieser Funktion ist es nun besser, vor dem Schreiben des Codes vor dem Schreiben des Codes einen Try- und Cache-Block hinzuzufügen Und im Cache-Block werden wir das Konsolen-Punktprotokoll übergeben. Fehler beim Senden von E-Mails und einfach beim Hinzufügen der E-Mail. Jetzt im Dri-Blog fügen wir Kosten hinzu. Die E-Mail-Optionen entsprechen dem Objekt. Hier übergeben wir einige Optionen. Ab zwei Prozesspunkten nvt SMTP underscore-Benutzer, dann haben wir Hier müssen wir die E-Mail des Empfängers weitergeben . Aber hier ist eine Frage. Wie können wir in dieser Funktion die E-Mail des Empfängers abrufen Richtig, wir werden es vom Parameter bekommen. Also fügen wir auch hinzu. Außerdem brauchen wir hier ein Thema. Dies ist der Betreff unserer E-Mail und wir übergeben auch Text , der der Hauptteil der E-Mail ist. In den Optionen fügen wir nun zwei bis zwei hinzu, je nach Betreff und Text zu Text. Wir haben also Optionen bereit. Jetzt müssen wir nur noch die E-Mail senden. Warte, und hier brauchen wir einen Transporter , den wir von dieser Node-Miller-Methode bekommen Also speichern wir es unveränderlich mit dem Namen Transporter, und in der Funktion Send Mail verwenden wir Transporter Dot Send Mail, hier müssen wir Dieser Ausdruck schreibt die Antwort, also speichern wir sie in Schließlich konsolen wir einfach das Punktprotokoll, E-Mail wurde erfolgreich gesendet, und wir fügen auch die Nachrichten-ID hinzu, und wir halten uns an die Antwortpunktnachrichten-ID. die E-Mail zu senden, müssen wir nur diese Funktion aufrufen und diese Argumente übergeben. Wir exportieren diese Funktion mit einem Modul, das exportiert, was dem Senden von SMTP-E-Mails entspricht Speichern Sie diese Datei, und jetzt rufen wir in unserer API zum Zurücksetzen von Anfragen einfach hier an, senden Sie die SMTP-E-Mail-Funktion und sehen Sie, wie atoiput Hier in der vorherigen Lektion habe ich diese beiden Variablen, Betreff und Text, erstellt Sie können das kopieren und einfach in dieser Funktion dem Benutzer eine Punkt-E-Mail übergeben, Benutzer eine Punkt-E-Mail übergeben, die die Empfänger-E-Mail, das Komma, die die Empfänger-E-Mail, das Komma, den Betreff und den Text enthält Lassen Sie mich nun diese vorherige Funktion für Amazon SES kommentieren für Amazon SES Hier ist unser erster Schritt erledigt. Gehen wir nun zu Schritt zwei über, dem Umgebungsvariablen definiert werden. der vorherigen Lektion habe ich also bei ENV-Dateien diese vier Variablen für Amazon SES hinzugefügt Wenn Sie das nicht anwenden , machen Sie sich keine Sorgen. Jetzt übergeben wir hier vier Variablen für SMTP. Wenn Sie sich nicht an ihre Namen erinnern, können Sie sie einfach aus dem Code kopieren Daran ist nichts falsch. Also zuerst sind SMTP und Ace Host gleich hier verwende ich GMLHst , also schreibe ich smtp.gmail.com Danach entspricht der SMTP-Underscore-Port 465. Wenn Sie Yahoo oder Outlook verwenden, können Sie hier die Post- und Port-Werte verwenden Aber Gmail ist gut für SMTP. Jetzt benötigen wir den SMTP-Unterstrich-Benutzer, und hier übergeben wir die E-Mail, von der aus wir E-Mails senden möchten Dies ist die E-Mail-ID des Unternehmens. Also hier füge ich meine E-Mail-ID hinzu. Ich verwende diese E-Mail nur für Demos, in Zukunft werde ich sie nicht mehr verwenden. Jetzt müssen wir nur noch den SMTP-Unterstrich übergeben , das dem hier entspricht Wir können unser Gmail-Passwort übergeben, aber nach 2024 erlaubt Gmail diese Art von Einstellung nicht mehr Anstatt also ein echtes Passwort zu übergeben, können wir ein Passwort übergeben Mal sehen, wie wir ein Passwort generieren können. Öffnen Sie also google.com und verwalten Sie mein Google-Konto. Hier gehen wir zur Sicherheit. Für die Generierung des App-Passworts gibt es nun eine Bedingung. In unserem Google-Konto muss eine Bestätigung in zwei Schritten nicht möglich sein. Wenn es für Ihr Konto deaktiviert ist, müssen Sie es aktivieren. Andernfalls erhalten Sie einen SMTP-Fehler. Nachdem Sie die Überprüfung oben nicht Schritt für Schritt ausführen können, suchen Sie nach einem Passwort und öffnen Sie die A-Passwörter in der Sicherheitsleiste Es wird Sie zuerst verifizieren, gut. Jetzt ist es App-Name. Hier können wir Node, Miller, SMTV oder einen anderen Namen schreiben , es spielt keine Rolle einzige Sache in der Zukunft ist, wenn Sie dieses App-Passwort entfernen möchten, dann können Sie sich den Namen der App merken Klicken Sie nun auf Erstellen. Sehen Sie, hier bekommen wir ein 16-stelliges Passwort, kopieren Sie es einfach und Sie können auch einen Screenshot machen oder auf Ihrem Telefon auf Foto klicken , denn sobald wir es schließen, können wir das Passwort nicht mehr sehen. Kopieren Sie das und fügen Sie es in unsere ENV-Datei ein. Stellen Sie sicher, dass Sie den Raum so lassen, wie er ist. Ändere daran nichts. Und das ist es. Hier ist unser zweiter Schritt abgeschlossen. Gehen wir nun zu Schritt drei über, dem Testen. also vor dem Testen sicher, dass Sie die gültige E-Mail-Adresse in Ihren Benutzerdaten angeben. Wenn Sie Ihre E-Mail nicht weitergeben, können Sie sie über den Mongo DB Compass ändern Okay. Öffnen Sie jetzt Postman und hier senden wir die erste Anfrage, die Passwort-API zum Zurücksetzen Siehst du, wir setzen das Token zurück, und wenn wir unser Terminal überprüfen, erhalten wir eine Fehlermeldung. Verbinden, Symbol, Ablehnen. Vielleicht ist das ein Fehler für ein Einmalpasswort. Also lass es mich noch einmal versuchen. Trotzdem erhalte ich den Fehler. Lassen Sie mich also ein weiteres App-Passwort für Nodemiler, SMTP, erstellen und kopieren und sicherstellen, und Ersetzen Sie jetzt in unserer ENV-Datei das Passwort Versuchen wir es jetzt noch einmal. Senden Sie die erste Anfrage. Hier erhalten wir ein Token und im Terminal, sehen Sie, wir bekommen erfolgreich eine E-Mail gesendet, und wir erhalten auch die Nachrichten-ID. Und wenn ich meinen Posteingang öffne, siehst du, hier erhalte ich die neue E-Mail. Es ist so einfach, E-Mails von einer Node-Anwendung aus zu senden. Zusammenfassend lässt sich sagen, dass Sie Amazon SES für Unternehmensanwendungen verwenden können, und wenn Ihre Anwendung klein ist, können Sie die SMTP-Methode verwenden, aber damit erhalten wir nur 500 E-Mails an einem Tag, es liegt ganz bei Ihnen, welche Sie wählen 167. Follower und die Logik folgender Gemeinschaft: Heutzutage gibt es in jeder Social-Media-Anwendung eine Follower- und Follow-Funktion Lassen Sie uns das also auch in unserer Anwendung implementieren . Sie könnten ein wenig Angst vor dieser Funktion bekommen , wenn Sie sie zum ersten Mal implementieren. Aber glaub mir, es ist wirklich einfach. Lassen Sie uns also zunächst die Logik von Follower und Follow verstehen die Logik von Follower und Follow Also hier sind wir, welcher der Login-Benutzer in unserer Anwendung ist. Und hier ist ein weiterer Benutzer, sagen wir Harley und sein Profilstatus ist öffentlich Jetzt willst du Harley folgen, also drückst du die Follow-Taste Nun, was ist im Backend passiert? Zuallererst fügen wir für jeden Benutzer drei neue Felder in das Benutzerschema ein, Follower. Dabei handelt es sich um die Gruppe von Benutzern, die diesem Benutzer folgen. Hier fügen wir Benutzer-IDs als Referenz hinzu. Als Nächstes fügen wir das folgende Feld hinzu, bei dem es sich um das Array von Benutzern handelt , denen dieser Benutzer folgt. Schließlich fügen wir eine Follow-Anfrage hinzu, die ebenfalls ein Array ist, aber darin fügen wir alle Benutzer-IDs hinzu, die Anfragen senden, um dem Benutzer zu folgen. Wir fügen dieser Follow-Anfrage nur dann eine Benutzer-ID hinzu, wenn das Benutzerkonto privat ist. Nun zurück zu unserem Beispiel. Nehmen wir an, Sie möchten Hurley folgen und das Hurley-Konto ist öffentlich Zunächst wird Ihre Benutzer-ID in die Hurley-Follower-Liste Dann wird Halleys Benutzer-ID zu Ihrer folgenden Liste hinzugefügt. Sehr einfach. Jetzt hier, Halleys Konto ist öffentlich Was ist, wenn wir sein Konto auf privat setzen? In diesem Fall können wir Ihre Benutzer-ID nicht zur Halley-Follow-Liste hinzufügen Ihre Benutzer-ID nicht zur Halley-Follow-Liste In diesem Fall fügen wir Ihre Benutzer-ID dem Follow-Request-Array von Hal Jetzt hat Hali zwei Optionen. Er kann die Anfrage annehmen oder ablehnen. Wenn Ali ablehnt, entfernen wir einfach Ihre Benutzer-ID aus der AlisFollow-Anfrage Was ist nun, wenn Hali die Anfrage annimmt? Dann entfernen wir zunächst Ihre Benutzer-ID aus der Anfrageliste und fügen sie der Follower-Liste Außerdem fügen wir Ihrer folgenden Liste die Hale-Benutzer-ID hinzu. So einfach sind also dieser Follower und die folgenden Funktionen In der nächsten Lektion werden wir nun AEI für diese Funktionen definieren 168. Folgen Sie dem Benutzer: Lassen Sie uns nun die API für das Hinzufügen von Followern definieren. Wie wir wissen, ist die Logik sehr einfach. Lassen Sie uns es also schnell implementieren. Hier unten fügen wir dem Schrägstrich den Router-Punkt-Post-Endpunkt hinzu Hier fügen wir die Benutzer-ID hinzu, sodass der Schrägstrich der Spalten-Benutzer-ID folgt Dies ist die Benutzer-ID des Benutzers, dem wir folgen möchten. Außerdem benötigen wir eine angemeldete Benutzer-ID, also fügen wir hier Middleware und Acing-Funktion mit Anfrage und Acing-Funktion mit Anfrage In dieser Funktion erhalten wir nun zunächst diese Benutzer-ID, sodass die Const-Benutzer-ID der Anforderungspunkt-Benutzer-ID mit dem Punkt Perms entspricht Anforderungspunkt-Benutzer-ID mit dem Punkt Perms entspricht Außerdem benötigen wir const, aktuelle Benutzer-ID entspricht der angeforderten Punkt-Benutzerpunkt-Unterstrich-ID Punkt-Benutzerpunkt-Unterstrich-ID Zunächst werden wir eine Bedingung überprüfen. Wenn die Benutzer-ID der aktuellen Benutzer-ID entspricht, geben wir eine Antwort mit dem Statuscode 400 für eine fehlerhafte Anfrage zurück . Punkt Json Object, Message-Eigenschaft Du kannst dir selbst nicht folgen. Die erste Logik der Follow-API besteht darin, dass wir überprüfen, ob ein anderes Benutzerkonto privat oder öffentlich ist. Dafür gelangen wir zu Benutzerinformationen. , dem der Benutzer folgt, entspricht also dem Abwarten des Benutzers, Punkt, Punkt, Kauf der ID. Und hier übergeben wir die Benutzer-ID. Als nächstes bestehen wir Ihre Bedingung. Wenn der Benutzer, dem Sie folgen möchten, nicht verfügbar ist, geben Sie die Antwort mit dem Statuscode 404 und Json an das Objekt mit der Nachrichteneigenschaft „Benutzer nicht gefunden“ zurück. Außerdem müssen wir aktuelle Benutzerinformationen finden. Const current user entspricht also await user dot Fine BD und übergibt hier die aktuelle Benutzer-ID Und übergebe auch hier dieselbe Bedingung, also dupliziere diese Bedingung also dupliziere diese Bedingung Alt plus Sift plus Abwärtspfeil oder Wahltaste plus Sieb plus Abwärtspfeil und verschiebe diese Zeile nach unten, wenn du die Options-oder Alter-Pfeiltasten zurückhältst Und hier ändern wir diesen Benutzer einfach in den aktuellen Benutzer. Nachdem wir beide Benutzer erhalten haben, können wir Ihre Bedingung übergeben, ob der Benutzer, dem Sie folgen möchten, privat ist. Wenn das stimmt, bedeutet das, dass das Konto privat ist. Wenn das Konto privat ist, müssen wir die aktuelle Benutzer-ID in der Follow-Anfrage für andere Benutzer hinzufügen . Aber dafür müssen wir unserem Benutzerschema drei Felder hinzufügen . Im Benutzerschema fügen wir also endlich gefüllte Follower zum Array hinzu, und darin fügen wir den Objekttyp zum Mongoose-Punktschema, fügen wir den Objekttyp zum Punkttypen, Punkt, Objekt-ID und Referenz zum Außerdem benötigen wir folgende und nachfolgende Anfragen, die denselben Schematyp und dieselbe Benutzerreferenz Genau hier ändern wir das Folgende und Folgen der Anfrage. Speichern Sie diese Datei und kehren Sie zu unserer Route zurück. Hier schreiben wir User to Follow, Dot Follow Request, Punkt Push. Und hier fügen wir die aktuelle Benutzer-ID hinzu und können dann darauf warten, dass der Benutzer dem Punkt Save folgt. Und hier geben wir eine Antwort mit einer JSON-Nachricht zurück. Um zu folgen, Anfrage gesendet. Gut. Aber hier ist eine Sache. Möglicherweise ist der Benutzer bereits im Follow-Request-Array verfügbar. Vor dieser Push-Methode fügen wir die Bedingung I user to follow dot follow request dot include hier hinzu, wir übergeben die aktuelle Benutzer-ID. Wenn die aktuelle Benutzer-ID im Array verfügbar ist, geben wir den Antwortstatus und das 400-Punkt-JSON-Objekt mit msatPerty zurück, 400-Punkt-JSON-Objekt mit um der bereits gesendeten Anfrage zu folgen Danach fügen wir s hinzu und können diesen Teil in den S-Block verschieben Hier schreiben wir also die Logik des Hinzufügens Follow-Anfrage, wenn das Konto privat ist unser anderes Benutzerkonto jedoch öffentlich sein kann. Wenn wir danach Ls hinzufügen Sie verwirrt sind, können Sie Befehle dafür schreiben. Ich schreibe hier einen Kommentar, Logik für die Öffentlichkeit. Gut. Nun, was wollen wir tun , wenn das Konto öffentlich ist? Richtig, wir fügen die aktuelle Benutzer-ID direkt zur Follower-Liste hinzu, und in der Liste der aktuellen Benutzer , die folgen, fügen wir die Benutzer-ID hinzu Benutzer, dem du folgst, Punkt, Follower, Punkt drücken. Hier fügen wir die aktuelle Benutzer-ID und danach den aktuellen Benutzer hinzu, Punkt folgt, Punkt Push. Und hier fügen wir die Benutzer-ID hinzu. Und danach speichern wir diese beiden Dokumente. also darauf, dass der Benutzer Punkt Speichern folgt, und warten Sie auf den aktuellen Benutzer Punkt Speichern. Danach geben wir die Antwort mit JSON-Objekt mit der Nachrichteneigenschaft Benutzer gefolgt“ zurück. Wie zuvor ist es möglich, dass unsere aktuelle Benutzer-ID bereits in der Follower-Liste verfügbar ist Wir übergeben Ihre Bedingung vor dieser Logik. Wenn der Benutzer Punkt-Followern folgt, wird hier die aktuelle Benutzer-ID mitgegeben. Wenn es verfügbar ist, geben wir die Antwort mit dem Statuscode 400 für eine Batanfrage und im Jason-Objekt mit Nachrichteneigenschaft an den Benutzer zurück, der dem Benutzer bereits folgt. Danach fügen wir s hinzu und verschieben diesen Code in den se-Block. Das ist es. Das ist wirklich einfach. Lassen Sie uns nun diese Implementierung testen. Um die folgende API zu testen, benötigen wir also ein anderes Benutzerkonto. Lassen Sie uns zuerst diese erstellen, die erstellte Benutzer-API öffnen , den Benutzernamen ändern, sagen wir Hurley 001, und eine E-Mail an Hali auf der roten Außerdem werde ich das gleiche Passwort verwenden. Andernfalls werde ich das Passwort vergessen und die Anfrage abschicken. Siehst du, hier bekommen wir das neue Benutzer-Token. Hier benötigen wir diese Hurley-Benutzer-ID. Also pro Mongoi kompass wir, gehen zu Benutzern und kopieren diese neue Benutzer-ID Zurück zu Postman for follow, wir erstellen eine neue Anfrage Follow API, SDB-Methode, to post, URL zu SDDP, Spalte mit doppeltem Schrägstrich Lokaler Host, Spalte 3.000, API-Schrägstrich, Schrägstrich, Benutzer-Schrägstrich hier platzieren wir die neue Benutzer-ID , Schrägstrich Wir benötigen das aktuelle Benutzertoken, also gehen wir zur Login-API, ändern das Passwort, weil wir es in unserer vorherigen Lektion geändert haben, und senden die in Kopieren Sie dieses Token, und in unserer Follow-API gehen wir zu den Headern, halten uns an die Autorisierung und geben im Wertträger die Leertaste für das Und sende die Anfrage. Siehst du, hier bekommen wir den Benutzer erfolgreich verfolgt. Wir sind dem Benutzer direkt gefolgt , weil das neue Benutzerkonto öffentlich ist. Lassen Sie uns nun auch probieren, indem wir das Konto privat machen. Also gehen wir zum Mongo Di BecomasRaktualisieren die Daten. Zuerst entfernen wir die ID aus der folgenden Liste. Außerdem entfernen wir die ID aus der Follower-Liste und setzen dieses neue Benutzerkonto auf True und aktualisieren es Lassen Sie uns nun zur API zurückkehren und die Anfrage senden. Sehen Sie hier, wir bekommen die folgende Anfrage sehr nett gesendet. In der nächsten Lektion werden wir nun eine API erstellen, um die Follow-Anfrage anzunehmen und die Follow-Anfrage abzulehnen 169. Folgende Anfrage akzeptieren: Definieren wir die API für die Annahme und Ablehnung der Folgeanfrage Zunächst werden wir die Ablehnung der Anfrage implementieren, weil sie einfach zu testen ist. Der Router sendet also einen Punkt und zeigt auf einen Schrägstrich, um die DS-Anfrage abzulehnen, Schrägstrich und hier benötigen wir die Benutzer-ID des Rufen Sie die ID des Anforderers an. benötigen wir auch die orthomedale Wir fügen eine Sign-Calve-Funktion mit Anfrage und Antwort hinzu. Zuallererst erhalten wir in dieser Funktion die Kosten, erhalten wir in dieser Funktion die Kosten, entspricht der Anforderer-ID Anforderungspunkts Perms Dot Außerdem benötigen wir const, aktuelle Benutzer-ID entspricht Anforderungspunkt-Unterstrich-ID, die wir von dieser Omdalware erhalten Zunächst werden wir prüfen, ob beide Benutzer in unserer Sammlung verfügbar sind oder Denken Sie daran, dass wir dasselbe in der vorherigen API getan haben. Hier ist es, kopiere diesen Code. Kopieren Sie außerdem diese erste Bedingung für dieselbe ID und fügen Sie sie unten in unsere Ablehnungs-API ein. Hier müssen wir kleine Änderungen vornehmen. An der Stelle der Benutzer-ID müssen wir also die Anforderer-ID und hier auch die Anforderer-ID hinzufügen und hier auch die Anforderer-ID Außerdem müssen wir diesen Variablennamen ändern, also den Benutzer auswählen, dem Sie folgen möchten, F zwei drücken und diesen in Anforderer Benutzer ändern Wird uns mehr Klarheit geben. die Anfrage abzulehnen, müssen wir nur noch die Anforderer-ID Um die Anfrage abzulehnen, müssen wir nur noch die Anforderer-ID aus dem Follow-Request-Array entfernen aus dem Follow-Request-Array Vorher können wir jedoch überprüfen, ob wir die ID im Follow-Request-Array angefordert haben oder Wenn also der Punkt der aktuellen Benutzeranforderung die Anforderer-ID enthält und diese Bedingung nicht zutrifft, übergeben wir hier ein Ausrufezeichen und geben dann die Antwort mit dem Statuscode 400 und dem Punkt JSON-Objekt mit Nachrichteneigenschaft zwei zurück, keine Folgeanfrage Anforderer-ID enthält diese Bedingung nicht zutrifft, übergeben wir hier ein Ausrufezeichen und geben dann die Antwort mit dem Statuscode 400 und dem Punkt JSON-Objekt mit Nachrichteneigenschaft zwei zurück , keine Folgeanfrage Und wenn die Anfrage gefunden wurde, dann können wir hier die Filtermethode verwenden , um die Anforderer-ID aus dem Array zu entfernen aktualisierte Anfrage entspricht also dem aktuellen Punktfolge-Anforderungspunktfilter für den aktuellen Benutzer Hier fügen wir ID hinzu, was das einzelne Element dieser Array-Pfeilfunktion ist , und hier geben wir die Bedingung dt zurück zwei Zeichenfolge, die nicht der Anforderer-ID entspricht Dadurch wird die Anforderer-ID aus dem Follow-Request-Array entfernt Wir können einfach festlegen aktuelle Benutzer eine Punktfolge-Anfrage erhält , die einer aktualisierten Anfrage entspricht Und dann warten wir auf den aktuellen Benutzer mit Punkt c. Und zuletzt geben wir einfach eine Antwort mit einem JSON-Objekt mit der Nachrichteneigenschaft „Folgen“, „ Anfrage“, „Ablehnen“ zurück, und das war's. Lassen Sie uns nun diese API testen. Öffnen Sie also Postman und hier fügen wir eine neue Anfrage hinzu, die als Ablehnung der Folgeanfrage bezeichnet wird In diesem Fall stellen wir die API-Methode so ein, dass sie posten und auf SDDP verweist, Spalte Double für Schrägstrich, lokaler Host, Spalte 3.000 API-Benutzer Schrägstrich, Schrägstrich hier müssen wir die Anforderer-ID übergeben, das ist die ID des Benutzers, der die Hier öffnen wir Mongo Db Compass und können Sie mir sagen, welcher Benutzer Richtig, es ist unser erster Benutzer, dessen ID im Follow-Request-Array eines anderen Benutzers hinzugefügt wird Follow-Request-Array eines anderen Benutzers Kopieren Sie also diese ID und fügen Sie sie in die URL ein, und wir senden die Anfrage. Oh, wir müssen das JWT-Token übergeben. Jetzt brauchen wir hier das Token des Benutzers, der die Anfrage erhält, das ist unser neuer Benutzer Also ändere ich in der Login-API den Benutzernamen Hurley 001 und ändere auch das Passwort und sende die Anfrage Kopiere dieses Token. Und in der Ablehnungs-API gehen wir zu den Headern, halten die Autorisierung fest und fügen den Wert in den Trägerbereich ein und platzieren das Token Jetzt senden wir die Anfrage. Siehst du, hier bekommen wir die Folgeanfrage abgelehnt. Als ob wir unsere Datenbank überprüfen würden, aktualisieren Sie die Sammlung. Sehen Sie, für den zweiten Benutzer erhalten wir in der Folgeanfrage keine ID. Hier funktioniert unsere abgelehnte API gut. Jetzt können wir eine API für die Annahme der Benutzeranfrage definieren. Diese API ist der API für abgelehnte Anfragen sehr ähnlich, daher kopieren wir die gesamte API und fügen sie unten ein. Gut. Hier ändern wir zunächst den Endpunkt so, dass er die Anforderer-ID als Anfrage akzeptiert Wenn wir danach die Anfrage akzeptieren, müssen wir auch die Anforderer-ID aus dem Follow-Request-Array entfernen aus dem Follow-Request-Array Also behalten wir unseren Code so wie er ist. Aber nachdem wir die Anforderer-ID entfernt haben, müssen wir die Anforderer-ID zur Follower-Liste hinzufügen Das bedeutet, dass wir die Folgeanfrage akzeptieren . also vor der Speichermethode Fügen Sie also vor der Speichermethode den aktuellen Benutzer Dot Follower Dot Push hinzu. Hier geben wir die Anforderer-ID an und müssen außerdem die aktuelle Benutzer-ID in die folgende Liste der anfragenden Benutzer aufnehmen Also, Benutzer, Punkt auf Punkt, Push . Hier übertragen wir die aktuelle Benutzer-ID. Warten wir nun auch auf das Speichern des Anforderers durch den Benutzer. Endlich ändern wir die Nachricht in „Anfrage folgen“, akzeptiert“, und das war's Lassen Sie uns nun auch diese API probieren. Also zurück zu Postman und hier brauchen wir dieselbe Anfrage wie Ablehnen Also können wir die Taste-API von hier aus duplizieren und den Namen ändern, um die folgende Anfrage zu akzeptieren Auch Endpunkt, der als Anforderer-ID akzeptiert werden soll. Und wenn wir die Header überprüfen, sehen Sie, hier bekommen wir auch das Token, und deshalb duplizieren wir diesen Test Lassen Sie uns nun diese API-Anfrage senden. Siehst du, hier wurde keine Follow-Anfrage gefunden, weil wir die Follow-Anfrage gerade abgelehnt haben. Hier müssen wir die Folgeanfrage erneut senden. Dazu gehen wir zur Follow-API und senden die Follow-Anfrage. Anfrage gesendet, gut. Gehen Sie jetzt zurück, um die Anfrage-API zu akzeptieren und die Anfrage zu senden. Siehst du, wir bekommen die Anfrage akzeptiert, und wenn wir unsere Datenbank überprüfen, aktualisieren wir die Sammlung. Sehen Sie, hier erhalten wir auch die Benutzer-ID in der Follower-Liste und beantragen unsere ID aus der Folgeanfrage entfernt wird Und hier erhalten wir die ID in der folgenden Liste. 170. Übung - Liste der Follower abrufen und der Community folgen: Jetzt ist es Zeit für ein wenig Bewegung. In dieser Übung möchte ich, dass Sie zwei APIs erstellen. Eine API zum Abrufen der Benutzerliste eines anderen Benutzers und eine zweite API zum Abrufen der folgenden Liste eines anderen Benutzers. Wenn Sie Benutzer eins sind, können Sie eine Anfrage senden, um die Liste der Benutzer zwei, der Follower und der folgenden Personen, abzurufen. Hier sieht unsere API so aus. Slash-API-Benutzer-ID, Slash-Follower. Folgender Schrägstrich für folgende API. Denken Sie zuerst über Logik nach und implementieren Sie sie dann. Es ist wirklich einfach. Ich weiß, dass du diese Übung abschließen kannst. Versuche das zu lösen und was ist dann die Lösung. Ich hoffe, du schließt diese Übung ab oder versuchst, sie zu lösen. Schätzen Sie sich selbst dafür. Sehen wir uns jetzt die Lösung an. Hier fügen wir also Router Dot Get hinzu und zeigen auf Slash Colin User ID, Slash Dies ist die ID des Benutzers dessen Follower-Liste der angemeldete Benutzer sehen möchte Also brauchen wir Middleware und dann Callback-Funktion mit Anfrage In dieser Funktion erhalten wir zunächst die Cost-Benutzer-ID, die der Punkt-Benutzer-ID der Anfrage entspricht , der Perms-Punkt-Benutzer-ID Außerdem benötigen wir die Kosten, der aktuelle Benutzer, entspricht der Punkt-Unterstrich-ID der Anfrage Lassen Sie uns nun die Logik dieser API verstehen. Sollten wir die Follower-Liste eines Benutzers anzeigen, Nr. Sie können nur die Follower-Liste der Benutzer sehen, denen Sie folgen oder deren Konto öffentlich ist. Hier benötigen wir die aktuelle Follower-Liste und ein anderer Benutzer befindet sich in Privatbesitz Auch hier kopieren wir den Code beider Benutzer aus der vorherigen API und fügen ihn in diese API Jetzt ändern wir hier den Variablennamen in Benutzer und ändern diese Anforderer-ID in Benutzer-ID Gut. Danach können wir die Bedingung übergeben, ob der Punkt den Benutzerpunkt, den Follower-Punkt einschließt, hier übergeben wir die aktuelle Benutzer-ID. Oder Benutzerpunkt ist privat ist falsch, was bedeutet, dass das Benutzerkonto öffentlich ist. Wenn eine dieser Bedingungen zutrifft, zeigen wir den Benutzern die Follower-Liste an. Antwortpunkt Json zurück, und hier übergeben wir die Punkt-Follower des Benutzers. Wir fügen hinzu und geben dabei den Antwortpunkt Status 400 Punkt Jon zurück , übergeben Ihr Objekt mit Nachrichteneigenschaft, Gant, Follower-Liste abrufen, Konto ist privat Lassen Sie uns nun diese Implementierung durchführen, die Änderungen speichern und Postman öffnen Hier erstellen wir eine neue Anfrage Namen Getting Users Follower List Hier fügen wir URL, SDP, Spalte mit zwei vier Schrägstrichen, lokaler Host, Spalte 3.000, Schrägstrich-API, Schrägstrich-Benutzer-ID und zuletzt Schrägstrich-Follower nun zur Mongo DB-Datenbank zurück, kopieren Sie diese zweite Benutzer-ID, die einen Follower hat, und fügen Sie diese ID in die Jetzt müssen wir in dieser API das Token übergeben. Gehen Sie also zu den Headern Fügen Sie hier Autorisierung und Wert zum Trägerbereich hinzu. Und hier müssen wir ein anderes Benutzer-Token übergeben , das dieser Benutzer-ID folgt Also zurück zur Login-API, und hier melden wir uns einfach mit dem alten Konto an, ändern das Passwort und senden diese Anfrage. Sehen Sie, hier bekommen wir ein Token, kopieren es und fügen es in unseren API-Header ein. Gut. Senden Sie jetzt die Anfrage. Siehst du, hier bekommen wir das Array mit der ID des Followers. Aber wie wir wissen, müssen wir in der realen Welt den Benutzernamen anzeigen, also müssen wir ihn füllen Dafür hatten wir in unserer feinen Abfrage zuerst die Methode populatet, wir übergeben den Namen der Füllung, den wir auffüllen wollen, also Follower , und dann übergeben wir den Namen der Füllung, wir aus der Referenz erhalten wollen, nämlich Unterstrich-ID und Benutzername. Nun, hier ist eine Sache. Hier füllen wir die Follower-Liste aus Jetzt ist es nicht mehr dasselbe wie zuvor. Es wird ein Array von Objekten mit Unterstrich-ID - und Benutzernamen-Feldern in jedem Objekt Wir können hier also nicht weitermachen, dazu gehört auch die Methode. Wir können die Fine-Indexmethode verwenden, die wir in den vorherigen Projekten verwendet haben, und hier auch eine andere Bedingung, den aktuellen Benutzer, Punkt nach Punkt einschließen, und hier übergeben wir die Benutzer-ID. Wenn also der aktuelle Benutzer dem anderen Benutzer folgt, können wir auch diese Follower-Liste abrufen. Speichern Sie die Änderungen und schauen Sie sich das an. Senden Sie die Anfrage. erhalten wir die folgende Liste mit ID und Benutzername. Lassen Sie uns nun eine weitere API erstellen und Sie haben es richtig erraten Wir werden diese API duplizieren und unten fügen wir sie hier Jetzt müssen wir hier nur kleine Dinge ändern. Also ändern wir zunächst den Endpunkt Schrägstrich-Benutzer-ID, gefolgt von einem Schrägstrich Dann müssen wir hier in der Benutzerabfrage das folgende Feld ausfüllen, dann ist diese Bedingung dieselbe und wir ändern die Nachricht in die folgende Liste, Konto ist privat, und fertig In der nächsten Lektion werden wir nun die API definieren, um dem Benutzer nicht mehr zu folgen 171. Übung - Folgen Sie dem Benutzer nicht mehr: Lass mich dir eine weitere Übung geben. In dieser Übung müssen Sie eine API erstellen, um dem Benutzer nicht mehr zu folgen Unser API-Endpunkt wird also so aussehen. Schrägstrich API-Benutzer, Schrägstrich Benutzer-ID, Schrägstrich Unfollow. Es ist wirklich einfach, etwas Zeit und Und danach komm zurück und sieh dir die Lösung an. Lassen Sie uns jetzt schnell die Lösung sehen. Hier schreiben wir also Router Dot Post und 0.2 Slash Column, User ID, Slash Außerdem benötigen wir die ACN-Callback-Funktion von Omidleware mit Anfrage und Antwort. Jetzt müssen wir hier beide Benutzer finden. Kopieren Sie also diesen Startcode mit diesen beiden Bedingungen und übergeben Sie diesen Code in unserer API. Hier brauchen wir diese Methode zum Ausfüllen nicht , also entfernen wir und ändern diesen Benutzernamen in user to unfollow Gut. Jetzt, nachdem wir beide Benutzer abgerufen haben, übergeben wir Ihre Bedingung Ich verwende, um Punkt-Followern nicht mehr zu folgen, Punkt schließt die aktuelle Benutzer-ID ein, falls sie nicht wahr ist, und hier fügen wir Ausrufezeichen hinzu, und dann geben wir hier eine Antwort mit dem Statuscode 400 zurück und in Jason übergeben wir die Objektnachricht an Benutzer ist in den Followern nicht verfügbar Danach können wir die aktuelle Benutzer-ID aus der Liste der Follower des Benutzers entfernen aktuelle Benutzer-ID aus der Liste der Follower des Benutzers der nicht mehr folgt Benutzer bis Dart-Followern nicht mehr folgen“ entspricht also der Punktfiltermethode „ Benutzer bis Dart-Followern nicht Hier erhalten wir jede ID und hier geben wir die Bedingungs-ID zurück Zeichenfolge mit Punkt zwei entspricht nicht Außerdem entspricht aktueller Benutzer, Punkt folgt dem aktuellen Benutzer, Punkt folgt, Punktfilter. Hier erhalten wir die ID-Pfeilfunktion, und die Zeichenfolge ID 2 entspricht nicht der Benutzer-ID. Jetzt können wir beide Dokumente speichern, darauf warten, dass der Benutzer Punkt C nicht mehr folgt und auf den aktuellen Benutzer Punkt C warten. Und hier geben wir das Antwortpunkt-JSON-Objekt mit der Nachrichteneigenschaft „Benutzer hat erfolgreich nicht mehr gefolgt“ zurück Antwortpunkt-JSON-Objekt mit Nachrichteneigenschaft „Benutzer hat erfolgreich nicht mehr gefolgt Und fertig. Jetzt können wir diese Implementierung probieren. Also ein Postman und hier duplizieren wir diese Follow-API. Ändern Sie den Namen in Unfollow API. Lassen Sie uns nun den Endpunkt in Schrägstrich user, slash-ID, slash unfollow ändern slash-ID, slash unfollow und die Anfrage senden. Sehen Sie, hier erhalten wir die Erfolgsmeldung user , unfollow successfully. So haben wir also die API für Follower, Following-Requests und Reject-APIs implementiert Following-Requests und Reject-APIs Sie können sehen, dass es wirklich einfach ist. Wir müssen die Logik verstehen bevor wir neue Funktionen implementieren . 172. Abschnitt 14 - Einleitung: Willkommen im 14. Abschnitt des ultimativen No-JS-Kurses. In diesem Abschnitt werden wir Funktionen implementieren, die sich auf Beiträge beziehen, z. B. das Posten eines neuen Bildes oder Videos, Anzeigen eines Beitrags und das Löschen des gesamten Beitrags. Außerdem werden wir Funktionen wie „ Gefällt mir“ und „Gefällt mir“ hinzufügen , einen neuen Kommentar zu einem Beitrag schreiben, auf die Kommentare antworten und vieles mehr. Dies ist ein wichtiger Abschnitt, also fangen wir mit diesem Abschnitt an. 173. Beitragsmodell erstellen: Lassen Sie uns zunächst ein Post-Schema erstellen bevor wir APIs für Post erstellen. Im Modellordner erstellen wir eine neue Datei namens post dot js. Gehen Sie nun zur Moduldatei des Benutzers, kopieren Sie den gesamten Code von hier und fügen Sie ihn in die Post-Model-Datei ein. Lassen Sie uns nun zunächst dieses Schemaobjekt entfernen und da wir hier einen Namen ändern müssen. Wir mögen dieses Benutzerschema und benennen es mit F Post-Schema um und drücken die Eingabetaste Wählen Sie nun den Benutzer aus und drücken Sie zur mehrfachen Auswahl Strg+D oder Befehlstaste+D und ändern Sie dies in Beitrag Jetzt müssen wir nur noch das Schema-Objekt hinzufügen. Im Post-Dokument benötigen wir ein paar Dinge. Zuallererst benötigen wir den Benutzer, das ist die Benutzer-ID, die ein Bild oder Video gepostet hat. Geben Sie also in Mongos Punktschema Punkt Types Punkt Object ID, Ref to user und required auf true Als Nächstes benötigen wir Medien. Es kann ein Bild oder ein Video sein. Es kann auch eins oder mehrere sein. Also fügen wir hier ein Array hinzu, und darin fügen wir Objekt, ersten Eigenschaftsnamen zum Objekt, Typ zur Zeichenfolge hinzu und verlangen, dass Sie wahr sind. Und noch eine Eigenschaft, media, type to object, type to string. Zahl zu Reihe, hier fügen wir ein Bild hinzu, oder es kann ein Video sein. Da wir es zum Zeichnen erforderlich machen. Durch dieses Schema erhalten wir ein angemessenes Verständnis von Medien. Als Nächstes können Benutzer dem Beitrag eine Überschrift hinzufügen, Text zu einer Zeichenfolge hinzufügen und Dream auf True setzen, um Leerzeichen zu entfernen, oder wir können diese Stream-Eigenschaft auch entfernen. Benutzer können beliebige Arten von Untertiteln hinzufügen. Wir machen es auch nicht erforderlich, da der Benutzer möglicherweise keine Bildunterschrift hinzufügen möchte Danach fügen wir s hinzu, was ein Array ist, und auch hier stand die Referenz des Benutzers. Also kopieren wir diesen Typ und die Ref-Eigenschaft aus dem Benutzerfeld und fügen sie hier ein. Gut. Lassen Sie uns nun einige zusätzliche Felder wie Texte hinzufügen, was auch ein Array, ein Typ zu einer Zeichenfolge ist. Als Nächstes fügen wir der Zeichenfolge auch den Ort und den Typ hinzu, und das war's. Derzeit benötigen wir diese Füllungen. Wenn wir in Zukunft weitere Füllungen benötigen, werden wir sie in den kommenden Lektionen hinzufügen. Außerdem werden wir später in diesem Abschnitt Kommentare hinzufügen. Machen Sie sich darüber also keine Sorgen. Lassen Sie mich Ihnen jetzt eine Sache im Schemaobjekt zeigen. Denken Sie daran, dass wir in unserem Projekt zuvor at fill erstellt hatten . Aber im Mongo-Schema können wir das automatisch hinzufügen Einfach nach diesem Schemaobjekt hatten wir ein zweites Argument in der Schemamethode Objekt, und hier fügen wir die Timestamp-Eigenschaft hinzu und setzen sie auf draw Mit dieser Eigenschaft erhalten wir zwei Eigenschaften, die sich auf die Zeit beziehen erstellt und aktualisiert. Dies ist die aktuelle Uhrzeit , zu der das Dokument erstellt wurde, und in aktualisiertem ED erhalten wir Datum und Uhrzeit der letzten Aktualisierung Keine Sorge, das werden wir sehen, wenn wir einen neuen Beitrag erstellen , und das werden wir in der nächsten Lektion tun. 174. Neuen Beitrag erstellen: Lassen Sie uns eine API zum Erstellen eines neuen Beitrags erstellen. Im Routenordner erstellen wir eine neue Datei namens post dot js. Hier benötigen wir Router, Cost Express entspricht Require Express. Und danach entspricht der Cost-Router dem Express-Punkt-Router. Am Ende modulieren wir einfach, Punktexporte dem Router entsprechen. Lassen Sie uns diesen Router nun in unserer Hauptdatei einrichten. In der js-Datei mit dem Indexpunkt fügen wir also den Wert cost post route is equal to require hinzu. Hier gehen wir zum Routenordner und zu diesem Beitrag. Jetzt unten App-Punkt G, Präfix zum Slash-API-Slash-Post, und beim zweiten Argument fügen Sie Post-Routen Speichern Sie diese Datei, und jetzt können wir Post-Routen hinzufügen. Also fügen wir in der Post-Datei Router hinzu, welche Methode wir verwenden werden, richtig. Wir werden Router Dot Post verwenden. Hier fügen wir Forward Less hinzu, um einen neuen Beitrag zu erstellen. Außerdem benötigen wir hier Orthomidalware, weil wir wollen, dass nur angemeldete Benutzer einen neuen Beitrag erstellen sollen Und danach fügen wir AC-Callback-Funktion mit Anfrage Was wir nun in dieser API tun wollen , ist, einfach ein neues Post-Dokument zu erstellen und diese Bilder und Videos auf unserem lokalen Server zu speichern Dafür müssen wir Multer genauso einrichten, wie wir es zuvor getan haben Öffnen Sie also das Terminal und schreiben Sie und installieren Multer auf dem roten LTSo mit 1,4 bis 0,5 Dash Acht, treten Sie ein. Gut, minimiere dieses Terminal und lass uns Multer implementieren Im vorherigen Projekt haben wir also die Multer-Konfiguration in derselben Routendatei hinzugefügt, aber das sieht etwas In diesem Projekt können wir Multer also an einer anderen Stelle konfigurieren und es dann in diese Datei importieren Okay? Also erstellen wir im Config-Ordner eine neue Datei namens MultiUpload dot js Wir wissen, dass die Implementierung von Multer wirklich einfach ist. Wir müssen nur den Dateinamen festlegen und können den Dateifilter einstellen , um das Hochladen unnötiger Dateien zu verhindern Die Kosten nach dem Upload entsprechen Multer und darin müssen wir das Konfigurationsobjekt übergeben Zuerst übergeben wir den Speicher , der sich um den Dateipfad und den Dateinamen kümmert Oben erstellen wir also einen separaten variablen Const-Speicher , separaten variablen Const-Speicher Mltert-Festplattenspeicher entspricht Und dabei übergeben wir auch Objekte mit Eigenschaften. Außerdem müssen wir Multer oben eingeben. Const Multer entspricht also der Anforderung von Multer. Gut. Jetzt fügen wir in diesem Objekt die erste Eigenschaft, das Ziel, hinzu. Und hier erhalten wir eine Anfrage, eine Datei und CB hat Parameter Fehlerfunktion, und darin rufen wir einfach die CB-Funktion auf. Und an der ersten Position müssen wir den Fehler übergeben, der Null ist. Und beim zweiten Argument übergeben wir den Pfad, das Ziel unserer Post-Dateien. Sagen wir, lädt einen Beitrag hoch. Als nächstes haben wir wieder den Dateinamen, die Pfeilfunktion mit Anfrage, Datei und CB. Darin definieren wir einen spezifischen und eindeutigen Dateinamen, genau wie zuvor Sie können auch Code aus diesem Projekt sehen. Es ist völlig in Ordnung. Der Const-Zeitstempel entspricht jetzt also dem Datumspunkt. Dadurch erhalten wir die aktuelle Uhrzeit. Danach entfernen wir einige Zeichen und Leerzeichen aus dem Dateinamen. Der ursprüngliche Name der Kosten entspricht also dem ursprünglichen Namen der Datei. Dadurch erhalten wir den ursprünglichen Namen der hochgeladenen Datei. Jetzt kann es im Dateinamen ein Leerzeichen geben, also ist es besser, dieses Leerzeichen durch den Bindestrich zu ersetzen. Dadurch wird der Dateiname URL-freundlich. Wir fügen die Methode zum Ersetzen von Punkten hinzu. Hier fügen wir zuerst den regulären Ausdruck hinzu, eine Syntax für reguläre Ausdrücke, die aus einem doppelten Schrägstrich zwischen diesen besteht Wir schreiben den umgekehrten Schrägstrich a für Leerzeichen und plus für einen oder mehrere Am Ende des regulären Ausdrucks steht ein G für globales Flag, das sicherstellt, dass alle Treffer in der Zeichenfolge ersetzt werden, nicht nur die erste Nun, hier übergeben wir Bindestriche in einzelnen Codes. Das bedeutet, dass das gesamte Leerzeichen durch einen Bindestrich ersetzt wird. Was ist nun, wenn wir im Dateinamen auch die Sonderzeichen bekommen? Wir müssen sie auch entfernen. Wir fügen eine weitere Ersetzungsmethode hinzu. Zuerst, was werden wir bestehen? Schreiben Sie reguläre Ausdrücke doppelt für unseren Schrägstrich dazwischen, wir schreiben reguläre Ausdrücke um die räumlichen Zeichen zu erhalten Hier addieren wir A zu Z. Außerdem fügen wir A bis Z Null bis neun Bindestriche Jetzt wollen wir andere Charaktere bekommen , die nicht Teil dieser Charaktere sind. Es werden unsere Sondercharaktere sein. Um das umzukehren, setzen wir es in die eckigen Klammern, und nach der ersten eckigen Klammer fügen wir Garret für Umkehrung hinzu, und am Ende fügen wir auch G für Jetzt wollen wir diese Sonderzeichen durch nichts ersetzen diese Sonderzeichen durch nichts Wir wollen sie nur entfernen. Wir halten uns also nur an Codes ohne irgendetwas. Am Ende werden wir diesen Zeitstempel und den ursprünglichen Dateinamen mischen . CB: Zuerst übergeben wir Null für einen Fehler und zweitens schreiben wir Steuern. Hier fügen wir Cali-Klammern, Zeitstempel, Dollar-Klammern ursprünglichen Namen hinzu und fertig Wir definieren das Ziel und auch den Dateinamen für unsere hochgeladene Jetzt können wir diese Speichervariable einfach hier in der Multifunktion übergeben . Nach dem Speichern übergeben wir nun den Dateifilter , in dem wir Dateien nach ihren Erweiterungen filtern. Kostendateifilter entspricht also einer Fehlerfunktion mit den drei Parametern Anfrage, Datei und CB. Hier werden wir überprüfen, ob es gültig ist oder nicht. Const erlaubten Typen entsprechen also dem Array, und hier fügen wir Dateitypen hinzu In unserer Social-Media-Anwendung können Benutzer jetzt auch Bilder und Videos hochladen Wir fügen hier den Bild-Slash JPEG, ein weiteres Bild, PNG, hinzu. Als nächstes Bild-GIF und für Video fügen wir Videos MP 4 Und auch Video-Slash MOV. Sie können auch andere Typen hinzufügen, wenn Sie möchten. Jetzt können wir hier einfach die Bedingung angeben dass die Datei Mme-Typ von diesen Typen ist, nur dann werden wir sie zulassen, andernfalls werden wir sie ablehnen. Falls die zulässigen Typen Punkt den Dateipunkt Mme-Typ einschließt , ist das wahr. Dann rufen wir diese CB-Funktion auf und übergeben zuerst Null für Fehler und dann Passthrough , um die Datei zu akzeptieren. Nun, wenn der MM-Typ etwas anderes ist, dann diese Typen, dann halten wir uns an Bedingung und nennen hier CB-Funktion. Bei dem Fehler geben wir einen neuen Fehler weiter, und hier geben wir die Fehlermeldung, ungültiger Dateityp, nur JPEG, PNG, GIF, MP Four und MOV dürfen diese Datei ablehnen, wir halten an Pause fest. Jetzt können wir diesen Dateifilter einfach im Multi-Konfigurationsobjekt übergeben. Außerdem können wir im Multer die Dateigröße mithilfe der Eigenschaft Limits angeben Für soziale Medien können wir das Limit auf 15 MB festlegen. Wenn der Benutzer einige Videos hochladen möchte, kann er das auch tun. Objektdateigröße von 15 bis 1024 bis 1024. Dadurch erhalten wir den Byte-Wert. Dies ist das Limit für jede Datei. Wenn wir es für das Hochladen mehrerer Beiträge verwenden, hat jede Datei ein maximales Limit von 15 MB, nicht für ein kombiniertes Limit, und fertig Hier ist unsere Methode zum Hochladen von Beiträgen bereit, sodass wir sie von hier aus exportieren können Das Modul Dot Exports entspricht dem Post-Upload. Speichern Sie diese Datei, und in unserer Routen-Datei, hier nach dieser North-Middleware, fügen wir Post, Upload, See Auto Input Works Punkt hinzu, weil wir mehrere Bilder in den Upload, See Auto Input Works Beitrag hochladen möchten Beitrag hochladen möchten der ersten Position schreiben wir nun den Namen der Eingabefüllung Lassen Sie uns hier die Medien weitergeben. Vom Frontend aus müssen wir die Eingabedatei mit dem vollständigen Namen eines Mediums wie diesem übernehmen . Danach übergeben wir die maximale Anzahl von Dateien, sagen wir zehn, und das war's. Jetzt können wir API-Logik schreiben. Zuallererst überprüfen wir hier, vom Benutzer hochgeladene Datei hochgeladen wurde oder nicht, denn wenn keine Medien vorhanden sind, möchten wir den Beitrag nicht in unserer Datenbank speichern. Ich fordere an oder Dateien sind nicht verfügbar, oder fordere Punktdateien an. Die Punktlänge ist gleich Null. Wenn eine dieser Bedingungen zutrifft, geben wir Fehler, Antwort, Punktstatus, 400 für eine bessere Anfrage zurück . Und in der JSON-Datei fügen wir ein Objekt mit unordentlicher Eigenschaft hinzu. Es ist mindestens eine Mediendatei erforderlich. Wenn Medien verfügbar sind, speichern wir diesen Beitrag in unserer Beitragssammlung. Kosten, neuer Beitrag ist gleich neuer Beitrag. Tolle automatische Eingabe funktioniert, und hier müssen wir Füllungen übergeben. Der erste ist der Benutzer, der die Punkt-Benutzerpunkt-Underscore-ID anfordert. Als Nächstes haben wir eine Überschrift, die wir aus dem Hauptteil der Anfrage erhalten Darüber hinaus strukturieren wir den Hauptteil der Anfrage, und hier erhalten wir die Überschrift Außerdem kann der Benutzer Text und Ort hinzufügen. Jetzt fügen wir in unserem Beitrag eine Überschrift zur Bildunterschrift hinzu, oder wir können diesen Text auch zum Text und die Position zum Ort entfernen . Wir benötigen nur ein Feld, das Media ist, und das ist ein Array von Objekten, und dieses Objekt hat zwei Eigenschaften: Name , der der Name der Datei ist, und Medientyp , also Bild oder Video. Auf diese Weise können wir, wenn wir das Medium im Frontend anzeigen, leicht entscheiden , welches Tag wir verwenden sollen. Also hier müssen wir dieses Array von Objekten erstellen. Es ist wirklich einfach: Cast-Medien entsprechen der Anforderung von Punktdateien mit Punktzuordnungen. Hier erhalten wir die einzelne Datei in der Parameter-Fehlerfunktion , und hier wollen wir einfach ein Objekt wiederherstellen. Hier in den Gully-Klammern stehen Objekt, Name zu Datei, Punktdateiname, und für den Medientyp müssen wir hier die Bedingung übergeben Mime-Typ Datei mit Punkt, Punkt beginnt mit Doppelcodes, Bild Wenn es wahr ist, setzen wir den Typ auf Bild, Spalte, andernfalls setzen wir es auf Video. Mit dieser Methode erhalten wir hier in unserem neuen Beitrag ein Medienarray mit Objekten Wir setzen Medien auf Medien. Danach können wir einfach auf den neuen Beitragspunkt C warten. Dann setzen wir den Antwortpunktstatus auf 01 zurück , um neue Daten zu erstellen. Punkt-JSON-Objekt mit Nachrichteneigenschaft, Beitrag wurde erfolgreich hochgeladen. Wenn wir einen Beitrag an einen neuen Beitrag zurückgeben, und das war's. Lassen Sie uns diese Implementierung testen. Speichern Sie diese Datei und öffnen Sie Postman. Hier erstellen wir einen neuen Ordner namens post und fügen darin eine neue Anfrage hinzu, laden einen neuen Beitrag hoch, ändern die SDDP-Methode auf Post und die URL auf SDDP Spalte doppelt für Schrägstrich Lokaler Host, Spalte 3.000 Schrägstrich API Schrägstrich Post Sehen Sie, hier erhalten wir das erforderliche Token, gehen zur Login-API und generieren einfach ein neues Kopieren Sie das in unsere neue API, wir gehen zum Header und fügen hier einen neuen Header hinzu, die Autorisierung für den Bierbereich, und hier fügen wir unser Token ein. Senden Sie jetzt die Anfrage. Siehst du, hier bekommen wir mindestens eine Mediendatei benötigt. Lassen Sie uns nun auch eine Mediendatei mit dieser Anfrage hinzufügen. Denken Sie daran, aus welchem Bereich wir Dateien senden können Wir können Dateien aus dem Hauptteil und den Formulardaten senden. Hier im Schlüssel übergeben wir Medien, weil wir in unserer API Medien hier in der Multer-Methode definieren Jetzt wählen wir hier Datei aus. Fügen Sie eine neue Datei vom lokalen Computer hinzu. Lassen Sie uns von hier aus zwei oder drei beliebige Bilder senden und die Anfrage senden. Siehst du, hier bekommen wir die Fehlermeldung, keine solche Datei oder kein solches Verzeichnis AploadsPost Im Grunde sagen sie uns, dass wir einen Ordnerpfad erstellen müssen Auf unserem Server erstellen wir einen neuen Ordner namens Uploads. Achten Sie darauf, dass Sie nur Kleinbuchstaben verwenden , da Groß- und Kleinschreibung beachtet wird Jetzt erstellen wir in diesem Upload-Ordner einen weiteren Ordner namens Post Gut. Senden Sie jetzt die Anfrage. C, Beitrag wurde erfolgreich hochgeladen. Hier erhalten wir ein neues Post-Objekt mit Benutzer, Media sieht auch gut aus mit Namen und Medientyp, Likes und Tags für ein leeres Array und wir bekommen auch Zeitstempel, die am erstellt und hochgeladen Beides bekommen wir , weil wir in unserem Schema Zeitstempel auf true So erstellen wir einen neuen Beitrag. In der nächsten Lektion werden wir Beiträge aus der Beitragssammlung erhalten. 175. Aktuelle Benutzerbeiträge abrufen: Jetzt ist es Zeit für ein wenig Bewegung. Hier müssen Sie eine neue API erstellen, um alle Beiträge des aktuell angemeldeten Benutzers abzurufen. Außerdem müssen Sie die Paginierungsfunktion implementieren, genau wie wir es im vorherigen Projekt, der Produkt-API, getan haben Stellen Sie sicher, dass Sie die Buchstaben zuerst und dann die älteren Buchstaben anzeigen zuerst und dann die älteren Ich weiß, dass du das kannst, probiere es aus und was ist danach die Lösung. Lassen Sie uns jetzt schnell die Lösung sehen. Also hier in unserer Post-Route fügen wir einen weiteren Router-Punkt hinzu gdndPoEndpoint, sagen wir, meinen Beitrag mit einem Schrägstrich Hier fügen wir auch Osmidalware und eine ASN-Callback-Funktion mit Anfrage und Antwort Osmidalware und eine ASN-Callback-Funktion mit Anfrage und Antwort hinzu. Hier müssen wir nach quadratischen Parametern suchen, die uns Seite und Limit geben Das zweite Objekt entspricht der Punktabfrage der Anfrage. Und hier bekommen wir Page und Limit. Außerdem können wir den Standardwert für diese Seite und das Limit festlegen. Also Seite auf eins und beschränken wir uns auf sagen wir zehn. Wenn wir im Abfrageparameter etwas anderes übergeben, ersetzt es diese Werte. Wie wir wissen, sind diese Werte auch Zeichenketten, wenn wir Werte aus dem Abfrageparameter abrufen , sodass wir sie in Ganzzahlen umwandeln müssen. Also hier am Ort der Kosten schreiben wir let, und danach ist page gleich parse integer, page, und danach ist limit gleich parse integer, Jetzt können wir eine Anfrage für einen Beitrag hinzufügen. Also const, post ist gleich await , post dot find. Hier übergeben wir Object user to request dot user dot underscore-ID Und hier fügen wir die Skip-Methode hinzu. Diese Seite minus eins in das Limit, und wir haben auch die Limit-Methode, und wir übergeben hier dieses Limit, und wir machen auch diese Zeile. Und am Ende geben wir einfach den Antwortpunkt Json zurück und übergeben diesen Beitrag hier. Lassen Sie uns nun diese Implementierung probieren. Speichern Sie diese Datei und öffnen Sie Postman. Hier duplizieren wir diese Anfrage und ändern ihren Namen in Beitrag zum angemeldeten Benutzer Ändern Sie auch die Methode , um eine URL zur API nach dem Schrägstrich MI Post abzurufen und die Anfrage zu senden Siehst du, hier bekommen wir den Beitrag. Derzeit haben wir nur einen Beitrag, und deshalb bekommen wir hier einen einzelnen Beitrag, damit es funktioniert. Um diese Abfrage zu verbessern, können wir auch eine Sache tun. Übergeben Sie eine Variable, die unserem Frontend mitteilt , ob die nächste Seite verfügbar ist oder nicht. Es ist wirklich einfach. Also hier, nachdem wir unseren Beitrag erhalten haben, erstellen wir eine neue Variable namens next page is equal to here we pass condition, wenn diese Punktlänge aktuellen Limit entspricht, dann ist es möglich, dass es eine nächste Seite für den Beitrag gibt, also geben wir hier true weiter, also geben wir hier true wenn die aktuelle Beitragsgröße kleiner als das Limit ist, dann übergeben wir in anderen Fällen false Das ist wirklich einfache Logik. Jetzt müssen wir in der Antwort Json Objekt von Post zu Post übergeben. Seite zu Seite, einschränken, einschränken und als nächste Seite hat nächste Seite Speichern Sie die Änderungen und werfen Sie einen Blick darauf. Senden Sie die Anfrage erneut. Siehst du, hier bekommen wir Beiträge, und wenn wir nach unten scrollen, bekommen wir eine nächste Seite, die fällt, weil das aktuelle Seitenlimit nicht voll ist. In der nächsten Lektion werden wir sehen, wie Beiträge für unsere Social-Media-Homepage erhalten. 176. Zuhause mit Futter erhalten: Lassen Sie uns eine API zum Abrufen von Beiträgen erstellen, die wir auf dem Startbildschirm anzeigen können , wenn der Benutzer unsere Anwendung öffnet. Hier fügen wir einen weiteren Router-Punkt GAD hinzu und zeigen auf den nachfolgenden Schrägstrich, da der Benutzer auf der Startseite den Beitrag sehen wird, dem er oder ihr gefolgt Hier benötigen wir auch Osmidleware, weil wir aktuelle Benutzer brauchen, die einer Liste folgen und auch eine leistungsstarke Rückruffunktion mit Anfrage und Rückruffunktion Zuallererst müssen wir in dieser API die folgende Liste der aktuellen Benutzer finden Der Sekunden-Benutzer entspricht dem Wert Await User, Punkt bei der ID, und hier übergeben wir den Punkt der Anfrage mit dem Benutzerpunkt und Unterstrich-ID Hier wollen wir nur die folgende Füllung, also die Punktauswahl, und wir übergeben hier die folgenden Codes Hier bekommen wir drei Zeilen, was bedeutet, dass die automatische Eingabe nicht funktioniert hat. Lassen Sie mich dieses Benutzermodell oben eingeben. Die Kosten für den Benutzer entsprechen dem Wert „Erforderlich“. Hier haben wir einen Ordner nach Modellen und gehen zu Benutzern. Gut. Jetzt können wir für die Post-Abfrage eine separate Variable definieren. Lass die Abfrage dem Objekt entsprechen. Darin übergeben wir user und fügen hier wieder geschweifte Klammern hinzu Jetzt können wir den Mongo-Deb-Operator namens $1 in verwenden, der verwendet wird , um den Elementwert aus dem Array zu überprüfen Hier übergeben wir den folgenden Benutzerpunkt, was Array ist. Im Grunde bedeutet das also, dass Benutzer , die im Benutzer-Punkt-Folge-Array verfügbar sind, posten . Davon können wir nun einfach post bekommen, also Const, post ist gleich await, post, dot find, und hier fügen wir unsere Abfrage Außerdem müssen wir damit den Benutzer auffüllen, der diese Beiträge hochgeladen hat Also Punkt ausfüllen und hier übergeben wir user filled mit dem zweiten Parameter, wir übergeben die Felder, die wir wollen Also Score-ID, Benutzername und Profilname. Wenn wir ein Profilbild haben, können wir das auch hier eintragen. Als Nächstes werden wir Short hinzufügen. Hier übergeben wir ein Objekt mit der Eigenschaft „ Erstellt am Objekt“, und wir haben sie in absteigender Reihenfolge aufgenommen, also übergeben wir minus eins Bei diesen bekommen wir zuerst einen neuen Beitrag. Derzeit haben wir die Paginierungsfunktion in dieser Abfrage nicht implementiert , aber in der realen Welt benötigen wir die Paginierungsfunktion, da es in der realen Welt Hunderte oder Tausende von Beiträgen geben kann Derzeit können wir nicht alle Beiträge in einer einzigen Anfrage senden. Dadurch wird unser Server langsam. Hier brauchen wir also eine unendliche Abfragefunktion oben, das Hinzufügen eines Let-Objekts entspricht der Anfrage mit einer Punktabfrage, und hier destrukturieren wir die Seite gleich eins und das Limit ist gleich zehn Das sind Standardwerte. Außerdem müssen wir sie in Integer umwandeln. Page entspricht Parse Integer zu Page und Limit entspricht Parse Integer, Jetzt fügen wir in unserer Abfrage die Skip-Methode hinzu und übergeben hier Seite minus Knochen Und wir fügen auch die Limit-Methode hinzu, und wir übergeben hier das Limit, und am Ende fügen wir die Len-Methode hinzu. Nun, alles ist großartig, aber hier gibt es ein kleines Problem mit dieser API. Lassen Sie mich Ihnen das anhand des Beispiels erklären. Nehmen wir an, wir haben 20 Beiträge und unser Benutzer sendet API-Anfrage für Beitrag. Unsere API sendet diese ersten zehn Beiträge. Wenn sich der Benutzer diesen Beitrag jetzt ansieht, kann es sein, dass jeder nachfolgende Benutzer einen neuen Beitrag zur Datenbank hinzufügen kann. Angenommen, fünf nachfolgende Benutzer laden fünf neue Beiträge hoch. Jetzt, wenn der aktuelle Benutzer mehr Beitragsanfragen mit dem Abfrageparameter Seite zwei sehen möchte . Zu diesem Zeitpunkt überspringt unsere Abfrage aufgrund der zweiten Seite die ersten zehn Daten aus der Datenbank und zeigt diesen Beitrag an. Hier können wir Duplikate des Beitrags sehen , da diese fünf Beiträge kürzlich hinzugefügt wurden, und das ist das Problem Nun, was ist hier die Lösung? Wir können hier die cursorbasierte Paginierung verwenden. Lassen Sie mich es Ihnen in einfachen Worten erklären. Cursorbasierte Paginierung bedeutet, dass wir Beiträge basierend auf der Uhrzeit abrufen Hier ist zum Beispiel der Benutzer h, er ist auf der Startseite und sendet Anfragen für die ersten zehn Beiträge Jetzt senden wir vom Backend aus zehn Beiträge und auch den letzten Beitrag, der zu diesem Zeitpunkt erstellt wurde. Wenn Harley nun weitere zehn Beiträge haben möchte, sendet er den zuletzt erstellten Beitrag , den wir als Cursor bezeichnet haben Jetzt fragst du dich vielleicht, warum wir diesen Cursor brauchen. Wir werden diesen Cursor in unserer Abfrage verwenden. Suchen Sie weitere zehn Beiträge , deren Erstellungszeit kürzer ist als diese Cursorzeit. Auf diese Weise erhalten wir keine doppelten Beiträge und auch unsere Seitennummerierung funktioniert reibungslos Diese Technik wird als cursorbasierte Paginierung bezeichnet. Diese Technik wird sehr häufig verwendet, wenn die gewünschten Daten sehr schnell hinzugefügt werden, z. B. in sozialen Medien Lassen Sie uns dies nun in unserer Abfrage implementieren. Zunächst geben wir den Cursor in der Antwort zurück , damit Sie ihn richtig verstehen. Hier nach unserer Anfrage fügen wir die Kosten hinzu, denen der nächste Cursor entspricht. Hier übergeben wir die Bedingung, Länge des Beitragspunkts größer als Null ist. Wenn es wahr ist, geben wir den letzten Beitrag zurück, der bei Tate erstellt wurde. Also Post, eckige Klammer, Länge des Beitragspunkts minus eins. Auf diese Weise erhalten wir den letzten Beitrag, den Punkt, der am erstellt wurde, und wir geben Null zurück. Am Ende fügen wir den Antwortpunkt Json hinzu. Hier fügen wir Objekt, Beitrag zu Beitrag und nächsten Cursor zum nächsten Cursor hinzu. Gut. Fügen wir nun diesen Cursor unserer Abfrage hinzu, denn Grund senden wir diesen Cursor. Wenn wir also diesen nächsten Cursor an das Frontend senden, sendet unser Frontend diesen nächsten Cursor in der nächsten Post-Anfrage. Im Body- oder Query-Parameter erhalten wir also den Cursor , der das Frontend sendet. Und jetzt fügen wir einfach diesen Cursor in unsere Abfrage ein. Hier entspricht die unter erstellte Abfrage den Coli-Klammern. Hier übergeben wir den Operator Dollar LT , der kleiner als ist, und geben hier ein neues Datum ein. Und hier übergeben wir den Cursor. Jetzt müssen wir uns hier um die Brandsituation kümmern. Bei der ersten Anfrage wird kein Cursor angezeigt. Also übergeben wir hier die Bedingung, ob der Cursor verfügbar ist, erst dann fügen wir den in der Abfrage erstellten Wert hinzu. Ohne Cursor wird unsere Abfrage also so aussehen. Und mit dem Cursor wird unsere Abfrage so aussehen, so einfach ist das. Außerdem können wir hier die Eigenschaft „Nächste Seite“ übergeben. Kopieren Sie also diese Zeile aus der vorherigen API und fügen Sie sie in unsere API ein. Und am Ende des Antwortobjekts fügen wir hasNext page zu hass next Kommen wir nun zu dieser Implementierung. Öffnen Sie Postman, duplizieren Sie diese letzte Abfrage. Ändern Sie den Namen in Getting Following, Post. Außerdem ändern wir die URL API-Post-Slash-Following und senden die Anfrage Siehst du, hier bekommen wir keinen Beitrag , weil unser aktueller Benutzer den Beitrag hochgeladen hat, nicht einer seiner Follower Hier müssen wir also ein weiteres Benutzertoken hinzufügen. Gehen Sie zur Login-API und melden Sie sich mit einem anderen Benutzerkonto an. Wie lauten der Benutzername und das Passwort eines anderen Benutzers? Lass mich daran erinnern, ja, es ist h001 und das Passwort ist auf 128 gesetzt Ja, hol dir dieses Token, kopiere und in unserer aktuellen API im Header ersetzen wir dieses Token und senden die Anfrage Trotzdem bekommen wir keine Post. Lass mich nachschauen, wer wem folgt. Oh, hier folgt niemand jemandem. Um diesen Dic zu erstellen, kopiere ich diese aktuelle Benutzer-ID, mit wir uns angemeldet haben , und bearbeite die ID in den Followern des vorherigen Benutzers Und kopiere auch diese Benutzer-ID und füge sie in die folgende Liste des aktuellen Benutzers ein und aktualisiere sie Lassen Sie uns diese Anfrage nun erneut senden. Sehen Sie hier, wir bekommen einen Beitrag und auch den nächsten Cursor, der das Erstellungsdatum des letzten Beitrags ist und die nächste Seite hat, das bedeutet, dass er ordnungsgemäß funktioniert. 177. Löschen des Beitrags: Lassen Sie uns eine API zum Löschen des Beitrags erstellen, also Router, Punkt Löschen, und hier fügen wir Schrägstrich, Spalte, Post-ID hinzu, was der Abfrageparameter ist Außerdem benötigen wir Middleware da nur autorisierte Benutzer ihren Beitrag löschen können Und zuletzt fügen wir ASN-Callback-Funktion mit Gut. Zuallererst erhalten wir in dieser Funktion die Konstante Post-ID entspricht Request Dot PRMs, Punkt Post Außerdem erhalten wir, dass die Benutzer-ID der Anforderungspunkt-Unterstrich-ID entspricht Benutzer-ID der Anforderungspunkt-Unterstrich-ID entspricht Hier in dieser gelöschten API haben wir gewarnt, dass nur Benutzer, die einen Beitrag erstellt haben, den Beitrag löschen können Dafür müssen wir also den Benutzer dieses Beitrags finden. Cost Post entspricht Await Post Dot Fine By ID. Und hier übergeben wir die Post-ID. Wir übergeben die Bedingung, dass ich poste, ist nicht verfügbar, dann geben wir die Antwort mit dem Statuscode 404 und in Jason, Objekt, Nachrichteneigenschaft zwei, Beitrag nicht gefunden zurück. Was ist nun, wenn wir einen Beitrag gefunden haben? Dann müssen wir überprüfen, ob der aktuelle Login-Benutzer der Autor dieses Beitrags ist oder nicht? Wenn also der Postpunkt-Benutzer, die Objekt-ID für den String , nicht der Benutzer-ID entspricht, dann geben wir erneut die Antwort mit dem Statuscode 403 für einen unautorisierten Fehler im Jason zurück . Wir fügen ein Objekt mit der Nachrichteneigenschaft Unauthorized hinzu, Wir fügen ein Objekt mit um diesen Beitrag zu löschen Was ist nun, wenn Benutzer und Autor ebenfalls identisch sind? In diesem Fall müssen wir zuerst die Bilder oder Videos dieses Beitrags entfernen die Bilder oder Videos dieses Beitrags und dann können wir das Beitragsdokument löschen, oder? Hier müssen wir also für jede Schleife laufen, weil unser Medium ein Array ist, also ein sogenannter Punkt-Medienpunkt für jede Schleife. Hier erhalten wir ein einzelnes Dateiobjekt, Pfeilfunktion, und hier führen wir unsere Logik für jede Datei aus. Zuallererst benötigen wir den Dateipfad des Bildes oder Videos, denn nur damit können wir die Datei entfernen. Es ist wirklich einfach. Für Path benötigen wir das Pfadmodul. Const path entspricht also require path, dem eingebauten Modul von Im unteren Bereich entspricht der Pfad der Kostendatei dem Pfad zur Punktverknüpfung Zuerst fügen wir den Unterstrich, den Unterstrich Dname und ein Komma hinzu. Wir fügen den Dateipunktnamen hinzu , der eine Namenseigenschaft in Medien ist Ich bin mir bei diesem Pfad nicht sicher. Schauen wir uns also das Punktprotokoll dieses Dateipfads an. Und unten geben wir einfach die Antwort Punkt json, Objekt mit gemessener Eigenschaft, Post, erfolgreich gelöscht zurück , nur um diesen Pfad zu überprüfen. Speichern Sie diese Datei und öffnen Sie Postman. Hier duplizieren wir diesen Beitrag zum Anmelden von Benutzern, da wir in dieser API das Token des Benutzers haben , der diesen Beitrag erstellt hat Hier ändern wir den API-Namen in Löschen, den Beitrag, ändern die Methode, löschen, und im API-Endpunkt ändern wir das in API-Beitrags-ID. Lassen Sie uns auch die Post-ID aus der vorherigen API kopieren , die Anfrage senden, und hier unten erhalten wir die ID, kopieren sie und fügen sie in unseren API-Endpunkt ein. Und sende die Anfrage. Siehst du, hier bekommen wir den Beitrag erfolgreich gelöscht. Und wenn wir unser Terminal überprüfen, sehen Sie, hier bekommen wir den Dateipfad. Ignoriere den ersten Pfad , weil er ein Unterstrich ist, Schatz Nur um das zu sehen: Wir erhalten einen Schrägstrich für den Namen der Routes mit Schrägstrich , der unser aktueller Ordnerpfad ist, aber wir wollen keine Routen , der unser aktueller Ordnerpfad ist, aber wir wollen keine Also fügen wir hier zwischen Datumsname und Dateiname die Doppelcodes, Punkt, Punkt hinzu Speichern Sie diese Datei und lassen Sie uns die Anfrage senden. Im VS-Code-Terminal C wird die Route entfernt. Jetzt müssen wir nur noch einen Slash-Upload-Beitrag hinzufügen , da dies ein Pfad zu unserem Beitrag ist Vor diesem Dateinamen fügen wir einen Schrägstrich hinzu, fügen den Upload-Beitrag hinzu, speichern die Änderungen und senden Wenn wir unser Terminal überprüfen, sehen wir hier, dass wir unseren Dateipfad erhalten So können Sie den Code mit der Konsole probieren. Ich mache das immer, wenn ich verwirrt bin. Ich kommentiere einfach die Datenbanklogik aus und probiere dann die API. Auf diese Weise müssen wir keine Daten erstellen und aus der Datenbank entfernen. Also bekommen wir hier den Dateipfad. Jetzt müssen wir nur noch diese Datei mit dem Dateimodul entfernen. Das haben wir bereits in unserem vorherigen Projekt gemacht. Also hier, entferne die Konsole und füge hier einen Blog hinzu, versuche und fange den Blog an. Und im Cache fügen wir einen Console Dot Error hinzu, in Batis übergeben wir den Fehler beim Löschen der Datei, Dollar-Coli-Klammern, den Dateipfad und protokollieren auch dieses Fehlerobjekt Jetzt warten wir im Drilog einfach auf fs dot unlink und hier übergeben wir await verwenden zu können, müssen wir diese Callback-Funktion asynchron machen und außerdem müssen wir Fs aus dem eingebauten Modul importieren Const Fs entspricht also require Fs promises, weil das Löschen der Datei Und nachdem wir die Datei vom Server entfernt haben, können wir das Post-Dokument entfernen Warten Sie also auf den Punkt Löschen Sie einen, weil wir den Beitrag bereits oben abrufen. Und fertig. Speichern Sie die Gene und senden Sie die Löschanfrage erneut. Sehen Sie hier, wir können es erfolgreich posten, löschen. Und wenn wir unsere Bend-Dateien im Post-Ordner überprüfen, werden auch Bilder gelöscht. 178. Wie und anders als der Beitrag: Lassen Sie uns eine API für und im Gegensatz zum Beitrag erstellen. Es ist wirklich einfach. Wenn im Array die Benutzer-ID nicht verfügbar ist, fügen wir die Benutzer-ID hinzu, was bedeutet, dass wir den Beitrag mögen, und wenn die Benutzer-ID bereits im L-Array ist, müssen wir im Gegensatz zum Beitrag nur die Benutzer-ID aus diesem Array entfernen. Lassen Sie uns die Router-Punktseite hinzufügen. Hier fügen wir einen Endpunkt zur Schrägstrichspalte, Beitrags-ID, Schrägstrich L hinzu. Dies ist dieselbe API, die wir für den Beitrag verwenden werden, und im Gegensatz zum Comma ORT ist eine Callback-Funktion mit Anfrage und Antwort. Jetzt erhalten wir zuerst, dass die Post-ID der Anfrage mit dem Punkt PRMs und der Punkt-Post-ID entspricht , und außerdem erhalten wir, dass die Kostenbenutzer-ID der Punkt-Unterstrich-ID der Anfrage entspricht Punkt-Unterstrich-ID der Anfrage entspricht Jetzt finden wir zuerst den Beitrag, also ist Const, post gleich Await Post Dot Fine By ID und Pass-Beitrags-ID und Pass-Beitrags-ID Danach überprüfen wir den Zustand. Wenn Post nicht verfügbar ist, geben wir eine Antwort mit dem Statuscode 404 zurück, und im Jason übergeben wir das Objekt mit der Eigenschaft message an post not found. Wenn der Beitrag nun verfügbar ist, überprüfen wir, ob dem Benutzer der Beitrag bereits gefällt oder nicht. Const hat also „Gefällt mir schon“ entspricht „Gefällt mir“ -Angaben für Beiträge, Punkt beinhaltet, und hier übergeben wir die Benutzer-ID Auf dieser Grundlage können wir nun Zustand, Kosten, aktualisiert, Beitrag entspricht acht, Post ist gleich Acht, Post Punkt fein nach ID und Update übergeben Post ist gleich Acht, Post Punkt fein nach ID und Update Zuerst übergeben wir die Post-ID, und können Sie mir sagen, was wir im zweiten Argument übergeben werden? Richtig, wir geben die Updates weiter. Also hier bestehen wir die Bedingung. Mir hat schon gefallen ist wahr, dann müssen wir das Like entfernen. Dafür verwenden wir im Objekt den Operator Mongo Di Be , also Dollar Pull to Object Und hier fügen wir der Benutzer-ID Likes hinzu. Und wenn „Gefällt mir“ falsch ist, übergeben wir hier ein und hier im Objekt fügen wir eine weitere mongoibische Methode hinzu, Dollar at, um das Objekt zu setzen, ist die Benutzer-ID Der Grund, warum wir hier zu set hinzufügen dass es nur eine Benutzer-ID hinzufügt, wenn sie nicht verfügbar ist, sie wird die Benutzer-ID in s nicht duplizieren . Jetzt beim dritten Argument übergeben wir object with new an true Dadurch erhalten wir aktualisierte Daten. Am Ende geben wir einfach den Antwortpunkt Json Object mit der Nachrichteneigenschaft zurück. Hier überprüfen wir den Zustand. Mir hat es schon gefallen ist wahr, dann gehen wir hier weiter, posten anders als sonst geben wir Post Like weiter und auch wir können Likes zu aktualisierten Post Punkt Likes Punkt Length zurückgeben . Sie können jeden Wert, den Sie von der API zurückgeben möchten, zurückgeben. Lassen Sie uns nun wöchentlich diese API testen. Ein Postbote, zuerst müssen wir einen neuen Beitrag erstellen, weil wir in der vorherigen Lektion unseren einzigen Beitrag gelöscht haben Gehen Sie zur Post-API erstellen und senden Sie die Anfrage. Hier sehen Sie, dass wir einen Post-Fehler erhalten, sodass wir erneut Bilder auswählen müssen. Und sende die Anfrage. Siehst du, hier bekommen wir einen neuen Beitrag, kopiere seine ID. Das brauchen wir. Jetzt erstellen wir in unserem Post-Ordner eine neue Anfrage namens L und im Gegensatz zum Beitrag. Ändern Sie die Methode auf Seite und den Endpunkt auf SDDP, Spalte Double für unseren lokalen Slash-Host, Spalte 3.000 Slash-API-Slash-Beitrag , und hier fügen wir Fügen Sie außerdem in der Kopfzeile den Autorisierungsschlüssel und den Wert zum Trägerbereich hinzu. Kopieren Sie das Token aus der Login-API und fügen Sie es einfach in unsere API ein und fügen Sie es einfach in unsere Siehst du, wir bekommen Post-Likes und Likes zählen bis eins. Senden Sie die Anfrage jetzt erneut. Siehst du, bei uns zählen Post-Like und Likes auf Null, also funktioniert es. 179. Implementieren der Kommentarfunktion: Heutzutage gibt es in fast allen Social-Media-Apps Funktionen zum Hinzufügen von Kommentaren zum Beitrag. Auf diese Weise können Sie Leute für diesen Beitrag gewinnen. Lassen Sie uns auch Befehlsfunktionen für unseren Beitrag implementieren. Zuallererst ist die Frage, wo wir bei der Befehlszeile sind? Wir müssen dem Schema einen Befehl hinzufügen. also in der Post-Model-Datei und hier unten Befehle hinzu, was das Objekt-Array ist. Anstatt das gesamte Schema hier zu schreiben, können wir jetzt ein separates Schema für Befehle erstellen, und dann fügen wir hier eine Referenz hinzu. Dadurch lassen wir uns nicht verwirren. Vor diesem Schema fügen wir also ein const-Kommentarschema hinzu, das dem neuen Mongoose-Punktschema entspricht, und hier im Objekt übergeben wir das Einzelkommentarschema Zuallererst brauchen wir hier Benutzer zu Objekt, Typ nach Mongos-Punktschema Punkttyp Punkt Objekt-ID, und wir verweisen auf Benutzer und auch erforderlich auf Als Nächstes benötigen wir Text zu Objekt, Typ zu Zeichenfolge, und wir machen es auch erforderlich, dass es True Danach müssen wir den Befehl erstellt haben, also zu dem Zeitpunkt dieser bestimmte Befehl erstellt wurde. Geben Sie also to date und standardmäßig date dot now ein. Wie wir jetzt wissen, können Benutzer in sozialen Medien auf Befehle anderer Benutzer antworten. Sollten wir diese Antwortfunktionen in unserem Linky Fi hinzufügen oder nicht? Lass uns das auch machen. Für Antworten fügen wir eine weitere gefüllte Antwort hinzu, die ein Array ist, und innerhalb dieses Arrays müssen wir für jede Antwort ein Schema definieren. Keine Sorge, es ist dasselbe wie dieser Befehl. Kopieren Sie einfach diese drei Eigenschaften und fügen Sie in diesem Array ein Objekt hinzu und fügen Sie es hier ein. Stellen Sie sicher, dass Sie es dem Objekt hinzufügen, da wir sonst eine Fehlermeldung erhalten. Jetzt haben wir ein Befehlsschema. Wir können es einfach unten im Schema hinzufügen, siehe, jetzt können wir das Post-Schema leicht sehen ohne verwirrt zu werden. Lassen Sie uns nun eine API erstellen den neuen Befehl zum Beitrag hinzuzufügen. Es ist wirklich einfach. Hier fügen wir also die Befehle Router-Punktpost und zeigen auf Slash-Spalte, Post-ID und Schrägstrich Hier benötigen wir auch Orthomiddalware und eine ASN-Callback-Funktion mit Anfrage und Zuallererst erhalten wir die Cost Post ID, die der Punkt-Post-ID der Anfrage entspricht Außerdem erhalten wir, dass die Cost UserID der Punkt-Unterstrich-ID des Anforderungspunkts entspricht Anforderungspunkts Dann erhalten wir auch Const-Text Punkttext der Anfrage entspricht Bevor wir etwas tun, prüfen wir zuerst, ob kein Text verfügbar ist, dann geben wir einfach die Antwort mit dem Status 400 zurück und ich Jason, wir übergeben ein Objekt mit Nachrichteneigenschaft an den Kommentar, Text ist erforderlich Wenn wir nun einen Befehlstext haben, müssen wir einfach einen neuen Befehl erstellen. Die Kosten, der neue Kommentar entspricht dem Objekt, und im Inneren müssen wir die Benutzer-ID und den Text an den Text übergeben . Wir müssen also das Erstellungsdatum nicht übergeben, da wir aktuelle Datum bereits als Standardwert in unserem Schema übergeben. Jetzt müssen wir dieses neue Kommentarobjekt im Post-Kommentar-Array platzieren. Kannst du mir sagen, welche Methode wir verwenden werden? Ja, wir können es hier verwenden, ganz nach ID und Update. Die Kosten für das Posten entsprechen Await, Post, Punkt, Fine by ID und Update. An der ersten Position fügen wir die Post-ID hinzu. An der zweiten Position müssen wir übergeben, was wir aktualisieren möchten. den neuen Befehl zu pushen, verwenden wir jetzt die Dollar-Push-Methode. Hier fügen wir Cully-Klammern und in diesen Befehlen zu dem, was wir mit Wt drücken wollen, diesen neuen Befehl Und beim dritten Argument übergeben wir object with new an true Können Sie mir jetzt sagen, warum wir hier nicht die Methode at to set verwenden? Richtig, denn at to set erlaubt keine doppelten Werte. Aber hier kann der Befehl doppelt verwendet werden. Einem Benutzer können Befehle zugewiesen werden. Das können wir nicht leugnen, und das war's. Am Ende geben wir eine Antwort mit dem Statuscode 201 zurück. Neue Daten, und wir geben das JSN-Objekt mit der Nachrichteneigenschaft zum Kommentar zurück JSN-Objekt mit der Nachrichteneigenschaft , der erfolgreich hinzugefügt wurde Und da wir Kommentare zu Post-Dot-Befehlen in einem quadratischen Paket senden können , Post-Dot-Befehle Punktlänge minus eins abgezogen. Das ist der letzte Befehl , den wir hinzugefügt und ausgeführt Lassen Sie uns nun diese Implementierung durchführen. Öffnen Sie Postman und duplizieren Sie diese API, ändern Sie den Namen. Um einen neuen Befehl zu erstellen. Ändern Sie die Methode in post, zeigen Sie auch auf Post-ID-Befehle und senden Sie die Anfrage. Sehen Sie hier, dass wir eine Fehlermeldung erhalten, weil wir keinen Text übergeben. Im Hauptteil wechseln wir zu Raw und hier fügen wir ein Objekt mit einer Texteigenschaft hinzu. Was sollte ich kommentieren? Ja, das ist ein großartiges Produkt. Hier können Sie einen beliebigen Befehl hinzufügen. Senden Sie jetzt die Anfrage. Sehen Sie hier, wir bekommen den Befehl, bearbeiten erfolgreich, und hier bekommen wir auch den Befehl Buchstaben. In der nächsten Lektion werden wir nun eine API erstellen, um diesem Befehl eine Antwort hinzuzufügen. 180. Hinzufügen von Antworten auf Kommentare: Lassen Sie uns nun eine API zum Hinzufügen einer Antwort auf einen bestimmten Befehl erstellen . Es ist der vorherigen API sehr ähnlich, also Router Dot Post, Forward Slash, Column Post ID, Slash-Befehle, Schrägstrich hier benötigen wir auch die Kommentar-ID denn in welchem Befehl der Benutzer Antwort hinzufügen möchte, müssen wir Und danach Antworten mit Schrägstrich. Scrollen Sie nach oben und kopieren Sie gesamte API mit OT und fügen Sie sie in unsere API Gut. Jetzt müssen wir hier kleine Dinge ändern. Zuallererst erhalten wir in den Parametern auch die Kommentar-ID Lassen Sie uns die Anforderungspunktparameter destrukturieren, und hier erhalten wir Nun, an der Stelle des neuen Kommentars nennen wir diesen als neue Antwort und am Ende werden wir die Methode ändern, um einen zu verfeinern und zu Da wir fine one und update verwenden, müssen wir ihr Bedingungsobjekt beim ersten Argument übergeben. Darin übergeben wir die Unterstrich-ID an die Post-ID. Außerdem geben wir ihren Zustand, Doppelcodes, Kommentare, Punkte, Unterstriche, ID, an die Kommentar-ID weiter Achten Sie darauf, dass wir den richtigen Eigenschaftsnamen angeben , da Groß- und Kleinschreibung beachtet wird Sie könnten auch fragen, dass unsere Kommentare ein Array sind und wir hier die Punkt-Unterstrich-ID für Kommentare schreiben . Wird das funktionieren? Die Antwort lautet ja, es wird funktionieren, weil wir in Mongo Di B diese Punktnotation verwenden, die es uns ermöglicht, das Kommentar-Array zu durchsuchen und das erste Objekt zu finden , bei dem die Unterstrich-ID mit der Befehls-ID übereinstimmt Jetzt fügen wir in der Push-Methode an der Stelle der Befehle Kommentare und Punktantworten hinzu Hier können wir Kommentare Dot Dollar Dot Rep verwenden . Jetzt fragen Sie sich vielleicht, was der Unterschied zwischen Kommentaren mit Punktantworten und Kommentaren mit Dollarpunkt-RPS ist Kommentaren mit Punktantworten und Kommentaren mit Dollarpunkt-RPS Comments Dollar Operator ist also dafür optimiert, auf ein bestimmtes Element innerhalb eines Arrays abzuzielen ein bestimmtes Element innerhalb eines Arrays abzuzielen Auf der anderen Seite sind Kommentare mit Punktantworten für den allgemeinen Bereich bestimmt Lassen Sie mich Ihnen das anhand eines Beispiels erklären. Angenommen, dieser eine Beitrag hat zehn Kommentare, und wir möchten eine Antwort auf diesen zweiten Kommentar hinzufügen. Wenn wir nun hier Kommentare mit Punktantworten verwenden, wird allen Befehlen eine Antwort hinzugefügt Das wollen wir nicht, andererseits, wenn Sie hier Kommentare mit Punkt-Dollar-Punkt-Antworten verwenden, dann wird nur auf den zweiten Befehl eine Antwort hinzugefügt , und genau das wollen wir Denken Sie immer daran, dass Sie, wenn Sie ein bestimmtes Element in verschachtelten Arrays aktualisieren möchten , einen Dollar-Operator dazwischen hinzufügen müssen Gefällt mir Kommentare, Punkt, Dollarpunkt, Antworten. Dieser Dollar wird als Positionsoperator bezeichnet. In Mongo DB abgekürzt, funktioniert die Punktnotation zum Suchen und Löschen von Elementen, und zum Ändern von Array-Elementen wird ein Positionsoperator benötigt Jetzt, hier in unserer Aktualisierungsmethode, ändern wir diesen neuen Kommentar in eine neue Antwort Und am Ende ändern wir die Nachricht, um zu antworten, bearbeiten sie erfolgreich und senden diese neue Antwort einfach in unserer Antwort. Darüber fügen wir also die Kosten hinzu. Der Kommentar entspricht den Post-Punkt-Befehlen , also das Array. den spezifischen Befehl zu erhalten, müssen wir nun seinen Index finden. Stattdessen haben wir in Mongoose eine andere Methode namens Dot ID Dies hilft uns, ein Unterdokument anhand seines Unterstrich-ID-Felds innerhalb des Arrays zu finden . Wir müssen hier nur die Kommentar-ID angeben, aber stellen Sie sicher, dass Sie den Kommentar hinzufügen. Die Punkt-ID ist eine Andernfalls werden Sie in Zukunft verwirrt sein, wenn Sie sich diesen Code ansehen. In der Antwort an der Befehlsstelle fügen wir Antwort hinzu, und hier übergeben wir Befehl, Punktantworten, eckige Klammer, Befehl, Punktantworten, Punktlänge minus eins. Dadurch erhalten wir die letzte Antwort, die wir einfach hinzufügen. Speichern Sie die Änderungen und lassen Sie uns diese API zu Postman zurückprobieren diese API zu Postman zurückprobieren Hier duplizieren wir diese Kommentar-API und ändern ihren Namen, um eine neue Antwort hinzuzufügen Jetzt im Endpunkt müssen wir nach den Befehlen die Kommentar-ID hinzufügen. Kopieren wir die Kommentar-ID aus der vorherigen API und fügen sie in unsere API Nach der Kommentar-ID fügen wir Slash-Antworten hinzu. Lassen Sie uns jetzt auch den Antworttext ändern, um Ihnen vielmals zu danken und die Anfrage zu senden Sehen Sie hier, wir erhalten die Erfolgsmeldung und auch die letzte Antwort. Sie können also sehen, wie einfach es ist. 181. Übung - Entfernen eines bestimmten Kommentars: Jetzt ist es Zeit für ein wenig Bewegung. In dieser Übung müssen Sie eine neue API erstellen, um den spezifischen Befehl aus dem Beitrag zu löschen . Unsere API-URL wird also wie folgt aussehen: Slash-API-Slash-Post-ID , Schrägstrich-Befehle, Slash-Befehls-ID, und Sie müssen diesen Befehl mit dieser Befehls-ID entfernen Sie außerdem sicher, dass nur der Benutzer, der diesen Beitrag hochgeladen hat , oder der Benutzer, der diesen Befehl hinzugefügt hat, diesen Befehl entfernen Nicht alle Benutzer können Befehle entfernen. Es ist wirklich einfach. Ich weiß, dass du das kannst, es aus und sieh dir dann die Lösung an. Ich hoffe, Sie lösen diese Übung, und selbst wenn Sie irgendwo nicht weiterkommen, sich keine Sorgen, versuchen Sie es zumindest. Das ist am wichtigsten. Sehen wir uns nun schnell die Lösung für diese Übung an. Hier duplizieren wir einfach diese letzte API, weil sie sehr ähnlich ist. Zunächst ändern wir die Methode zum Löschen. Außerdem entfernen wir vom Endpunkt Slash-Antworten, weil wir sie nicht benötigen Jetzt in der Funktion brauchen wir diesen Text zunächst nicht Außerdem brauchen wir diese Bedingung nicht und wir brauchen auch diese neue Antwortvariable nicht. Bei der Methode „Fine One and Update müssen wir unsere Bedingung hinzufügen. Also zuerst die Unterstrich-ID zur Post-ID und jetzt für die Suche nach dem Befehl, und wir müssen sicherstellen aktuelle Login-Benutzer der Autor des Beitrags ist, oder er sollte der Autor des Befehls sein Hier verwenden wir also Dollar oder Operator, und das ist eine Reihe von Bedingungen Objekt, Objekt. Hier sollte unsere erste Bedingung schreiben oder die zweite Bedingung sollte schreiben. Zunächst überprüfen wir, aktuelle Benutzer der Autor des Beitrags ist oder nicht. Hier fügen wir die Benutzerspalte und die Benutzer-ID und für die zweite Bedingung, in einem anderen Objekt, übergeben wir Codes, Unterstrich-ID an die Kommentar-ID, Codes, Kommentare, Benutzer-2-Benutzer-ID Was wir tun wollen, wenn eine dieser beiden Bedingungen zutrifft. Wir wollen diesen Befehl aus dem Befehls-Array abrufen. Hier an der Stelle von Push verwenden wir den Pull-Operator und geben an, aus welchem Feld wir ziehen wollen. Ja, wir wollen Befehle abrufen, und hier übergeben wir die Bedingung, welches Objekt wir abrufen wollen. Im Objekt übergeben wir also eine gute ID an die Kommentar-ID. Jetzt brauchen wir diese Kommentarvariable nicht mehr und in der Antwort wir einfach Nachricht, Kommentar, erfolgreich gelöscht zurück. Außerdem geben wir Befehle an Post Dot Commans zurück und das war's Hier ist das, was wir meiner Meinung nach überprüfen sollten, gefunden oder nicht. Andernfalls erhalten wir diese Nachricht direkt , ohne sie zu löschen. Vor dieser Antwort fügen wir hinzu, dass der Beitrag nicht verfügbar ist, dann geben wir die Antwort mit dem Statuscode 403 zurück, und im Jason geben wir die Nachricht an Unbefugte weiter oder posten den Kommentar nicht gefunden. Wird nützlich sein. Speichern Sie die Änderungen und lassen Sie uns diese Implementierung testen. Zurück zu Postman Und hier duplizieren wir diesen Antwort-API-Test ändern den Namen in Löschen eines bestimmten Befehls, einer bestimmten Methode, um zu löschen Und am Endpunkt müssen wir nur diese Antworten entfernen und die Anfrage senden. C hat es erfolgreich kommentiert, und wenn wir dieselbe Anfrage erneut senden, sehen Sie, hier erhalten wir die Fehlermeldung „Nicht gefunden“, also funktioniert es Wie Sie sehen können, ist das Erstellen einer API nicht schwer. Wenn Ihnen die Logik klar ist, können Sie jede Art von API erstellen. Jetzt gibt es viel mehr APIs für Beiträge und Kommentare. Wir erstellen nicht alle, weil es sich, wie Sie sehen, wiederholt, und wenn ich Ihnen alle APIs nacheinander zeige, wird es Sie auch langweilen Sie können APIs entsprechend Ihren Projektanforderungen definieren. Es liegt ganz bei Ihnen. 182. Fehlerbehandlung: Derzeit haben wir in unserem Projekt keine Fehlerbehandlung hinzugefügt. Also öffne ich hier unser vorheriges Projekt, Card Wish, und aus der Indexpunkt-JS-Datei kopieren wir einfach diese Logger-Variable und auch die beiden Fehlerhandler und in unserem InkifImject in Config-Ordner erstellen in unserem InkifImject in Config-Ordner eine neue Datei namens logger dot js und In dieser Datei benötigen wir nun dieses Winston-Objekt. Also schreiben wir im Terminal NPM, installieren Winston mit der Rate 3.17 0.0, der Rate 3.17 0.0, und wir brauchen auch Winston MongoDB der Rate 6.0 Gut. An der Spitze der Kosten ist Winston dem Bedarf von Winston ebenbürtig Außerdem müssen wir hinzufügen, dass Winston Mongo DB für die Anmeldung in der Datenbank erforderlich Winston Mongo DB für die Anmeldung Jetzt müssen wir in unserem Logger diese Datenbankzeichenfolge ändern, um Punkt nw Punkt dB zu verarbeiten Und ganz am Ende modulieren wir einfach, dass Punktexporte dem Logger entsprechen. Wir können diesen Logger in jeder unserer Dateien verwenden. Also fügen wir in der Index-Dogs-Datei oben den Zusatz Const Logger is equal to require Wir gehen zum Config-Ordner und in diesen Logger. Jetzt kopieren wir aus dem vorherigen Projekt auch diese Cache-Methode von Mongoose Connect und ersetzen sie einfach durch unsere Cache-Methode Aus dem Cardwih-Projekt kopieren wir also diese benutzerdefinierte Fehler-Middleware zur Behandlung von Fehlern in API-Anfragen und fügen sie nach all unseren Routen in unser Linky-Fi-Projekt Außerdem können wir hier der Einfachheit halber den Punktprotokollfehler in der Konsole speichern. Jetzt fragen Sie sich vielleicht, dass wir diese Funktionen für die Behandlung von Ungod-Ausnahmen und UnhandlePmise-Ablehnungen nicht hinzufügen müssen Ungod-Ausnahmen und UnhandlePmise-Ablehnungen Ja, hier müssen wir sie nicht zu unserer Index-Dogs-Datei hinzufügen unserer Index-Dogs-Datei , denn wenn wir Logger aus einer Logger-Datei importieren, werden diese beiden Methoden automatisch ausgeführt, werden diese beiden Methoden automatisch da sie global in dieser Datei eingerichtet sind Und deshalb bekommen wir hier sauberen Code. Sie können also sehen, wie einfach es ist. Außerdem füge ich diese Logger-Datei immer zu meinem Github-Repository hinzu. Wann immer ich diesen Fehlerbehandlungscode benötige, kann ich ihn direkt abrufen. Aber um zu verstehen, was im Code enthalten ist. Wenn Sie das wissen, können Sie jeden Code verwenden und ihn zu Ihrem eigenen machen. Das war's für diesen Abschnitt. Im nächsten Abschnitt werden wir sehr interessante Echtzeitfunktionen kennenlernen . Wir sehen uns im nächsten Abschnitt. 183. Abschnitt 15 Einleitung: Willkommen zum 15. Abschnitt des ultimativen No-JS-Kurses. In diesem Abschnitt werden wir etwas über die Echtzeitkommunikation von unserem Backend zum Frontend und auch von Frontend zu Backend lernen von unserem Backend zum Frontend . Das wird Spaß machen, weil wir auch unsere Implementierung mit dem Frontend so probieren werden . Stellen Sie sich vor, dies sind zwei Benutzer von verschiedenen Computern die in unserer Inkifi-Anwendung miteinander chatten unserer Inkifi-Anwendung miteinander Sehen Sie, wie reibungslos es funktioniert. Unsere beiden Benutzer erhalten Nachrichten in Echtzeit, und wenn ein Benutzer eine Nachricht eingibt , erhält ein anderer Benutzer die Tippanzeige, sodass die Benutzererfahrung wie beim Chatten ist. Außerdem werden wir einen Gruppenchat implementieren, sodass mehr als ein Benutzer in Gruppen chatten kann. Also werden wir diese Funktionen in unserem Backend implementieren und es mit dem Frontend probieren. Eine Sache, die ich klarstellen möchte, ist , dass wir das Frontend nicht von Grund auf neu erstellen werden. Es dient nur zur Verkostung, damit Sie mehr über diese Echtzeitfunktionen erfahren können. Ich freue mich sehr auf diesen Abschnitt und hoffe, Sie auch. Also lass uns anfangen. 184. Erstellen von Chat – Nachrichtenmodell: die Jet-API zu erstellen, müssen wir zunächst eine Jet-Sammlung oder ein Jet-Modell erstellen, wie auch immer Sie es nennen möchten. Deshalb erstellen wir hier in unserem Modellordner eine neue Datei namens chats dot js. Jetzt kopieren wir aus dem vorherigen Benutzermodell den gesamten Code und fügen ihn hier ein. Gut. Jetzt ändern wir zuerst den Variablennamen in ein Chat-Schema. Lassen Sie uns außerdem alles aus dem Schemaobjekt entfernen und diesen Benutzer auch auf Chat umstellen und fertig. Lassen Sie uns nun das Chat-Schema definieren. Aber vorher möchte ich klarstellen, was Chat hier ist. Hat ist wie ein Raum, in dem zwei oder mehr Benutzer miteinander kommunizieren können. In einfachen Worten auf Instagram, hast du auf der linken Seite gesehen, wir bekommen alle Chats nach der neuesten Nachricht gekürzt Diese Füllungen sind Chat. Es können Gruppen oder einzelne Chats sein. Was wir für diese Chats brauchen. Derzeit implementieren wir nur einen Eins-zu-Eins-Chat also keine Gedanken über Gruppen-Chat-Funktionen. Denken Sie einfach an eins zu eins. Für den individuellen Chat können wir also ein Mittelfeld und auch ein Empfängerfeld erstellen. Und für beide fügen wir Typ zu Mongos Punktschema, Punkttypen, Punktobjekt-ID und Referenz zum Benutzer Nehmen wir an, Benutzer A sendet die Nachricht an Benutzer B. Wir fügen Benutzer A als Absender und Benutzer B zum Empfänger Nun, hier ist ein großes Problem. Angenommen, Benutzer B sendet jetzt eine Nachricht an Benutzer A. Dann ist der Absender Benutzer B und der Empfänger ist Benutzer A. Dadurch wird ein neues Chat-Dokument erstellt, und diese beiden Benutzer erhalten nicht denselben Chat, wenn sie miteinander sprechen. Was ist nun die Lösung? Es ist wirklich einfach. An der Stelle, an der Sender und Empfänger getrennt definiert werden, können wir also Sender und Empfänger getrennt definiert werden, ein einzelnes Feld für sie hinzufügen. Wie hier hatten wir Teilnehmer, was das Array ist, und darin werden wir die Benutzer-ID der Teilnehmer speichern. Geben Sie in Mongos Punktschema, Punkttypen, Punktobjekt-ID und Verweis auf den Benutzer ein Wenn Benutzer A eine Nachricht an Benutzer B sendet, haben wir Benutzer A und Benutzer B, beide IDs im Teilnehmer-Array, und wenn Benutzer B eine Nachricht an Benutzer A sendet, sind auch beide IDs in den Teilnehmern verfügbar Auf diese Weise erhalten wir einen einzigen Chat für Benutzer A, der eine Nachricht an Benutzer B sendet, oder Benutzer B eine Nachricht an Benutzer A. Diese Teilnehmerzahl wird verwendet, um Jets für einen bestimmten Benutzer abzurufen Jetzt, nach den Teilnehmern, wollen wir Datum und Uhrzeit. Dafür können wir Timestamps einfach auf true setzen und das war's Jetzt fragst du dich vielleicht, was ist mit Nachrichten? Für Nachrichten werden wir ein anderes Modell erstellen. Kopieren Sie also dieses Schema, und im Modellordner erstellen wir eine neue Datei namens messages dot js und fügen das Schema hier ein. Jetzt ändern wir zunächst das Chat-Schema in Nachrichtenschema und das Chat-Modell in Nachricht. Gut. Lassen Sie uns nun das Schema für eine einzelne Nachricht definieren. Für die Nachricht benötigen wir also zuerst ihre Chat-ID. Geben Sie also in Mongos Punktschema, Punkttypen, Punkt, Objekt-ID und Verweis auf die Chat-Sammlung ein, die wir gerade definieren Danach fügen wir den Absender, der diese Nachricht gesendet hat, und ihren Typ zur Objekt-ID und den Verweis auf den Benutzer hinzu. So können wir es einfach von den Teilnehmern ausschneiden und als Absender einfügen. Jetzt brauchen wir diese Teilnehmer nicht. Danach geben wir für den Inhaltstyp eine Zeichenfolge und für required den Wert true ein. Dies ist der Nachrichteninhalt oder Nachrichtentext, den Benutzer senden möchten. Nun, nach dem Inhalt, was wir hinzufügen, ja, wir benötigen den Status dieser Nachricht. Geben Sie die Zeichenfolge um in das Array ein, und hier definieren wir den Wertesatz wie Senden, Zugestellt und Lesen. Und standardmäßig setzen wir den Status auf Senden. In Zukunft werden wir den Status aktualisieren, wenn unsere Nachricht von anderen Benutzern zugestellt oder gelesen wurde, und das war's. Außerdem fügen wir bei Nachrichten Zeitstempel zu true hinzu und vergessen dabei Datum und Uhrzeit Jetzt fragst du dich vielleicht, warum wir diese Nachrichten nicht in das Chat-Modell aufnehmen Wir können Nachrichten erstellen, um alle Nachrichten mit dem zugehörigen Chat anzuordnen und zu definieren. Ja, das können wir tun, aber ein Grund, warum wir keine Nachrichten im Chat-Modell hinzufügen , ist, dass wir im Nachrichtenmodell das Hinzufügen, Aktualisieren und Löschen viele Male durchführen werden . Wir fügen Nachrichten in das Chat-Modell müssen uns dann mit wirklich tief verschachtelten Daten auseinandersetzen, was uns verwirren kann Und wenn wir dem Chat-Modell ein Nachrichten-Array hinzufügen, müssen wir beim Öffnen des Chats alle Nachrichten vom Backend abrufen, und das sind viel mehr Daten in einer Durch die Trennung der Nachrichten können wir also nur die letzten zehn oder 15 Nachrichten senden Wenn der Benutzer dann ältere Chat-Nachrichten sehen möchte, werden wir nur dann andere Nachrichten mithilfe der Paginierungstechnik abrufen mithilfe der Paginierungstechnik Deshalb trennen wir Nachrichten vom Chat-Modell. Hier im Chat-Modell können wir auch eine weitere Füllung hinzufügen. Letzte Nachricht, der Typ zu Mongos Punktschema, Punkttypen Punkt , ObjectID und Referenz zu unserem Nachrichtenmodell Auf diese Weise können wir die letzte Nachricht im Chat anzeigen und müssen sie nicht in der Nachrichtensammlung suchen In der nächsten Lektion werden wir nun eine API erstellen, die Jet-Liste für angemeldete Benutzer abzurufen. 185. Abrufen von Chats für Benutzer: Lassen Sie uns eine API erstellen, um die Jet-Liste für angemeldete Benutzer abzurufen. Hier im Routenordner erstellen wir eine neue Datei namens jets dot js. Jetzt erstellen wir zuerst einen Router, sodass Cs Router gleichbedeutend mit require Express ist. Dieser Ausdruck gibt Express Object zurück, und hier erhalten wir einfach den Punkt Router. Dies ist der einzeilige Code für diese beiden Zeilen, den wir bis jetzt verwenden. Am Ende exportieren wir das einfach mit Modulexporten, was Router entspricht. Was wir nun tun werden, wir fügen diese Routen auch zur Index-Dogs-Datei hinzu, drücken Strg+P und gehen zur Index-Dogs-Datei. Hier fügen wir Cost Jet Routes hinzu, entspricht Require, wir gehen zum Routenordner und darin finden wir Jets ganz unten, App Punkt U hier fügen wir das App Punkt U hier fügen wir Präfix API-Slash-Jets am zweiten Parameter hinzu, wir fügen Jet-Routen hinzu und speichern das Jetzt können wir unsere APIs definieren. Zuerst wollen wir die Liste der Jets für den aktuellen Login-Benutzer herausfinden , Router Dot Get Endpoint to Forward Slash, und hier brauchen wir Os Middleware weil nur angemeldete Benutzer Chats sehen oder chatten können Am Ende fügen wir die Asyn-Callback-Funktion mit Anfrage In dieser Callback-Funktion erhalten wir nun zunächst die Kosten, die Benutzer-ID, die der Benutzer-ID der Anfrage entspricht , der Punkt, der Unterstrich-ID Als Nächstes können wir den Chat finden. Die Kosten für Chats entsprechen dem Awart-Chat. Sehen Sie, die automatische Eingabe funktioniert Punkt Find und hier übergeben wir unsere Bedingung für Objektteilnehmer an die Benutzer-ID. Hier können wir auch Mongo Di Be-Operatoren verwenden, aber das wird auch funktionieren Wenn es nicht funktioniert, werden wir es ändern. Was ist los? Jetzt im Frontend wollen wir so etwas zeigen. Zuallererst Benutzer, der Nachrichten empfängt oder sendet. Außerdem die letzte Nachricht, wer die letzte Nachricht gesendet und zu welcher Zeit sie senden. Hier müssen wir die Benutzerdaten der Teilnehmer auffüllen . Punkt auffüllen Im ersten Argument übergeben wir den vollständigen Namen, also die Teilnehmer, und das zweite Argument ist der Füllname, sagen wir, die Unterstrich-ID und den Benutzernamen Jetzt benötigen wir auch die Informationen über die letzten Nachrichten. Füllen Sie auch hier das aus, was wir zuerst schreiben. Schreiben Sie, letzte Nachricht, geben Sie den Namen und dann zweitens, welche Füllung wir aus der letzten Nachricht benötigen Zuerst benötigen wir den Absender , der diese Nachricht gesendet hat. Nächster Inhalt, der Text der Nachricht, und als nächstes wird er erstellt unter. Wenn Sie sich über Phils Namen nicht sicher sind, können Sie sich hier auch Schema ansehen. Hier, eine kleine Herausforderung für uns. Wie wir sehen können, erhalten wir den Absender dieser letzten Nachricht, aber es ist auch die ID, nicht der Benutzername. Wir benötigen den Benutzernamen dieses Absenders. Also hier können wir das machen. Nach dieser Auffüllmethode fügen wir eine weitere Auffüllmethode hinzu. Zuerst fügen wir Punkt Absender der letzten Nachricht und als zweites Argument vollständigen Namen hinzu , also Jetzt denke ich, das sieht ein bisschen verwirrend aus. Es gibt also eine andere Möglichkeit, eine verschachtelte Populate-Methode zu schreiben. Lass es mich dir zeigen. Bisher übergeben wir in der Populate-Methode zwei Argumente Beim ersten Argument übergeben wir den Feldnamen, den wir auffüllen möchten , und beim zweiten übergeben wir die Eigenschaften, die wir aus der Relation erhalten möchten Das ist der erste Weg. Für die verschachtelte Populatet-Methode können wir hier die Populate-Methode übergeben. Anstatt hier Argumente zu übergeben, können wir jetzt wir Zunächst übergeben wir in diesem Objekt die Pfadeigenschaft. Dieser Pfad ist ein Feldname , den wir auffüllen möchten, was die letzte Nachricht ist Und eine weitere Eigenschaft ist ausgewählt. Hier wählen wir aus, welche Daten wir aus der Beziehung erhalten möchten. Sagen wir, der Inhalt wurde zentriert und am erstellt. Jetzt wollen wir hier wieder die Absenderdaten auffüllen. Nach der Auswahl übergeben wir eine weitere Eigenschaft, die aufgefüllt wird, und hier übergeben wir ein Objekt mit denselben beiden Eigenschaften path und Pfad zu dem, was wir hier hinzufügen, schreiben Sie den Absender. Wir müssen hier nicht den Punkt Absender für die letzte Nachricht da wir uns bereits in der Methode zum Ausfüllen der letzten Nachricht befinden der Methode zum Ausfüllen der letzten Nachricht und hier Select an den Benutzernamen übergeben Wenn Sie hier noch tiefer gehen wollen, können wir auch eine weitere Eigenschaft zum Auffüllen übergeben . Im Moment brauchen wir sie nicht, also entfernen wir diese Nun, hier funktionieren diese beiden Auffüllmethoden und diese einzelne verschachtelte Auffüllungsmethode beide Ich mag diesen verschachtelten Ansatz weil er klar und nicht verwirrend ist Wenn dir der erste gefällt, dann entscheide dich dafür. Mach dir keine Sorgen, es liegt ganz bei dir. Jetzt, nach dem Auffüllen, wollen wir die Jets in umgekehrter Reihenfolge wie bei der letzten Nachricht anzeigen Jets in umgekehrter Reihenfolge wie bei der letzten Nachricht Aber wie können wir hier Jets sortieren? Es ist wirklich einfach. Wenn jemand eine Nachricht sendet, werden wir, wie wir wissen, die Eigenschaft Jet, letzte Nachricht, aktualisieren , und wenn wir diese Eigenschaft aktualisieren, werden unsere Jets, die in der Eigenschaft aktualisiert wurden, aktualisiert. So können wir kurz darauf zugreifen, dass es in der Unterkunft aktualisiert wurde. Also kurz gesagt, und in object übergeben wir updated mit dem Wert minus eins, und am Ende geben wir den Antwortpunkt json, Object with chats an diese Chats zurück , und das war's. Derzeit erhalten wir die Chat-Liste für angemeldete Benutzer. Wenn der Benutzer nun einen bestimmten Chat öffnet, müssen wir ihm die Nachrichten dieses Chats anzeigen. In der nächsten Lektion werden wir dafür eine API erstellen. 186. Nachrichten eines bestimmten Chats abrufen: Lassen Sie uns Nachrichten eines bestimmten Chats abrufen. Also äußerer Punkt GT. Zuerst benötigen wir die ID des Chats, also Schrägstrich, Chat-ID, Schrägstrich-Nachrichten Außerdem benötigen wir hier oder Middleware und endlich ist da die Callback-Funktion In diesem Callback erhalten wir nun die Kosten, mit der die Chat-ID identisch ist, und wir destrukturieren die und wir destrukturieren Danach entspricht die Kostennachricht der Zahl Wait Message Dot Find Hier übergeben wir einfach die Objekt-Chat-ID an die Chat-ID. Lassen Sie mich überprüfen, ob es sich um einen Chat oder eine Chat-ID handelt. Ja, es ist eine Chat-ID. Als ich nicht Jazz gelernt habe, ist mir das passiert. Ich schreibe einen falschen Namen in die Abfrage und verbringe fast einen Tag damit, einen Fehler zu finden Schließlich überprüfe ich den vollständigen Namen. Stellen Sie also sicher, dass es Ihnen nicht passiert. Jetzt wollen wir hier diese Daten auffüllen. Also Pfeil bevölkern. Und hier wollen wir den Absender angeben und was Sie als Unterstrich-ID und Benutzernamen erhalten möchten Danach wollen wir Nachrichten in umgekehrter Reihenfolge erhalten, weil wir Nachrichten auf diese Weise im Frontend anzeigen Also sortieren wir hier nach Objekt, wir übergeben created at an ja, minus eins. Diese Abfrage gibt nun alle Nachrichten mit dieser Chat-ID zurück. In der realen Welt benötigen wir jedoch nur letzten zehn bis 20 Nachrichten , da niemand Nachrichten von Anfang an sehen wird. Wenn jemand frühere Nachrichten sehen möchte, können wir sie später als Paginierung abrufen Also für die Seitennummerierung schreiben wir hier, lassen Ci in Klammern, Seitenkommabegrenzung, das entspricht Destrukturierung hier Anfrage Punktabfrage Außerdem übergeben wir hier den Standardwert , falls das Frontend diese Daten nicht weitergibt Also Seite zu eins und beschränken wir uns auf sagen wir zehn. Danach müssen wir sie in Integer umwandeln. Seite ist also gleichbedeutend mit „ Integer übergeben“ und „Seite übergeben“. Duplizieren Sie diese Zeile mit Sift plus Alt plus Abwärtspfeil oder Sift plus Wahltaste plus Abwärtspfeil Und hier ändern wir diese Seite auf Limit und auch hier In unserer Abfrage fügen wir einfach die Skip-Methode hinzu und darin Seite minus eins in das Limit, und wir fügen auch die Limit-Methode hinzu und übergeben hier das Limit. Und am Ende fügen wir die Methode len hinzu. Wir erstellen eine Menge APIs mit Paginierung, oder? Jetzt können wir hier auch hinzufügen, dass C frühere Nachrichten hat, entspricht der Bedingung „Hier übergeben wir“, Punktlänge der Nachricht entspricht dem Limit Wenn es wahr ist, dann geben wir wahr zurück, andernfalls geben wir falsch zurück. Am Ende geben wir einfach JSunObject-Nachrichten mit Antwortpunkt auf Nachrichten, hat vorherige Nachrichten, auf eine vorherige Nachricht, Seite für Seite und Limit auf Limit zurück Und das ist alles. Im Moment haben wir keine Chats und Nachrichten, daher werden wir diese APIs testen nachdem wir Chats und Nachrichten erstellt haben. In der nächsten Lektion werden wir EPI für das Senden von Nachrichten erstellen 187. API zum Senden von Nachrichten: Lassen Sie uns nun eine API zum Senden von Nachrichten erstellen. Hier fügen wir also Router-Punktpost für den Endpunkt hinzu, wir fügen für unsere Schrägstrich-Spalte Jet-ID hinzu, in welchem Jet wir eine Nachricht, eine Schrägstrichnachricht oder Nachrichten senden möchten , wie auch immer Sie es nennen möchten Außerdem fügen wir Osmitalware und eine Acing-Callback-Funktion mit Anfrage und Acing-Callback-Funktion mit Anfrage Zuallererst erhalten wir die Benutzer-ID aus der Anfrage mit dem Punkt (Benutzerpunkt, Unterstrich-ID Anfrage mit dem Punkt (Benutzerpunkt, Unterstrich-ID Da wir die Kosten bekommen, entspricht die Chat-ID von Calibakets der Anfrage mit Punkt-PRMs. Was brauchen wir noch Wir benötigen den Inhalt der Botschaft, die wir vom Körper erhalten Der Inhalt von Cost Calibacket entspricht dem Text der Anfrage. nun, bevor wir etwas tun, Lassen Sie uns nun, bevor wir etwas tun, den Zustand hier überprüfen. Wenn kein Inhalt verfügbar ist, geben wir die Antwort mit dem Stata-Code 400 zurück und in der JSON-Methode geben wir das Objekt mit der Nachricht an den Inhalt zurück, oder wir können sagen, Nachricht, Text ist erforderlich Was wir nun innerhalb dieser API tun wollen, ist, einfach die Nachricht in der Datenbank zu speichern Das ist es. Hier können wir Kosten machen, eine neue Nachricht ist gleich einer neuen Nachricht. Hier im Objekt übergeben wir die Jet-ID an die Chat-ID, Absender an was geschrieben hat, Benutzer-ID und dann fügen wir Inhalt zum Inhalt hinzu. Danach warten wir auf die neue Nachricht Punkt c. Und zuletzt wir einfach die Antwort mit dem Statuscode 201 zurück, und in Jason übergeben wir Objekt, neue Nachricht an neue Nachricht. Bevor wir diese API testen, fragen Sie sich vielleicht, dass wir keine API zum Erstellen von Chats erstellt haben. Wie können wir dann die Jet-ID weitergeben? Ihre Frage ist richtig. Wir müssen die Jet-API erstellen, bevor wir die Nachricht speichern. Hier erstellen wir eine neue API, Router-Punktpost, Zeiger auf Slash Chat erstellen Hier benötigen wir Middleware und auch eine Callback-Funktion mit Zuallererst erhalten wir, dass die Cost-Benutzer-ID Anforderungspunkt-Unterstrich-ID entspricht Außerdem benötigen wir die Empfänger-ID, wer der Empfänger oder ein anderer Benutzer dieses Jets ist Die Cost-Empfänger-ID entspricht der Request Dot Body Dot Receiver-ID. Da wir diese Empfänger-ID aus dem Hauptteil der Anfrage beziehen, empfiehlt es sich, sie zu überprüfen. Wenn also die Empfänger-ID nicht verfügbar ist, geben wir die Antwort mit dem Statuscode 400 zurück und in Jason geben wir das Objekt mit der Nachricht an den Empfänger zurück, die erforderlich ist. Bevor wir einen neuen Chat erstellen, ist es besser herauszufinden, ob diese beiden Benutzer bereits einen Chat haben oder nicht. Also lass Chat gleich warten Chat Punkt Gut eins. Hier in Objekt übergeben wir Teilnehmer an Objekt und fügen dabei Dollar oder zum Array, Benutzer-ID, Komma, Empfänger-ID Bei dieser Abfrage handelt es sich um einen Jet, in dessen Teilnehmern sich sowohl die Benutzer-ID als auch die Empfänger-ID befinden sowohl die Benutzer-ID als auch die Empfänger-ID Was ist nun, wenn es sich um einen Gruppenjet handelt? Dann ist es möglich, dass es mehrere Jets gibt , in denen diese beiden IDs verfügbar sind. Hier müssen wir sicherstellen, dass nur Benutzer-ID und Empfänger-ID verfügbar sind. Dafür können wir hier die Dollargröße bis zwei verwenden. Dies ist ein weiterer nützlicher Operator von Mongo Dib. Ich habe kürzlich davon erfahren. Was ist nun, wenn es wirklich keinen Chat für Benutzer und Empfänger gibt? Einfach dann, um einen neuen Chat zu erstellen. Wenn also kein Chat verfügbar ist, dann entspricht Chat bei New Jet. Hier im Objekt fügen wir Teilnehmer zum Array Benutzer-ID, Komma und Empfänger-ID hinzu, und dann können wir auf den Chat-Punkt c warten. Am Ende geben wir einfach die Antwort mit dem Statuscode 201 zurück Antwort mit dem Statuscode 201 In JSON senden wir einfach diesen Chat und das war's. Jetzt haben wir die Jet-API erstellt. Bevor wir eine neue Nachricht erstellen , sollten wir zunächst überprüfen, ob der Benutzer eine korrekte Chat-ID eingegeben hat oder nicht und ob er der Teilnehmer des Chats ist oder nicht. Wenn wir diese Bedingung nicht überprüfen, kann jeder eine Nachricht an jede Person oder Gruppe senden. Cost Chat entspricht Await Chat Dot Fine Buy ID, und hier übergeben wir JatID Danach überprüfen wir, ob Jet nicht verfügbar ist oder ob der Jet Dot-Teilnehmerpunkt die Benutzer-ID enthält Wenn der Absender nicht unter den Teilnehmern ist, geben wir Ihre Ausrufezeichen und geben dann die Antwort mit dem Statuscode 403 und in der JSON-Nachricht „ Zugriff verweigert“ zurück und in der JSON-Nachricht „ Zugriff verweigert Jetzt verifizieren wir Jet. Jetzt ersetzen wir in der neuen Nachricht diese Chat-ID durch eine Chat-Punkt-Underscore-ID Was müssen wir nun noch tun, wenn wir eine neue Nachricht senden? Kannst du es erraten? Richtig, wir müssen die Eigenschaft „ Letzte Nachricht“ des Chats aktualisieren. Denken Sie daran, dass wir nach dem Speichern der Nachricht den Chat-Punkt schreiben. Die letzte Nachricht entspricht der neuen Nachrichtenpunkt-Unterstrich-ID Und danach warten wir auch auf das Speichern des Chat-Punkts. Und das war's. Jetzt endlich ist T diese API. Öffnen Sie Postman und hier erstellen wir einen neuen Ordner namens Chats. Darin fügen wir eine neue Anfrage namens Neuen Chat erstellen Gute Methode zum Posten. Im Endpunkt fügen wir SGDP, Spalte mit doppeltem Schrägstrich, Lokaler Host, Spalte 3.000 Schrägstrich, API , Schrägstrich, Schrägstrich Zuallererst müssen wir das Token im Header übergeben. Zurück zu unserer Login-API und hier für das Hari-Konto, gut, dieses Token zu kopieren und in unserer Chat-API in Headern erstellen hatten wir die Autorisierung, einen Fehler zu machen, das Token zu platzieren und die Anfrage zu senden Sehen Sie, hier erhalten wir einen internen Serverfehler weil die Empfänger-ID erforderlich ist Also hier im Körper gehen wir zu aw. Hier übergeben wir JsObject und hier die Empfänger-ID an Codes, zurück an Mango Di Becompass und hier kopiere ich diese andere Benutzer-ID und füge sie in die Empfänger-ID Senden Sie jetzt die Anfrage. Sehen Sie hier, wir bekommen einen neuen Jet, kopieren Sie diese Jet-ID. Senden Sie als Test die Nachrichten-API. Stellen Sie sicher, dass Sie diese API mit Control plus oder Command plus a speichern mit Control plus oder Command plus a und dann diese Post-Anfrage duplizieren. Ändern Sie den Namen der Anfrage , um eine neue Nachricht zu senden. Außerdem stelle ich in unserer API fest, wir die Chat-ID im Anforderungsparameter und den Inhalt im Anfragetext übergeben dass wir die Chat-ID im Anforderungsparameter und den Inhalt im Anfragetext übergeben müssen. Also können wir so etwas machen. Wir können unsere API ändern und darauf hinweisen, dass nur Nachrichten gesendet Hier erhalten wir die Chat-ID im Anfragetext. Gut. Speichern Sie diese und kehren Sie zu Postman zurück Hier ändern wir unseren Endpunkt auf Slash-Chats, Schrägstrich zum Slash-Chats, Schrägstrich Im Header haben wir bereits ein Token, also müssen wir nur den Text der Anfrage übergeben Hier im Objekt übergeben wir Inhalt, sagen wir, dies ist die erste Nachricht. Außerdem fügen wir die Jet-ID hinzu und fügen diese Jet-ID hier ein. Senden Sie jetzt die Anfrage. Sehen Sie hier, wir bekommen den neuen Nachrichteninhalt zu unserer Nachricht, und im Absender ist es unsere ID. Jetzt ist es besser, dass wir am Ort des Absenders die ID und den Benutzernamen sehen können. Dadurch ist es einfach, neue Nachrichten im Frontend anzuzeigen. Ganz am Ende definieren wir die Kosten. Die Nachricht auffüllen entspricht dem Punkt auf die Nachricht warten, bis die Nachricht gefunden wird . Neuer Nachrichtenpunkt unterstreicht die ID, den Punkt Zuerst fügen wir den Absender hinzu und beim zweiten Argument fügen wir die Unterstrich-ID hinzu und verwenden einen Namen. Und in der Antwort geben wir eine neue Nachricht zurück, um die Nachricht zu füllen. Speichern Sie die Änderungen und lassen Sie uns eine weitere Nachricht senden. Dies ist die zweite Nachricht, und senden Sie die Anfrage. Sehen Sie, im Absender erhalten wir die ID und den Benutzernamen. Also hier funktioniert unsere API zum Senden von Nachrichten gut. Wunderbar. 188. Was sind Web-Sockets?: In den vorherigen Lektionen haben wir also APIs für das Senden von Nachrichten erstellt und auch APIs für den Empfang von Nachrichten eines bestimmten Chats definiert . Stellen Sie sich nun vor, dies ist unser Frontend und es hat eine offene Chat-Seite für zwei Benutzer, Hurley und Mike Das ist also der Bildschirm von Hul und das ist der Bildschirm von Mike Beide befinden sich auf der Chat-Seite , an der sie beide teilnehmen, und beide erhalten zwei Nachrichten, bei denen es sich um einen Verlaufs-Chat handelt Stellen Sie sich nun vor, Harley gibt hier eine neue Nachricht ein und klickt auf Senden Auf der Schaltfläche Senden rufen wir also die API zum Senden einer neuen Nachricht auf, oder? Und wie wir wissen, speichert diese API diese Nachricht in unserer Datenbank. Jetzt ist das Problem, wie Mike diese Nachricht bekommen wird , weil Mike bereits alle Nachrichten dieses Jets abgerufen hat und Hurley danach die neue Nachricht sendet Einer war, dass Mike alle 5 Sekunden eine Anfrage zum Abrufen von Nachrichten sendet , um neue Nachrichten zu erhalten Es ist so, als würde Mike den Server fragen, ob es eine neue Nachricht für mich gibt? Server sagt nein. Nach 5 Sekunden fragt Mike erneut, ob es eine neue Nachricht für mich gibt? Auch hier sagt der Server nein. Wenn der Server dann eine neue Nachricht erhält in weiteren 5 Sekunden Mike in weiteren 5 Sekunden erneut nach der neuen Nachricht fragt, sendet ihm der Server zu diesem Zeitpunkt eine Nachricht. Stellen Sie sich nun vor, wir haben 10.000 oder 100.000 Benutzer auf unserer Website und alle Benutzer senden alle 5 Sekunden eine Nachrichtenanfrage, was wirklich bedeutungslos ist, da wir nur dann neue Daten erhalten, wenn unser Server neue Daten erhält Andernfalls gehen unsere Anfragen einfach an den Server und kommen zurück Dadurch wird unser Server definitiv langsam oder stürzt manchmal sogar ab. Hier können wir uns also nicht auf diese Lösung verlassen. Wir brauchen etwas, das Mike automatisch mitteilt, ob er eine neue Nachricht hat , und das automatisch auf dem Bildschirm der Maus sendet. Und um dieses Problem zu lösen, haben wir einen Web-Socket. Also, was sind Web Sockets? Web Socket ist eine Möglichkeit für unser Website-Frontend und unser Server-Backend, in Echtzeit miteinander zu kommunizieren Es ist wie eine wechselseitige Konversation. In einfachen Worten, Web-Sockets helfen uns dabei, Konversationen in Echtzeit aufzubauen. Eine Web-Socket-Verbindung ist wie ein Telefonanruf zwischen Ihrem Browser und dem Server. Sobald der Anruf getätigt wurde, kann der Browser mit dem Server kommunizieren und Server kann auch jederzeit antworten. Jetzt fragen Sie sich vielleicht, was der Unterschied zwischen APIs und Web-Sockets ist . Stellen Sie sich vor, das ist unser Frontend und das ist unser Server. Nehmen wir nun an, dass wir im Frontend einige Daten abrufen möchten, also senden wir eine API-Anfrage vom Frontend an unseren Server. Server verarbeitet diese Anfrage und sendet eine Antwort an unser Frontend. Hier ist unsere API-Verbindung geschlossen. Beispielsweise sendet Harley vom Frontend aus mithilfe der Post-API eine Nachricht an unseren Server Jetzt speichert unser Server diese Daten in der Datenbank und gibt dann die neue Nachricht an das Frontend zurück Hier ist unsere Verbindung geschlossen. Dies ist die Art der Verbindung mithilfe von SGDP-APIs. Lassen Sie uns nun sehen, wie Web Socket funktioniert. Hier haben wir das Frontend und das ist unser Server. Jetzt stellen wir hier zunächst eine Verbindung über den Web-Socket her. Über diese Verbindung kann unser Client die neuen Messet-Daten ohne API-Aufruf an den Server senden die neuen Messet-Daten ohne API-Aufruf an den Server Genauso wie der Server auch neue Messet-Daten zurückgeben kann. Nachdem der Server neue Nachrichtendaten eingegeben hat, bleibt diese Verbindung immer noch bestehen Sie wird erst geschlossen, wenn wir unsere Website schließen oder sie manuell mit dem Code schließen. Lassen Sie mich Ihnen das anhand eines Beispiels aus der realen Welt erklären. Hier ist Harley, hier ist Mike und hier ist unser Server Angenommen, Harley und Mike bauen beide über Web-Sockets eine Verbindung zu unserem Server Wenn Halley nun eine neue Nachricht an den Server sendet, speichert der Server diese Nachricht in der Datenbank und sendet diese Nachricht dann an das Mikrofon, ohne dass Mike eine API-Anfrage sendet Wenn Mike nun eine Nachricht an den Server sendet, speichert der Server diese Nachricht auch in der Datenbank und sendet dann diese neue Nachricht an Harley Wenn unser Server nun eine weitere Nachricht für Mike von einem anderen Benutzer erhält , dann erhält auch Mike diese Nachricht, aber das passiert nur, wenn Mike über einen Web-Socket eine Verbindung zum Server aufbaut über einen Web-Socket eine Verbindung zum Server Wenn Harley mit dem Server verbunden ist, Mike jedoch nicht über einen Web-Socket mit dem Server verbunden ist, wird die neue Nachricht in der Datenbank gespeichert, erreicht aber nicht das Mikrofon So funktioniert Web Socket. Web-Sockets werden für den Aufbau Echtzeitkommunikation zwischen Frontend und Backend verwendet. Keine Sorge, es ist wirklich einfach. Verstehen Sie all das, wenn wir Web-Sockets in unserem Backend einsetzen und probieren Sie es mit dem Frontend aus. 189. Anschluss der Buchse: In der vorherigen Lektion haben wir gesehen, dass wir, wenn wir Echtzeitdaten senden und empfangen wollen , herstellen müssen, um mit zum Web-Socket herstellen müssen, um mit dem Web-Socket umzugehen Wir werden den beliebtesten Bibliotheks-Socket Dot IO verwenden. Diese Bibliothek wird von vielen gängigen Plattformen verwendet, sodass wir sie definitiv verwenden können. Öffnen Sie das Terminal und hier schreiben wir NPM install socket dot IO mit der Rate 4.8 0.1 Es tritt ein. Gut, minimiere dieses Terminal und lass uns einen Socket zu unserer Backend-Anwendung hinzufügen In der JS-Datei mit Indexpunkt geben wir Coli-Klammern Server entspricht Socket-Punkt-IO Und unten können wir die Kosten hinzufügen . AO entspricht dem Wert eines neuen Servers. Jetzt müssen wir auf diesem Server unseren SGDP-Server übergeben. Ohne den SGDP-Server erhält der Socket keine Verbindungsanfrage Dafür müssen wir einen SDDP-Server erstellen. Die Kosten für SDDP entsprechen dem SDP-Bedarf. Dies ist das integrierte SGDP-Modul unten. Wir fügen hinzu, dass der Const-Server dem SDP Punkt Create Server entspricht Jetzt können wir diesen Server in unseren Socket übergeben. Gut. Hier ist nun eine Frage, auf welcher Platine der Socket-Server zuhören wird. Denn hier für die Express-App definieren wir Port 3.000 und am Ende hören wir mit diesem Port ab. in unserer aktuellen Implementierung Wenn wir in unserer aktuellen Implementierung den Socket Dot Listen zu 5.000 hinzufügen, werden unsere APIs auf Port 3.000 und unser Socket auf Port 5.000 ausgeführt. Das wollen wir nicht. Wir wollen, dass unsere APIs und unser Socket beide auf demselben Board funktionieren. Dafür müssen wir hier auf dem Create-Server diese Express-App übergeben. Auf diese Weise erstellt dieses SGTP-Modul einen Server mit dieser Express-App und demselben Server, den wir für die Initialisierung des Sockets verwenden Ebenfalls unten müssen wir diese App Dot Listen durch Server Dot Lisen ändern Server Dot Lisen Andernfalls wird das nicht richtig funktionieren. Speichern Sie diese Änderungen und starten wir unsere Anwendung neu, um sicherzustellen, dass sie ordnungsgemäß ausgeführt wird oder nicht. Sehen Sie hier, dass der Server auf B 3.000 läuft und dass auch Mongo Db angeschlossen Das heißt, es funktioniert einwandfrei. Um es kurz zusammenzufassen, um Socket in unserem Backend zu initialisieren, müssen wir zuerst einen Server erstellen und die Express-App InsideE übergeben , dann können wir diesen Server verwenden, um einen Socket-Server zu erstellen, und am Ende müssen wir auch Serverpunkt-LISN an auch Serverpunkt-LISN Hier initialisieren wir also erfolgreich initialisieren Jetzt kann jeder vom Frontend aus eine Verbindung zu diesem Socket Aber was wollen wir tun, wenn sich jemand mit der Steckdose verbindet? Wir müssen diese Logik hinzufügen. Es ist wirklich einfach. Hier, nach diesen App-Routen, fügen wir IO hinzu, was der Punkt auf der Socket-Instanz ist, und beim ersten Argument übergeben wir die Verbindung, und beim zweiten Argument übergeben wir hier die Callback-Funktion und was wir tun, übergeben wir hier die Callback-Funktion und wenn sich jemand mit unserem Socket verbindet Im Moment konsolen wir Dot Log einfach. Benutzer verbunden. Immer wenn vom Frontend jemand eine Verbindung zu unserem Socket herstellt, wird diese Callback-Funktion ausgeführt Nun, wie können wir diese Implementierung probieren? das zu probieren, habe ich eine einfache SGML- und JavaScript-Dummy-Anwendung erstellt einfache SGML- und JavaScript-Dummy-Anwendung Mach dir keine Sorgen. Wenn Sie nichts über Frontend wissen, erkläre ich Ihnen das. Auch wenn du es nicht probieren willst, dann kannst du dir diese Verkostung ansehen. Hilft Ihnen auch, den Arbeitsablauf des Sockets zu verstehen. Im Ressourcenordner haben wir den Ordner Project Three und darin haben wir die LinkFi-Test-App Kopieren Sie diesen Ordner und verschieben Sie ihn in unseren Projektordner Hier fügen wir diesen Ordner ein. Öffnen Sie jetzt diesen Ordner im Vas-Code. Gut. Hier verwenden wir zunächst diesen einfachen Chat-Ordner. Der Grund, warum ich die Frontend-App hier verwende , ist, dass das Lernen von Socket mit einem echten Frontend Spaß machen wird und auch der gesamte Socket-Workflow gelöscht wird. Keine Sorge, Sie müssen hier keinen Code schreiben. Mach es einfach wie ich. Um dieses Frontend auszuführen, verfolgen Sie diese einfache Chat-Punkt-GML-Datei im Browser und öffnen Sie sie im neuen Tab Siehst du, hier bekommen wir diese Art von Schnittstelle. nun zum Frontend-Vis-Code zurück und öffnen Sie diese einfache Chat-Punkte-Datei. Oben können Sie sehen, dass Write-Socket AO entspricht, und im Inneren übergeben wir unseren Backend-Link , der Local Host-Spalte 3.000 ist Dieser Ausdruck bedeutet, dass wir uns mit dem Socket verbinden wollen , der auf diesem Pot initialisiert ist Sie fragen sich vielleicht auch, wie wir zu dieser Ao-Methode kommen. Wir bekommen diese Ao-Methode , weil ich Socket mit Dan Link hinzugefügt habe. Siehst du, hier ist sie, und aus diesem Grund kommen wir zu Aomthod Speichern Sie diese Seite und kehren Sie zu unserem Frontend zurück. Schauen wir uns unsere Konsole an, klicken Sie also mit der rechten Maustaste auf die Seite und gehen Sie zu Inspec Hier sehen Sie, dass wir diesen Kursfehler für die lokale Host-Spalte 3.000 mit Schrägstrich erhalten lokale Host-Spalte 3.000 mit Schrägstrich Jetzt fragen Sie sich vielleicht, wir haben den Kurs in dieser Express-App bereits aktiviert Warum erhalten wir immer noch diesen Kursfehler Der Grund dafür ist, dass wir den Kurs nur für unsere Express-App konfigurieren, aber wir müssen den Kurs auch für unseren Socket-Server konfigurieren . Es ist wirklich einfach. Hier in der Servermethode können wir beim zweiten Argument die Optionen für den Socket-Server übergeben . Ich widerspreche, wir übergeben hier natürlich auch Objekt, erste Eigenschaft origin an star, was bedeutet, dass jeder Port erlaubt ist. Außerdem, wenn wir nur unser Frontend übergeben wollen, dann können wir hier diese URL übergeben. Aber vorerst bleiben wir bei Star. Sie können vom Frontend-Browser aus kopieren oder portieren. Nach Origin können wir nun Methoden übergeben , also Array, und wir übergeben hier Get und Post. Diese Methode von Sun spezifiziert, welche SGDP-Methoden während des Web-Sockets NDSAC erlaubt sind Jetzt fragen Sie sich vielleicht, was Websocket Hensak ist. Wenn ein Client eine Verbindung zu einem Socket- oder DI-Server herstellt, beginnt er mit einer SDP-Anfrage. Der Handschlag Wenn es erfolgreich ist, wird es eine Web-Socket-Verbindung aktualisiert Während dieses Handshakes prüft der Server, ob die eingehende SDDP-Methode zulässig ist oder Es ist wichtig, diese Methoden hinzuzufügen, da damit unsere Verbindung hergestellt Wenn wir nicht die richtigen Methoden angeben, blockiert der Browser möglicherweise die Verbindung aufgrund eines Kursfehlers. Speichern Sie das und lassen Sie uns unser Frontend aktualisieren. Sehen Sie, hier erhalten wir keine Fehlermeldung, und wenn wir unser Backend im Terminal überprüfen, erhalten wir die Konsolenmeldung, dass ein Benutzer verbunden ist. Außerdem aktualisieren wir unsere Anwendung noch einmal. Dann sehen Sie in unserem Backend, hier sehen wir wieder, dass ein Benutzer verbunden ist, was bedeutet, dass unser Frontend-Benutzer über Socket erfolgreich mit unserem Backend verbunden ist . Um es kurz zusammenzufassen: Nach Initialisierung von Socket fügen wir in unserem Backend einen Punkt bei der Verbindung hinzu, und beim zweiten Argument übergeben wir die Callback-Funktion Wenn also ein neuer Benutzer eine Verbindung zu unserem Socket herstellt, wird diese Callback-Funktion ausgeführt Und auch in dieser Callback-Funktion werden wir unsere gesamte Logik für Socket schreiben So initialisieren und handhaben wir die Verbindung von 190. Socket-Emit- und -Methoden: Sie denken vielleicht, dass es schwierig ist, einen Socket-bezogenen Code zu schreiben . Es hat viele Methoden und Funktionen. Wie können wir sie lernen? Wenn Sie diese Art von Gleichungen haben, machen Sie sich keine Sorgen. Zum ersten Mal denke ich auch, dass Socket sehr schwierig ist. Aber wenn ich es tatsächlich in meinem Projekt anwende, ist es wirklich einfach. Socket hat hauptsächlich zwei Methoden, Socket Dot D und Socket Dot On. 90% der Zeit werden wir diese beiden Methoden verwenden, und glauben Sie mir, sie sind wirklich einfach. Wie wir wissen, wird Socket für Echtzeit-Konversationen zwischen Frontend und Backend verwendet . Im Grunde bedeutet dies, dass unser Server oder Backend jederzeit Daten vom Frontend ohne API-Aufrufe senden und empfangen kann Daten vom Frontend ohne API-Aufrufe senden und empfangen , und es funktioniert auch umgekehrt. Frontend kann auch Daten vom Backend senden und empfangen. Nehmen wir an, Harley möchte von unserem Frontend aus eine Nachricht an das Backend senden , als ob dies die neue Nachricht ist Die Sache ist nun, wie können wir Daten vom Frontend senden Dafür verwenden wir also Socket Dot E, um eine Nachricht zu senden. Dies ist der Name des Ereignisses, und beim zweiten Argument können wir unsere Daten hinzufügen. Im Klartext bedeutet emittieren senden. Wir sagen unserem Socket also, die Daten auszusenden oder, in einfachen Worten, die Daten zu senden. Auf diese Weise senden wir Nachrichten vom Frontend aus, aber im Backend müssen wir auch die Logik für die Behandlung dieses Ereignisses schreiben. Und dafür verwenden wir Socket Dot beim Senden der Nachricht. Dies ist derselbe Eventname , den wir vom Frontend senden. Und beim zweiten Parameter übergeben wir die Callback-Funktion, die ausgeführt wird, wenn wir das Ereignis „Nachricht senden“ erhalten Also werden wir unsere gesamte Logik in diese Callback-Funktion schreiben. Ob wir Nachrichten in der Datenbank speichern oder sie direkt an andere Benutzer senden möchten sie direkt an andere Benutzer senden In einfachen Worten, denken Sie daran, wenn wir Daten vom Frontend zum Backend oder vom Backend zum Frontend senden wollen , verwenden wir die Socket-Dot-Methode mit dem Ereignisnamen Wenn wir Daten vom Backend oder vom Frontend empfangen möchten , verwenden wir Socket Dot On, und hier schreiben wir denselben Eventnamen und dieselbe Callback-Funktion Lassen Sie uns das in unserer Anwendung implementieren. Also zuerst im Frontend-Dab, hier habe ich ein Submit-Event für unser Formular hinzugefügt , in dem wir eine Nachrichteneingabe und eine Schaltfläche zum Senden haben Und hier erhalten wir eine Eingabenachricht und verwenden einen Namen, der in diese beiden Variablen eingegeben Also ist alles vorbereitet. Wir müssen eine Nachricht mit Socket senden. Also hier, welche Socket-Methode wir zum Senden der Nachricht verwenden. Richtig, wir werden den Socket-Punkt m verwenden. Beim ersten Argument schreiben wir den Namen des Ereignisses, sagen wir, Nachricht senden. Und beim zweiten Argument können wir Daten übergeben, die wir mit diesem Ereignis senden wollen. Nehmen wir an, wir übergeben hier ein Objekt mit dem Absender an das Objekt unter quadratischen ID, sagen wir 123, und verwenden einen Punktwert zwischen Name und Benutzername. Und noch ein Eigenschaftsinhalt zur Eingabe des Punktwerts , der unser Nachrichtentext ist. Außerdem senden wir „Erstellt am“ zu einem neuen Datum und übergeben den Status „ Senden“. Und das ist alles. Hier haben wir Füllungen hinzugefügt, wie wir sie in der Datenbank definieren. Hier senden wir mit diesem Code die Nachrichtendaten, wenn wir ein Formular abschicken. Lassen Sie uns nun sehen, ob wir diese Daten in unserem Backend erhalten oder nicht Sagen Sie mir also, welche Socket-Methode wir zum Abrufen der Ereignisdaten verwenden werden Richtig, wir verwenden Socket Dot On. Du lernst ziemlich schnell, reizend. In unserem Backend im Ao Punkt an, wir am Socket Punkt an. Was geben wir beim ersten Argument durch? Richtig, wir übergeben den Namen des Ereignisses, das wir behandeln wollen , nämlich Nachricht senden. Stellen Sie sicher, dass Sie den gleichen Namen schreiben , den wir vom Frontend übergeben haben. Andernfalls funktioniert es nicht und es wird auch zwischen Groß- und Kleinschreibung unterschieden. Beim zweiten Argument übergeben wir nun die Callback-Funktion, die ausgeführt wird, wenn jemand vom Frontend dieses Ereignis zum Senden einer Nachricht sendet Im Parameter dieser Funktion erhalten wir die Daten, und im Moment protokollieren wir einfach eine neue Nachricht vom Frontend und halten uns an diese Diese Daten sind das Nachrichtenobjekt , das wir vom Frontend übergeben Jetzt fragen Sie sich vielleicht, wie können wir beim Rückruf einen Socket in diesen O-Punkt bekommen Rückruf einen Socket in diesen O-Punkt Wir kommen einfach über den Parameter hierher. Mit diesem Socket können wir die Methoden emit und on hinzufügen. Speichern Sie diese Änderungen und lassen Sie uns eine Nachricht vom Frontend senden. Aktualisieren Sie die Seite hier, Benutzernamen und hier die Nachricht, die erste Nachricht, und klicken Sie auf Zustimmen Hier passiert nichts. Und wenn wir unser Backend überprüfen, überprüfen Sie unser Terminal. Sehen Sie hier, wir stellen eine Benutzerverbindung her und dann erhalten wir das Nachrichtenobjekt, was bedeutet, dass wir die Nachricht erfolgreich vom Frontend erhalten. Das Senden und Abrufen von Daten mit einem Socket ist so einfach. Wir müssen uns nur an die Methode Socket Dot und Socket Dot On erinnern . Jetzt bekommen wir hier die Nachricht vom Frontend. Als Nächstes, was wir mit dieser Nachricht machen wollen. Natürlich möchten wir diese Nachricht in der Datenbank speichern und diese Nachricht dann an das Frontend zurückgeben . Unser Frontend kann diese Nachricht auf dem Bildschirm anzeigen. Sie sich vorerst keine Gedanken über die Datenbanklogik, wir werden sie später implementieren. Im Moment wollen wir diese Nachricht nur an das Frontend senden. Sag mir, welche Methode wir verwenden werden, um die Daten vom Backend zum Frontend zu senden. Ja, wir verwenden Socket Dot und beim ersten Argument übergeben wir das Ereignis. Nachricht erhalten. Sie können ihm einen beliebigen Namen geben. Es spielt keine Rolle. Was wollen wir nun mit dieser Veranstaltung aussenden? Ich möchte dieselben Daten senden. In der realen Welt werden wir ein neues Nachrichtenobjekt senden , das wir in der Datenbank speichern. Speichern Sie nun diese Datei, und im Frontend müssen wir dieses G-Nachrichtenereignis behandeln, und Sie wissen bereits, welche Methode wir verwenden müssen, um das Ereignis zu behandeln oder das Ereignis abzurufen. Richtig, wir werden hier Socket Dot On schreiben. Zuerst übergeben wir den Namen des Ereignisses, Get message, und beim zweiten Argument übergeben wir die Callback-Funktion, und in diesem Callback, beim Parameter, erhalten wir diese Daten Was wollen wir mit dieser Nachricht machen? Wir möchten diese Nachricht einfach im Browser anzeigen. Für die Anzeige der Nachricht habe ich diese Funktion zum Anzeigen von Nachrichten erstellt. Rufen Sie das einfach auf und übergeben Sie die Daten darin. Diese Funktion erstellt eine Nachricht und zeigt sie in unserem Browser an. Außerdem können Sie diese Logik hier sehen, wenn Sie möchten. Speichern Sie das und lassen Sie uns diese Implementierung probieren. Stellen Sie sicher, dass Sie die Seite aktualisieren , nachdem Sie Änderungen am Frontend-Code vorgenommen haben. Andernfalls erhalten Sie diese Updates nicht. Jetzt verwenden wir einen Namen für Hurley und Nachricht für die erste Nachricht und das Senden der Nachricht Siehst du, hier bekommen wir die Nachricht innerhalb einer Sekunde oder innerhalb einer Sekunde im Frontend Um es kurz zusammenzufassen: Socket hat hauptsächlich zwei Methoden, Socket Dot M und Socket Dot On Socket Dot wird verwendet, um die Daten zu senden oder zu senden. Und wenn der Socket Dot aktiviert ist, können wir das gesendete Ereignis verarbeiten oder wir können das Ereignis sehen. Wenn Sie diese beiden Methoden verstehen, dann herzlichen Glückwunsch. Ihr 90% -Socket ist fertig. So einfach ist das. 191. Nachrichten für beide Benutzer abrufen: In der aktuellen Implementierung probieren wir es mit einem Benutzer aus. Lassen Sie uns es jetzt mit zwei Benutzern gleichzeitig probieren , als würden Haley und Mike miteinander sprechen Öffnen Sie also einen anderen privaten Tab des Browsers, oder Sie können auch einen anderen Browser verwenden und dieselbe S-DML-Datei öffnen Nehmen wir nun an, der erste Bildschirm entspricht Halley-Spezifikation und der zweite Bildschirm Sie chatten miteinander. Also hier sendet Halley eine Nachricht, und hier bekommt er diese Nachricht, aber Mike bekommt die Nachricht nicht Wie wir hier vom Backend aus eine Nachricht mit Socket senden, dass es für Halley funktioniert und nicht für Mike Der Grund liegt hier im Backend, wir verwenden Socket Dot M. Diese Methode sendet Ereignis nur an den Benutzer, der das Ereignis „Nachricht senden“ ausgibt, und aus diesem Grund erhält Halley diese Nachricht, Mike jedoch nicht Nun, was ist hier die Lösung? Weil wir unsere Nachricht haben wollen, senden wir sie auch an andere Benutzer. Einfach an der Stelle von Socket Dot werden wir diese AO-Punkt-Methode verwenden. Mit Ao Dot können wir Nachrichten an alle Benutzer senden , die mit Socket verbunden sind. Speichern Sie diese Datei und lassen Sie uns diese Implementierung probieren. Aktualisieren Sie beide Seiten. Gut. Außerdem schreiben wir hier den Benutzernamen für beide Benutzer und von der Hal aus schreiben wir eine Nachricht und senden sie. Siehst du, jetzt bekommt auch Mike diese Nachricht. Und wenn wir eine Nachricht von Mike schicken, siehst du, er bekommt sie auch. Und so funktioniert Chatten in Echtzeit. Durch die Verwendung von Socket Dot vom Backend können wir Ereignisse nur an Benutzer senden, die dieses Ereignis ausgeben. Und wenn wir ao dot verwenden, sendet unser Socket dieses Ereignis an alle Benutzer, die über Socket verbunden sind. 192. Logik für den Beitritt zum Chatraum: In der vorherigen Lektion erhalten wir bei beiden Benutzern sofort Nachrichten. Was ist, wenn wir ein weiteres Fenster hinzufügen und sehen, was passieren wird? Lassen Sie uns also ein weiteres privates Fenster hinzufügen und dieselbe HTML-Datei öffnen. Schreiben Sie jetzt hier den Benutzernamen und vom ersten Fenster aus senden wir eine Nachricht. Sehen Sie hier für beide Benutzer, wir bekommen die Nachricht. Und wenn ein anderer Benutzer eine Nachricht sendet, erhalten auch andere Benutzer diese Nachricht, was bedeutet, dass unser Socket die Nachricht an alle Benutzer sendet , die mit dem Socket verbunden sind. Es ist, als ob du eine große Party veranstaltest. Hier chatten die Leute überall ohne Räume, und aus diesem Grund würden alle Gespräche durcheinander geraten. Es ist, als würde Benutzer A mit Benutzer B sprechen, aber Benutzer C hört alles, sodass es keine private Konversation geben würde Wie lustig es ist, dass alle im ganzen Haus herumsitzen, anstatt in einem Raum leise zu reden Hier haben wir auch die gleiche Situation. Unsere aktuelle Implementierung sendet Nachrichten an alle Benutzer. Also, was ist hier die Lösung? Wir müssen Räume einrichten. Räume in Socket können dieses Problem also lösen , indem wir Benutzer zu Gruppen zusammenfassen können. Jede Gruppe oder jeder Raum ist ein privater Bereich, in dem nur Mitglieder dieses Raums Nachrichten senden und empfangen können. In einfachen Worten, Raum in Socket sind virtuelle Räume, denen Benutzer beitreten und dort leben können. Auf diese Weise können Sie Nachrichten an alle in einem Raum senden , ohne andere zu stören. Angenommen, Halley und Mike wollen miteinander chatten. Wenn Halley einen Chat öffnet, tritt Halley einem Raum bei, der einen eindeutigen Namen wie Chat HM Halley und Mike hat einen eindeutigen Namen wie Chat HM Halley Jetzt öffnet Mike die Jet-Seite, um mit Halley zu sprechen. Mike trat auch demselben Raum namens JathM bei. Jetzt sind beide Benutzer im selben Raum verbunden. Wenn Halley also eine Nachricht in diesem Raum sendet, erhält nur Mike diese Nachricht, nicht die dritte Person Ich schließe den Tab, dann hat Halley die Verbindung zur Steckdose verloren und wenn die Steckdose getrennt wird, dann entfernt Socket Punkt IO automatisch Halley aus dem Raumjet Durch diese Implementierung werden unsere Jets nicht veröffentlicht und das funktioniert auch im Gruppenchat Angenommen, Benutzer A, Benutzer B und Benutzer C sind Gruppenmitglieder und sie sind alle mit einem bestimmten Raum-Chat ABC verbunden . Jetzt sendet jeder von ihnen eine Nachricht. Andere zwei erhalten diese Nachricht, weil sie im selben Raum miteinander verbunden sind. Sie werden das richtig verstehen, wenn wir diese Funktion implementieren und ausprobieren, und das werden wir in der nächsten Lektion tun. 193. Implementieren des Beitritts zu einem Chat-Raum: Lassen Sie uns nun die Raumfunktion in unserer Inkifi-App implementieren. Aber vorher möchte ich kurz den Arbeitsablauf zusammenfassen. Wenn ein Benutzer also einen Chat öffnet, tritt er dem Raum mit seiner Chat-ID Nur Benutzer im selben Raum können die Nachrichten senden und empfangen. Und wenn der Benutzer den Chat verlässt oder schließt, entfernen wir ihn schließlich aus dem Raum. Wenn der Benutzer also zuerst einen Chat öffnet dann vom Frontend aus, sollte ein Ereignis den Call Join Room mit Chat-ID auslösen. Danach fügen wir vom Backend aus diesen Benutzer zu diesem Raum hinzu, und wenn jemand eine Nachricht sendet, senden wir diese Nachricht nur an Benutzer, die diesem Raum beigetreten sind. Hier in unserem Backend kümmern wir uns um ein anderes Ereignis, Socket Dot ist aktiviert, und welches Ereignis wir behandeln wollen, ja, es ist Join Room. Jetzt bekommen wir hier Daten, oder wir können sagen, vom Frontend, wir senden die Chat-ID, die Pfeilfunktion, und um dem Raum beizutreten, schreiben wir einfach Socket Dot Join, und hier übergeben wir den Namen des Raums, unsere Chat-ID ist , und um sicherzustellen, und hier übergeben wir den Namen des Raums, der unsere Chat-ID ist , und um sicherzustellen, dass wir auch Console Dot Login-Backticks, Benutzer Dollar Cali Brackets, Socket Dot ID, was die aktuelle eindeutige Benutzer-ID ist bereitgestellt von Socket Treten Sie der Chat-ID von Room Dollar CL Brackets bei. Im Bereich „Nachricht senden“ möchten wir nur an die Benutzer, die sich gerade in diesem Raum befinden, eine Nachricht senden . Deshalb kommentieren wir diese vorherige EIT-Methode, damit Sie sie sich später ansehen können. Und hier schreiben wir eine Ao-Punkt-MIG-Nachricht und geben hier Daten weiter. Um dieses Ereignis nur an einen separaten Raum zu senden, fügen wir hier einen Punkt zwei hinzu, und darin müssen wir den Raumnamen übergeben , den wir auf Chat-ID gesetzt haben. Jetzt ist die Frage, wie können wir die Chat-ID bekommen? Richtig, wir können die Chat-ID vom Frontend übergeben. Also Daten-Chat-ID und das war's. Wir schließen uns dem Benutzer im Raum und senden dann das Get-Message-Ereignis nur an diesen Raum. Um diese Implementierung zu testen, müssen wir nun eine andere SDML-Datei verwenden Im Testordner erhalten Sie also einen weiteren Ordner namens Romjat und darin die Datei Rojatt Außerdem verbinden wir in der JS-Datei zuerst den Benutzer mit dem Socket und fragen dann in der Eingabeaufforderung nach Nachdem wir den Raumnamen erhalten haben, senden wir dieses Join-Room-Event. Dies hilft uns, einem Raum beizutreten, und dann ist der Rest des Frontend-Codes derselbe wie zuvor. Nur beim Ereignis „Nachricht senden“ senden wir auch die Jet-ID, senden wir auch die Jet-ID da wir sie für das Senden der Nachricht benötigen. Lassen Sie uns nun diese Datei ausführen. Grabe diese Datei und öffne sie in deinem Browser. Zunächst wird nach dem Raumnamen gefragt. Hier, zur Verkostung, geben wir jede zufällige Jet-ID weiter. Nehmen wir an, der Chat unterstreicht eins, zwei, drei. Okay. Benutze beim Schreiben einen Namen. Ohne ihn könnten wir einen Fehler bekommen. Schreiben Sie, verwenden Sie einen Namen, und wenn wir in unserem Backend die Konsole öffnen, sehen wir hier, dass der Benutzer verbunden ist, und dann die Benutzer-Socket-ID, Raum beitreten, und hier erhalten wir unseren Raumnamen, Chat, Unterstrich, eins, zwei, drei Großartig. Lassen Sie uns jetzt einen weiteren Tab öffnen und dasselbe tun. Schreiben Sie hier den Raumnamen, chatten Sie, unterstreichen Sie eins , zwei, drei, weil wir demselben Raum beitreten möchten Jetzt schreiben wir hier den Benutzernamen. Und dann schreibe eine Nachricht und sende sie. Siehst du, für beide Benutzer erhalten wir diese Nachricht, also funktioniert sie ziemlich gut. Öffnen wir nun ein weiteres Fenster und treten einem anderen Raum bei. Lass uns chatten, Unterstriche 45, sechs. Gut. Wenn wir nun eine Nachricht von diesem Benutzer senden, erhalten diese beiden Benutzer diese Nachricht nicht. Und wenn einer dieser beiden Benutzer dieselbe Nachricht sendet, erhält dieser dritte Benutzer diese Nachricht nicht. Das funktioniert also auch. So einfach ist es also, einem Raum beizutreten und Nachrichten an diese Räume zu senden. Wie ich Ihnen bereits gesagt habe, ist Socket sehr einfach. Du musst nur die Logik verstehen. 194. Übung - Eingabeinzeiger: Jetzt ist es Zeit für eine kleine Übung in der Steckdose. In dieser Übung müssen Sie den Tippindikator anzeigen, wenn jemand die Nachricht eingibt, implementieren . Die Logik ist, dass wir, wenn Benutzer mit der Eingabe beginnen, eine Socket-Ereigniseingabe auslösen. Und vom Backend aus senden wir Daten, wer tippt und in welchem Raum er oder sie tippt. Nachdem wir das als Bonus implementiert haben, lösen wir, wenn unser Benutzer 2 Sekunden lang nicht tippt, wenn unser Benutzer 2 Sekunden lang nicht tippt, ein weiteres Ereignis namens Stopp Typing aus, wodurch einfach die Tippanzeige vom Frontend entfernt wird . Machen Sie sich keine Sorgen, wenn Sie nichts über Frontend-Code wissen, schreiben Sie einfach Code für das Backend, behandeln Sie das Ereignis und senden Sie Benutzer die Eingabe oder eine Nachricht Im Frontend habe ich auch Code hinzugefügt, funktioniert , wenn wir etwas in das Eingabefeld schreiben Außerdem habe ich Befehle hinzugefügt , bei denen Sie die Ereignisse ausgeben müssen und auch den Code , den Sie schreiben müssen, wenn Sie diese Ereignisse behandeln. Das Ziel dieser Übung ist es, dass Sie in Bezug auf Ereignisse denken. Versuchen Sie also, es zu implementieren und was ist dann die Lösung. Sehen wir uns nun die Lösung dieser Übung an. Zuallererst müssen wir uns in unserem Backend um Ereignisse kümmern, sagen wir, um das Tippen. Also Socket Dot beim Tippen. Und vom Frontend senden wir ein Objekt mit Jet-ID und Benutzername. So können wir es hier destrukturieren und die Jet-ID abrufen Außerdem erhalten wir den Benutzernamen und die Pfeilfunktion Und hier senden wir diese Nachricht an andere Benutzer, die sich im selben Raum befinden Also an Punkt zwei übergeben wir hier die Chat-ID und danach, Punkt, zeigen wir das Tippen an. Und hier geben wir eine Nachricht in BTI Dollar weiter, der Benutzername tippt Und das ist es. müssen wir auch das Ereignis behandeln, aufhören zu tippen, also Socket Dot an, aufhören zu tippen. Und hier bekommen wir auch ein Objekt mit Chat-ID und Benutzername. Und in der Fehlerfunktion wir einfach auf den Chatd-Punkt m, Hide Typing Hier übergeben wir den Benutzernamen, aufhört zu tippen, und das war's Wir brauchen nichts anderes im Backend. Wenn Sie sich in dieser Übung nicht sicher sind, was das Front-End angeht, dann machen Sie sich darüber keine Gedanken Ich habe gerade das Frontend zur Verkostung hinzugefügt. Sie können diesen Verkostungsteil auch überspringen, sobald Sie wissen, wie man Socket-Logik und Ereignisse schreibt. Sehen wir uns nun schnell diesen Teil der Verkostung an. Wie ich Ihnen in der vorherigen Lektion gesagt habe, habe ich hier unten diesen Code hinzugefügt , der ausgeführt wird, wenn wir etwas in dieses Eingabefeld schreiben. Wenn hier der Eingabewert nicht leer ist, machen wir nur dann den Socket-Punkt m und welches Ereignis wir ausgeben, senden wir das Typing-Ereignis, und an der zweiten Position fügen wir ein Objekt mit der Chat-ID zur Chat-ID hinzu, und dann senden wir auch den Benutzernamen an den Benutzerwert. In diesem Tipp-Timeout, das alle 2 Sekunden abläuft, wenn wir etwas in das Eingabefeld schreiben und der Benutzer zwei Sekunden lang das alle 2 Sekunden abläuft , wenn wir etwas in das Eingabefeld schreiben das Eingabefeld nichts geschrieben hat, senden wir ein weiteres Ereignis namens Stopp Typing. Hier duplizieren wir diese Emit-Methode und übergeben sie hier und ändern dieses Ereignis so, dass die Eingabe beendet wird. Außerhalb dieses Event-Listeners müssen wir zwei Ereignisse verarbeiten , die wir vom Backend ausgeben Socket Dot an, Tippanzeige. Hier übergeben wir die Callback-Funktion und hier erhalten wir die Nachricht, Benutzer diese Pfeilfunktion eingibt, unser Frontend schreibt seine Logik Im Moment fügen wir hier einfach diese Logik hinzu, die ich unten mit dem Befehl hinzugefügt habe Danach fügen wir einen weiteren Socket-Punkt hinzu. Hör auf hier zu tippen, auch Callback-Funktion. Hier können wir einen Namen verwenden, wenn Sie ihn verwenden möchten. Und hier setzen wir diese zweite Logik ein, um mit dem Tippen aufzuhören. Speichern Sie die Änderungen und werfen Sie einen Blick darauf, aktualisieren Sie die Seite, geben Sie Chat, ID, Chat ein, unterstreichen Sie eins, zwei, drei und schreiben Sie Verwenden Sie einen Namen, Ali Jetzt in einem anderen Fenster aktualisieren wir auch die Seite. Geben Sie Chat, D, Chat ein, unterstreichen Sie eins, zwei, drei und wir schreiben Verwenden Sie einen Namen für das Mikrofon Lass uns jetzt etwas von Mike schreiben. Hier findest du Hallo, wir bekommen gerade die Tippnachricht. Mike tippt. Aber hier können wir sehen, dass Mike wird, Mike tippt. Das ist es, was wir wollen. Wir wollen, dass unser Backend nur Show-Typing-Ereignisse an Benutzer sendet , die sich im Chatroom befinden, aber nicht an den Absender. Dafür müssen wir hier an der Stelle von Ao Punkt Zwei Socket Dot Two und hier Socket Dot Two, das erste Tipp-Event, ausführen hier Socket Dot Two, das erste Tipp-Event, Ich werde dir das in nur einer Sekunde erklären, die Änderungen ansehen und lass es uns noch einmal testen Aktualisiere die Seite, schreibe Jet ID, um zu chatten , unterstreiche eins, zwei, drei und schreibe einen Benutzernamen, Harley Und auch für Mike aktualisieren wir die Seite. Geben Sie die Jet-ID ein, um zu chatten, unterstreichen Sie eins , zwei, drei und schreiben Sie den Benutzernamen Mike Geben Sie jetzt etwas ein, sehen Sie nur Harley Mike dazu bringt, zu tippen, und nach 2 Sekunden ist diese Nachricht immer noch da und nach 2 Sekunden ist diese Nachricht immer noch Lass mich das Ereignis überprüfen. Wir kümmern uns hier darum, nicht mehr vom Frontend aus zu tippen und welches Ereignis wir vom Backend ausgeben. Oh, das ist High-Typing. In unserem Frontend ändern wir dieses Ereignis, um das Tippen zu verbergen. Speichern Sie die Änderungen und lassen Sie uns sie noch einmal testen. Aktualisiere die Seite. Schreiben Sie die Chat-ID, um den Chat um eins, zwei, drei zu unterstreichen, und verwenden Sie hier einen Namen Also für Mike unterdrücken wir die Seite, geben die Chat-ID ein, um den Chat zu unterstreichen, unterstreichen wir eins, zwei, drei und verwenden genau hier einen Namen Schreiben Sie jetzt eine Nachricht von hier aus und wenn Sie für 2 Sekunden anhalten, ist diese Nachricht weg Also das funktioniert gut. Also hier ist eine Kleinigkeit. Mal sehen, wann wir die Nachricht schicken, dann bekommen wir für eine Weile, dass Mike tippt. Das wollen wir nicht. Deshalb geben wir beim Senden der Nachricht auch ein Stop-Typing-Ereignis aus. Kopieren Sie also diesen Socket-Punkt m für Stop typing und fügen Sie ihn am Ende unseres Formulars ein. Speichern Sie die Zutaten und lassen Sie mich es noch einmal probieren. Aktualisiere die Seite, gib die Chat-ID und den Namen ein. Außerdem machen wir das Gleiche, schreiben Chat-ID und Namen Jetzt schreiben wir ihre Nachricht und senden sie. Siehst du, jetzt kriegen wir das nicht mehr hin. Es gibt vier Varianten von Methoden: Socket ao dot, socket dot I ao dot two room dot M und socket dot two room dot m. Lassen Sie mich Ihnen jede Methode in einfachen Worten erklären. Also Ao zeigt das Tippen. Dadurch wird an alle verbundenen Benutzer ein Show-Typing-Event gesendet, unabhängig davon, ob sie einem Raum beitreten oder nicht. Es wird ein Show-Typing-Ereignis an alle Benutzer gesendet , die mit dem Socket verbunden sind. Als nächstes haben wir Socket Dot M, Show Typing. Dadurch wird das Ereignis „Texteingabe anzeigen“ nur an den Absender gesendet. Als Nächstes haben wir Punkt zwei, Raum Punkt zwei, Punkt zeigt Tippen an. Dadurch wird ein Show-Typing-Event an alle Benutzer gesendet , die diesem Raum beitreten, einschließlich des Absenders. In unserem Fall sind sie beide Halley und Mic. Aus diesem Grund haben wir zuvor für beide Benutzer ein Show-Typing-Ereignis Endlich haben wir Socket Dot Two Room Dot Show Typing. Dadurch wird an alle Benutzer, die diesem Raum beitreten, außer an den Absender, ein Show-Typing-Ereignis gesendet . Hal gerade tippt, erhält Haley dieses Show-Typing-Event nicht Das ist der grundlegende Unterschied zwischen diesen Methoden. Wir können sie nach unseren Bedürfnissen verwenden. Es gibt keine Regeln, nur dieses oder jenes zu verwenden. Wir werden das verwenden, was für unsere Logik am besten geeignet ist. 195. Anwenden des echten Sende-Nachrichtencodes: derzeit in unserer Anwendung Wenn der Benutzer derzeit in unserer Anwendung eine Nachricht sendet, senden wir diese Nachricht einfach an alle Benutzer, die in diesem Chatroom Mitglied sind. In der realen Welt müssen wir diese Nachrichten jedoch auch in unserer Datenbank speichern. Selbst wenn der Benutzer den Raum verlassen hat, kann er diese neuen Nachrichten und auch den Verlauf der Nachrichten sehen . Speichern wir unsere Nachricht in der Datenbank. Zuallererst möchte ich eines klarstellen. Wenn wir vom Frontend aus eine Nachricht senden, muss bereits ein Chat zwischen Benutzern erstellt worden sein. Zum Beispiel, wenn Hurley Nachrichten an Mäuse senden möchte und diese noch nie miteinander gechattet haben, was bedeutet, dass kein Chat zwischen ihnen erstellt wird In diesem Fall rufen wir, wenn Harley die erste Nachricht sendet, eine separate API auf, bei der es sich um unsere Create-Chat-API handelt Wenn Harley eine ID hat, geben wir ein Sende-Nachrichten-Ereignis mit der Das wissen wir schon, oder? Denken Sie daran, dass wir zu Beginn dieses Abschnitts die API zum Senden von Nachrichten erstellt haben. Ja, wir benötigen dieselbe Logik hier für das Ereignis „Nachricht senden“. Also lasst uns diesen Code kopieren. Und in unserem Event „Nachricht senden fügen wir ihn einfach hier ein. Jetzt müssen wir zunächst diese Callback-Funktion asynchron machen diese Callback-Funktion asynchron Gut. Jetzt erhalten wir hier die Chat-ID und den Inhalt aus dem Anfragetext. Aber in Socket haben wir keinen Anforderungstext, also müssen wir die Chat-ID und den Inhalt aus dem Funktionsparameter abrufen . Also hier destrukturieren wir diese Daten und bekommen hier die Chat-ID und den Inhalt Also, was brauchen wir noch? Richtig, wir brauchen auch eine Benutzer-ID, also bekommen wir sie auch in diesen Daten. Und jetzt brauchen wir diese Zeile nicht. Außerdem senden wir unten Daten in der Antwort. Aber wie wir wissen, erhalten wir im Socket keine Antwort, erhalten wir im Socket keine Antwort, also können wir das einfach entfernen und aus dem Socket an der Stelle, an der sich die Daten befinden, senden wir diese Auffüllungsnachricht Wie im Punkt Zwei geben wir nur die Chat-ID an der Stelle des Datenpunkts Jet ID Lassen Sie uns nun auch überprüfen, wo wir unsere Antwort verwenden. Ja, im Rückgabefehler, und auch hier verwenden wir Antwort. An der Stelle, an der ein Fehler durch eine Antwort gesendet wird, können wir hier eine Fehlermeldung über ein Socket-Ereignis senden. Aber die Frage ist, an wen wir diese Fehlermeldung senden wollen? Sollen wir es an alle Benutzer senden, die in diesem Raum aktiv sind? Nein, wir möchten diese Fehlermeldung nur an den Absender senden und mir sagen, welche Socket-Methode wir verwenden, um das Ereignis nur an den aktuellen Benutzer zu senden. Richtig, wir verwenden Socket Dot M. Lassen Sie uns das Ereignis mit dem Namen error in send message senden, und wir senden einfach die Fehlermeldung access denied. Nun, hier läuft unser unterster Code immer noch. Um die Ausführung zu beenden, können wir einfach hier hinzufügen und zurückkehren. Hier geben wir auch dieselbe Error Event Engine diese Nachricht zu dieser Nachricht aus. Text der Inhaltsnachricht ist ein Master erforderlich. Danach fügen wir einfach return hinzu, wodurch unser Code Rest des Codes nicht mehr ausführen kann. Lassen Sie uns auch diesen Code entfernen. Jetzt kann unser Frontend dieses Fehlerereignis nach Belieben behandeln , unabhängig davon, ob es Alert oder Toast-Benachrichtigungen anzeigt Also hier müssen wir diese Chat- und Nachrichtenmodelle importieren. Ganz oben, vor diesen Routen, fügen wir die Kosten hinzu, Chat entspricht Modellen mit erforderlichem Zeitraum, Schrägstrich-Chats und eine weitere Kostennachricht entspricht Modellen mit erforderlichem Zeitraum, Schrägstrichnachrichten und fertig Speichern Sie die Änderungen und lassen Sie uns diese Implementierung probieren. Im Frontend, der Roomchat-Punktdatei, können wir einchecken wir die Daten senden oder nicht Ja, zunächst müssen wir hier am Ort des Absenders die Benutzer-ID senden Im Moment fügen wir hier den Punktwert für den Benutzernamen hinzu. Bei unserer Eingabe des Benutzernamens müssen wir also die Benutzer-ID übergeben. Danach der Inhalt zum Eingabewert. Hier brauchen wir nicht, dass das Objekt am und mit dem Status erstellt wurde da es automatisch von Mangos generiert wird , und das war's Speichern Sie das und lassen Sie uns die Seite umformulieren. Hier benötigen wir die Jet-ID, also kopieren wir die Jet-ID vom Mongo D, an dem wir vorbeikommen, und fügen Jetzt müssen wir hier die Benutzer-ID an die Stelle des Benutzernamens schreiben , weil wir die Benutzer-ID in diesem Fall als Punktwert für den Benutzernamen festlegen Wir kopieren eine Benutzer-ID aus der Mongo Divi Compass-Benutzersammlung und fügen sie hier als Absender ein. Schreiben Sie jetzt eine Nachricht Nehmen wir an, Socket ist einfach. Siehst du, wir bekommen die Nachricht und wenn wir in unserer Datenbank nachschauen und am Ende diese neue Nachricht auch steht, funktioniert unser Nachrichtensende-Event einwandfrei. 196. Benutzer im Socket authentifizieren: Derzeit in unserer Implementierung erhalten wir die aktuelle Benutzer-ID vom Frontend In der realen Welt können wir die Benutzer-ID jedoch nicht direkt vom Frontend abrufen . Offensichtlich aus Sicherheitsgründen, da jeder jede Benutzer-ID nehmen und die Nachricht senden kann. Also müssen wir es etwas sicherer machen. Und dafür werden wir Socket-Middleware verwenden. Es ist das gleiche Konzept, bei dem wir Middleware in unseren APIs anwenden Da unsere Nord-Middleware vor jeder Anfrage ausgeführt wird, wird der Callback genauso ausgeführt wie die Socket-Middleware, bevor unser Client eine Verbindung zum Socket herstellt. Lass es mich dir praktisch zeigen. Hier vor dieser Ao-Dot-On-Methode definieren wir unsere Socket-Middleware mit Ao Punkt U. In dieser Methode übergeben wir nun die Callback-Funktion, die ausgeführt wird, bevor unser Benutzer eine Verbindung zum Socket herstellt Im Moment fügen wir hier einfach das Console Dot Log hinzu , das Socket-Middleware ausführt Speichern Sie die Änderungen und lassen Sie uns unser Frontend aktualisieren. Hier Chat, ID, Chat unterstreichen eins, zwei, drei. Wenn wir nun unser Backend-Terminal überprüfen, sehen Sie , hier starten wir zuerst Socket-Middleware. Aber was ist das? Wir stellen keine Verbindung zu einem Benutzer her. Also hier in unserer Socket-Middleware hört unser Code Wir müssen es in die nächste Funktion verschieben, genauso wie wir es in unserer Express- oder Middleware getan haben In dieser Callback-Funktion an erster Stelle ein Socket-Objekt, erhalten wir an erster Stelle ein Socket-Objekt, das verwendet wird , um Informationen über diesen Socket abzurufen Und beim zweiten Parameter erhalten wir next, was genauso funktioniert wie die Funktion next in Express-Middleware Jetzt, nach dieser Konsole, rufen wir einfach diese nächste Speichern Sie die Änderungen und drücken Sie die Seite erneut. Geben Sie hier die Jet-ID ein, und jetzt starten wir in unserem Terminal C zuerst die Socket-Middleware und dann stellen wir Dadurch ist klar, dass die Socket-Middleware läuft bevor unser Client eine Verbindung In dieser Socket-Middleware können wir nun die Benutzerauthentifizierung durchführen, und wie können Wir haben es schon einmal in unserer Auth-Middleware gemacht. Richtig. Für die Authentifizierung verwenden wir JWT In dieser Middleware überprüfen wir also, ob der Benutzer das JWT-Token übergeben Es ist gültig oder nicht. Wenn es gültig ist, kann der Benutzer nur dann eine Verbindung zum Socket herstellen. Und wenn das Token nicht gültig ist, werden wir keinen Benutzer zulassen, da wir für Jet einen angemeldeten Benutzer benötigen. Jetzt fragen Sie sich vielleicht, wie wir Token in dieser Middleware-Funktion erhalten können Token in dieser Middleware-Funktion Also hier werden wir das Socket-Objekt verwenden. Das Const-Token entspricht also dem Socket Dot Hensig. Hier erhalten wir Daten, die wir mit unserer Socket-Verbindung weitergeben Wir planen, Daten in das Objekt OT zu bekommen und darin ein Token zu übergeben. Hier schreiben wir Socket Dot Hength Dot Token. Danach übergeben wir einfach die Bedingung hier. Was tun wir dann, wenn das Token nicht verfügbar ist? Wir lehnen die Verbindung einfach ab. die Verbindung abzulehnen, geben wir hier die nächste Funktion zurück, und darin müssen wir einen neuen Fehler eingeben Hier übergeben wir die Fehlermeldung an den Authentifizierungsfehler, Token erforderlich Was ist nun, wenn der Benutzer das Token weitergibt? Wir verifizieren einfach dieses Token und dafür benötigen wir JWT Bei den höchsten Kosten entspricht JWT also dem erforderlichen JSON-Webtoken Gut. Jetzt fügen wir in der Datenbank JWT Dot Verify Beim ersten Argument übergeben wir das Token und beim zweiten Argument übergeben wir unseren geheimen Schlüsselprozess mit dem Punkt Env Punkt JWT Lassen Sie mich diesen Variablennamen noch einmal überprüfen. Ja, es ist der JWT-Schlüssel. Wenn dieses Token nun erfolgreich verifiziert wurde, gelangen wir hier zu Benutzerdaten, die wir mit dem Token übergeben Wir speichern es in einer Variablen namens user, und dann können wir einfach sagen, dass der Socket Dot user diesem Benutzer entspricht Außerdem möchte ich Sie wissen lassen, dass das Socket-Objekt für alle Benutzer unterschiedlich ist. Wenn unser Benutzer also eine Verbindung zum Socket herstellt, weist unser Socket ihm dieses Objekt zu, und aus diesem Grund ist es für alle Benutzer individuell. Dieser Socket-Benutzer hat die Daten unserer aktuell angemeldeten Benutzer. Um das zu sehen, konsolen wir einfach Dot Log, Socket User und Adher-Socket Dot User und dann haben wir die nächste Funktion. Was ist nun, wenn dieses Token nicht verifiziert wurde? Wir müssen uns auch mit diesem Fall befassen. Hier fügen wir also Try und Cache Blog hinzu und verschieben diese vier Zeilen einfach in den Try-Blog. Wenn also in diesen vier Zeilen etwas schief geht, wird unsere Cache-Methode ausgeführt. Also, was wir im Cache richtig machen, lehnen wir die Verbindung einfach ab. Kopieren wir also die nächste Funktion mit dem Fehler und fügen sie hier ein. Außerdem müssen wir in unserem aktuellen Tasting-Frontend die Socket-Dot-Benutzerdaten vom Backend senden . Also füge ich hier einfach ein Socket-Dot-Benutzerdaten-Ereignis und wir übergeben einfach den Socket-Dot-Benutzer. Durch dieses Ereignis erhält unser Frontend die Daten der angemeldeten Benutzer. Andernfalls müssen wir Benutzer-ID für die Verkostung manuell eingeben. Lassen Sie uns nun diese Implementierung vornehmen. Dafür müssen wir unsere endgültige Testdatei ausführen. Ehrlich gesagt ist dies die letzte Testdatei. Mach dir keine Sorgen. In unserem Frontend-Ordner finden wir den Ordner Final Testing. Und hier müssen wir, wie wir wissen, diese SDML-Datei ausführen Aber vorher wollen wir sehen, was ich in der JavaScript-Datei gemacht habe Zunächst frage ich nach einem Token, in das wir das Jason Web Token eingeben müssen. Wenn wir ein Token eingeben, verbinden wir nur den Benutzer mit dem Socket. Aber warte in diesem Zusammenhang, was ich getan habe, ich füge hier ein Objekt hinzu, das wir an den Socket senden, und in diesem Objekt übergeben wir OT und auch Token an unser Token. Dieses Objekt bekommen wir in unserem Backend im Socket Dot Hang Dot the Dot Tgon Wenn dieses Token nun verifiziert ist, unsere Verbindung erfolgreich Und wenn dieses Token nicht verifiziert ist oder abgelaufen ist, wird im Socket-Punkt bei Connect-Fehler der Socket-Middleware-Fehler Und wenn wir ein Benutzerdaten-Ereignis erhalten, setze ich diese Daten einfach in diese Benutzervariable Außerdem haben wir den gesamten Code, der sich auf den Socket bezieht , hier in dieser IF-Bedingung hinzugefügt. Mal sehen, ob es funktioniert oder nicht. Öffnen Sie also diese SDML-Datei im Browser und schließen Sie die Tabs. Jetzt wird zunächst nach einem Token gefragt. Lassen Sie uns hier eins, zwei, drei weitergeben, und wie wir wissen, wird dieses Token von unserem Backend nicht verifiziert. Mal sehen, was wir bekommen. Schlag auf Okay. Sehen Sie hier, wir erhalten einen Authentifizierungsfehler, Token erforderlich. Öffnen Sie Postman und öffnen Sie einfach die Login-API und senden Sie die Anfrage und holen Sie sich das Token Kopieren Sie das und fügen Sie es einfach in unsere SDML-Datei ein. Siehst du, wir bekommen den Fehler nicht, und wenn wir unser Bend-Terminal überprüfen, bekommen wir hier Socket User zu unseren Benutzerdetails mit ID und Benutzername und wir bekommen auch einen Benutzer verbunden, was bedeutet, dass unsere Middleware ziemlich gut funktioniert Jetzt verwenden wir diesen Socket-Dot-Benutzer in unserem Socket-Event. Sie im Ereignis „Nachricht senden Entfernen Sie im Ereignis „Nachricht senden“ diese Benutzer-ID aus dem Parameter, und oben fügen wir hinzu, dass die Cost-Benutzer-ID dem Socket-Punkt-Benutzer entspricht , und eine Score-ID. Stellen Sie sicher, dass Sie den Eigenschaftsnamen der ID überprüfen, und auch beim Tippvorgang an der Stelle , an der der Benutzername vom Frontend abgerufen wird, können wir hier Socket-Punkt-Benutzer, Punkt-Benutzername übergeben, und dasselbe tun wir auch bei dem Ereignis Stopp Typing, Socket-Dot-Benutzer, Punkt-Benutzername. Außerdem entfernen wir jetzt den Benutzernamenparameter für beide Ereignisse. Lassen Sie uns nun noch einmal diese Sendenachricht probieren. Drücken Sie also die Seite und legen Sie das Token als Basis fest. Jetzt brauchen wir hier die Chat-ID, also kopiere sie auch aus dem MongoIvcmPass Und füge es in die Chat-ID ein und klicke auf Join Room. Ohne dem Raum beizutreten, können wir keine Nachricht senden. Wenn wir die Nachricht nun von hier aus senden, nehmen wir an, das ist die letzte Verkostungsnachricht. Siehst du, hier bekommen wir die neue Nachricht, und wenn wir unser Backend überprüfen, dann wird sie auch in der Datenbank mit den richtigen Benutzerdaten gespeichert . Um es kurz zusammenzufassen Wir sollten Benutzerdaten nicht direkt vom Frontend abrufen . Wird nicht sicher sein Also erstellen wir diese Socket-Middleware und fragen nach JWT-Token, bevor wir den Benutzer mit unserem Socket verbinden Danach überprüfen wir das Token und legen die Token-Daten einfach im Socket-Punkt-Benutzer Also hier können wir diesen Socket-Dot-Benutzer in unserer gesamten Socket-Logik verwenden . Wie wir wissen, ist der Socket-Dot-Benutzer auch für alle Socket-Benutzer individuell. So wenden wir unseren Socket mit JSON Web Token an und sichern ihn. Da unsere bisherigen Konzepte klar sind, ist es wirklich einfach, fortgeschrittene Themen wie die Socket-Middleware zu verstehen fortgeschrittene Themen wie die Socket-Middleware Und deshalb erkläre ich Socket Schritt für Schritt, damit Sie es richtig verstehen können 197. Markieren von Benutzern als Online und Offline: Woher weißt du, dass wir in vielen Chat-Anwendungen die Markierung „Benutzer aktiv“ oder „online“ erhalten. Denken Sie, wie sie diese Funktion anwenden? Sie sich in dieser Lektion keine Sorgen, wir werden Benutzer als online und offline markieren. Zuallererst, was denkst du, wenn ein Benutzer online ist? Denken Sie in der menschlichen Sprache darüber nach. Unser Benutzer ist online, wenn er sich mit dem Socket verbindet, und wenn der Benutzer offline ist, schreiben Sie, wann der Benutzer Ihre Anwendung verlassen hat, oder wir können sagen Verbindung zum Socket getrennt hat, so einfach ist das Hier vor diesen IO-Methoden deklarieren wir eine neue variable Kostenoption, bei der Online-Benutzer neuen Karte gleichgestellt Nun fragen sich einige von Ihnen vielleicht, was ist das für eine Karte? Map ist eine erweiterte Version unseres Objekts. Es ist auch eine Sammlung des Schlüssel-Wert-Paares. Die Karte hat mehr Funktionen als ein Objekt. Wie wir also wissen, ist bei Objekten der Schlüssel der Frühling. Als Wert können wir ihn auf jeden beliebigen Wert setzen. Aber in Map können wir alles Mögliche setzen: Zeichenfolge, Zahl, Bullion, Objekt, Array, Funktion, jeder Typ kann der Schlüssel sein Kurz gesagt, bei häufigen Entfernern von Hinzufügungen ist Map generell effizienter als die Verwendung von Objekten Es wurde entwickelt, um Schlüsselwertpaare effizienter zu handhaben Schlüsselwertpaare effizienter In dieser Map können wir bei jedem Beitritt eines Benutzers diese Benutzer-ID als Schlüssel und ihre Socket-Punkt-ID als Wert hinzufügen . Also schreiben wir hier in den IO-Punkt bei der Verbindung einfach den Punktwert der Online-Benutzer. Beim ersten Argument übergeben wir die Socket Dot User Dot Score-ID, was der Schlüssel ist, beim zweiten Argument übergeben wir die Socket-Punkt-ID, was unser Wert ist. Jetzt müssen wir nur noch den Benutzer entfernen , wenn seine Verbindung unterbrochen wird, was einfach bedeutet, dass dieser Benutzer offline ist. Ganz unten fügen wir also Socket Dot On hinzu. Hier übergeben wir Disconnect und dann die Callback-Funktion Die Disconnect-Methode wird ausgeführt, wenn die Socket-Verbindung des Benutzers bestehen bleibt. Zu diesem Zeitpunkt wird diese Methode zum Trennen automatisch ausgeführt. Wenn der Benutzer den Browser-Tab schließt, wird auch diese Methode zum Trennen automatisch ausgeführt. Wir müssen uns also keine Gedanken über eine Methode zum Trennen der Verbindung vom Frontend machen. Hier fügen wir einfach Online-Benutzer hinzu, Punkt löschen, Socket Punkt, Benutzerpunkt, Unterstrich-ID, was die aktuelle Benutzer-ID ist In der Übersicht können wir die Methode set and delete direkt verwenden, um Schlüsselwertpaare hinzuzufügen und zu entfernen Nun wollen wir sehen, ob es funktioniert oder nicht. Also halten wir uns einfach an Console Dot Log, Online-Benutzer und halten Online-Benutzer ein. Kopieren wir also diese Konsole und fügen sie ein , wenn wir Benutzer zu dieser Map hinzufügen. Lass uns das jetzt probieren. Also p die SDML-Datei in der neuen Registerkarte, füge hier dein Token Und wenn wir unser Bend-Terminal überprüfen, können wir hier den Schlüssel des Online-Benutzers zur Benutzer-ID und die Socket-ID als Wert sehen Online-Benutzers zur Benutzer-ID und die Socket-ID als Wert Und wenn wir unseren Tab schließen, können wir hier sehen, dass unser Online-Benutzer leer ist. Es ist also einfach. Sie können diese Online-Benutzer an Ihr Frontend schicken und ihnen Indikatoren als grünen Punkt oder etwas anderes anzeigen lassen. 198. Mehrere Sockel für Einzelbenutzer: Hier ist eine Sache in unserer aktuellen Implementierung. Wie wir wissen, wird unsere Anwendung im Browser verwendet oder unser Backend kann in Apps verwendet werden Wenn unser Benutzer über einen Tab eine Verbindung hergestellt hat, Benutzer-ID und Socket-ID werden Benutzer-ID und Socket-ID zu den Online-Benutzern hinzugefügt Wenn er nun einen neuen Tab öffnet und eine Verbindung zu Socket herstellt, erhalten wir bei unseren Online-Benutzern einen weiteren Schlüssel als Benutzer-ID. Aber hier sind der vorherige Schlüssel und der aktuelle Schlüssel identisch, aus diesem Grund wird diese Socket-ID durch die neue Socket-ID ersetzt. Stellen Sie sich nun vor, er schließt nur den zweiten Tab. Außerdem wird dieser Benutzerschlüsselwert entfernt und unser Benutzer als offline markiert. Aber hier ist er immer noch online. Er ist immer noch online im ersten Tab. Also hier müssen wir dieses Problem mit der Vervielfältigung lösen. Also, was ist hier die Lösung? Wir können die Benutzer-ID wie zuvor als Schlüssel hinzufügen. Aber an der Stelle, an der die Socket-ID direkt gesetzt wird, können wir ein Array oder einen Satz von Socket-IDs hinzufügen, was bedeutet, dass zwei Tabs zwei Socket-IDs haben. Wir haben beide in diesem Array, und wenn der Benutzer nur einen Tab schließt, können wir nur diese bestimmte Socket-ID aus dem Array entfernen . Sie können sehen, wie weit wir fortgeschritten sind. War nur ein Scherz. Lassen Sie uns das in unserer Anwendung implementieren Zuallererst fügen wir hinzu, dass die Cost-Benutzer-ID der Socket-Punkt-Benutzerpunkt-Underscore-ID entspricht Socket-Punkt-Benutzerpunkt-Underscore-ID Jetzt haben wir hier im Punkte-Set für Online-Benutzer zuerst die Benutzer-ID und an zweiter Stelle als Wert übergeben wir New Set Sie fragen sich vielleicht, was gesetzt ist. Set ist die erweiterte Version von Arrays. Mach dir keine Sorgen. Sie sind wirklich einfach. Der Grund, warum wir hier set an der Stelle des Arrays verwenden, ist , dass wir dem Socket auf einfache Weise Socket-IDs hinzufügen und daraus entfernen können . Diese Zeile bedeutet, dass wir bei Online-Benutzern ein neues Schlüsselwertpaar erstellen . Schlüssel ist die Benutzer-ID, und es wird ein Wert festgelegt, der leer ist. Hier möchten wir ein neues Schlüssel-Wert-Paar erstellen, falls unsere Benutzer-ID noch nicht für Online-Benutzer verfügbar ist. Also hier bestehen wir die Bedingung. Wenn Online-Benutzer eine Benutzer-ID haben und diese falsch ist, übergeben wir Ausrufezeichen Mg. Erst dann erstellen wir ein neues Schlüssel-Wert-Paar Also verschiebe diese Zeile hierher. wollen wir nun tun, nachdem wir ein neues Paar hinzugefügt oder auch wenn die Benutzer-ID bereits verfügbar ist Was wollen wir nun tun, nachdem wir ein neues Paar hinzugefügt haben oder auch wenn die Benutzer-ID bereits verfügbar ist? Richtig, wir wollen dem Wert einfach die Socket-Punkt-ID hinzufügen. Also schreiben wir Online-Nutzern Punkt G, was wollen wir bekommen? Schreiben Sie UserID als Schlüssel, und um einen Wert in der Menge hinzuzufügen, verwenden wir die Methode Dot Add und übergeben hier die Socket-Punkt-ID Und mit dieser Zeile fügen wir Satz einen Socket-Punkt-ID-Wert wobei der Schlüssel die Benutzer-ID ist, so einfach Also hier an der Stelle der Socket-Punkt-Benutzerpunkt-Unterstrich-ID übergeben wir die Benutzer-ID Jetzt, wo die Verbindung unterbrochen wird, wollen wir die aktuelle Socket-ID entfernen Online-Benutzer erhalten also keine Benutzer-ID, Punkt Dili, Socket-Punkt-ID. Dadurch wird die Socket-Punkt-ID aus dem Satz entfernt, bei dem der Schlüssel die Benutzer-ID ist Was ist nun, wenn unser Benutzer keine Socket-ID im Wert hat? In diesem Fall möchten wir auch die Benutzer-ID als Paar entfernen. Auf diese Weise können wir unseren Benutzer als offline markieren. Wir erfüllen also Ihre Bedingung, wenn Online-Benutzer den Punkt GET userid punktgroß gleich Null Dann machen wir einfach Online-Nutzer mit dem Punkt „BenutzerID erweitern“. Wie Sie sehen können, können wir ganz einfach Artikel hinzufügen und daraus entfernen Anstatt ein Array zu verwenden , in dem wir den Index dieses Elements finden und dieses Element dann entfernen müssen, können wir einfach Elemente zum Set hinzufügen und daraus entfernen. Mal sehen, ob es funktioniert oder nicht. Also drücke die Seite, Seite hier, unser Token Jetzt erhalten wir im Terminal eine Map, die einen Schlüsselwert, eine Benutzer-ID und einen Socket hat Benutzer-ID und einen Socket Jetzt öffnen wir im Browser einen weiteren Tab. Hier öffnen wir unsere DML-Datei und lassen mich erneut dasselbe Token einfügen Gut, und lass uns das Terminal überprüfen. Sehen Sie hier, wir haben eine Benutzer-ID und sie hat zwei Werte, was unser Satz von Socket-IDs ist. Versuchen wir nun, diese zweite Verbindung zu schließen. Überprüfen Sie erneut das Terminal. Sehen Sie, dass die letzte Socket-ID von hier entfernt wurde, aber unser Benutzer ist immer noch online. Wenn wir nun auch den ersten Tab geschlossen haben, überprüfen Sie das Terminal. Siehst du, unser Benutzer wurde von der Karte entfernt, was bedeutet, dass unser Benutzer jetzt offline ist. So einfach ist es also, Benutzer online und offline zu markieren. Ich weiß, dass dieser Abschnitt etwas lang ist, aber Sie können sehen, wie diese Echtzeitanwendung funktioniert. Und wenn Sie das lernen, können Sie viele Arten von Echtzeitanwendungen erstellen. Jetzt können Sie hier eine kleine Pause einlegen, etwas Wasser trinken, Ihren Körper dehnen oder Musik hören. Hier mache ich auch eine kleine Pause und wir werden uns in der nächsten Lektion treffen. 199. Zugestellte Aktualisierungsnachrichten: Mal sehen, wie wir den Nachrichtenstatus auf Zugestellt aktualisieren können den Nachrichtenstatus auf Zugestellt Lassen Sie uns zunächst die Logik dahinter herausfinden, damit Sie beim Schreiben des Codes ein klares Verständnis haben. Der Status „Zugestellt“ bedeutet also , dass die Nachricht auf dem Empfängergerät angekommen ist. Jetzt gibt es zwei Situationen. Stellen Sie sich vor, der Absender sendet die Nachricht. Zunächst speichern wir diese Nachricht in der Datenbank mit dem Status Senden. Nun, zu diesem Zeitpunkt, ob der Empfänger online ist, was wir anhand der Variablen unserer Online-Benutzer wissen werden. Wenn der Empfänger also online ist, markieren wir diese Nachricht sofort als zugestellt. Dies ist die erste Situation. Jetzt ist eine andere Situation, dass unser Empfänger offline ist, was wir auch von Online-Benutzern unterschiedlich wissen werden. Wenn also die Empfänger-ID bei den Online-Benutzern nicht verfügbar ist, bedeutet dies, dass er oder sie offline ist. Wenn der Empfänger also offline ist, lautet unser Nachrichtenstatus zunächst „Gesendet“. Wenn der Empfänger jetzt eine Verbindung zum Socket herstellt, rufen wir zu diesem Zeitpunkt alle nicht zugestellten Nachrichten und markieren sie Dies ist die zweite Situation. Wenden wir sie nacheinander an. Unsere erste Situation, unser Empfänger ist online. Wenn er oder sie online ist, markieren wir die Nachricht einfach als zugestellt, wenn der Absender die Nachricht sendet. Beim Ereignis „Nachricht senden“, hier in der neuen Nachricht, müssen wir überprüfen, ob der Empfänger dieses Chats online ist oder nicht. Bitte an Online-Nutzer, und hier müssen wir die Empfänger-ID weitergeben . Aber wie können wir das bekommen? Richtig, wir werden sie von den Teilnehmern bekommen, aber es ist auch ein Array mit Absender-ID. Aus diesem Array müssen wir also die Absender-ID filtern. diesem Fall entspricht Const Recipients dem Punktfilter für Teilnehmer Hier erhalten wir jede ID-Pfeilfunktion und übergeben hier einfach Bedingung ID Punkt zwei, die nicht der Benutzer-ID entsprechen sollte Hier erhalten wir ein Array mit einer einzigen ID , weil wir nur zwei Benutzer unter unseren Teilnehmern haben Deshalb übergeben wir hier in der He-Methode den Empfängern das quadratische Paket, Index Null, was das erste Element ist , und es ist Mongo DibID, wir müssen es in eine Zeichenfolge konvertieren Deshalb fügen wir eine Zeichenfolge mit Punkt zwei hinzu. Was wollen wir nun tun, wenn unser Empfänger online ist? Wir setzen einfach den Status auf „Zugestellt“ zurück. Wenn das nicht der Fall ist, senden wir andernfalls zurück. Das ist es. Das ist unsere erste Situation. Jetzt ist unsere zweite Situation, dass unser Empfänger offline ist. Wenn der Empfänger also die App öffnet und eine Verbindung mit Socket herstellt, rufen wir alle nicht zugestellten Nachrichten und markieren sie einfach Hier in Socket hören wir ein weiteres Ereignis ab, das den Socket-Punkt aktiviert, Nachrichten als zugestellt markieren Wir werden dieses Ereignis vom Frontend ausgeben wenn sich unser Benutzer angemeldet und eine Verbindung zum Socket hergestellt hat. Darin müssen wir nun einige Schritte ausführen. Stellen Sie sicher, dass Sie diese Schritte in den Befehl schreiben. Andernfalls werden Sie verwirrt sein. Zunächst müssen wir alle Chat-Nachrichten finden , in denen unser Benutzer verfügbar ist. Die Kosten für nicht zugestellte Nachrichten entsprechen also den Kosten für die Suche nach einer Nachricht. Außerdem machen wir diesen Aufruf der Webfunktion asynchron. Gut. Wie wir an der ersten Position wissen, übergeben wir hier ein Objekt mit einer Bedingung. Also zuerst sollte der zu sendende Status und auch der Absender nicht der aktuelle Benutzer sein. Absender im Objekt, wir verwenden Dollar N für „ungleich“ und übergeben hier die Benutzer-ID Wir benötigen also nicht alle Felder aus den Nachrichten. Also fügen wir hier die Auswahlmethode hinzu, und darin übergeben wir eine Score-ID, Chat-ID und einen Absender. Mit dieser Abfrage werden nun alle Nachrichten gefunden, deren Status gesendet ist und deren Absender nicht unser angemeldeter Benutzer ist. Es wird jedoch nicht überprüft, ob unser angemeldeter Benutzer Teilnehmer am Chat ist oder nicht. Hier müssen wir auch die Chat-ID übergeben. Vor dieser Abfrage müssen wir also alle Jets finden, in denen unser angemeldeter Benutzer verfügbar ist. Const Chat IDs entspricht also await chat dot find. Hier übergeben wir das Objekt mit den Teilnehmern an die Benutzer-ID. Dadurch erhalten wir einen Chat wie diesen. Aber hier wollen wir nur Chat-IDs , weil wir diese ID in unserer Aktualisierungsabfrage weitergeben werden. also die einzigen IDs von den Daten in Mongo Di B abzulenken , haben wir eine andere Methode namens distins. In den Codes übergeben wir den Namen, den wir ablenken wollen, nämlich Bisher erhielten wir also ohne eine bestimmte Methode solche Daten wir Mit Disting erhalten wir unsere Daten jetzt wie folgt. Wir können diese Chat-IDs also einfach in unserer feinen Abfrage übergeben. Also Chat-ID zwei Kalibracet Dollar für Chat-IDs. Jetzt werden also nur die Nachrichten gefunden, in denen unser gesperrter Benutzer verfügbar ist Großartig. Jetzt müssen wir nur diese Nachrichten aktualisieren. Hier erfüllen wir also die Punktlänge der Bedingung I für nicht zugestellte Nachrichten, die größer als Null ist Erst dann wollen wir den Nachrichtenstatus aktualisieren. In diesem Kalibracket warten viele auf die Nachricht. Zuerst übergeben wir Objekt zum Auffinden der nicht zugestellten Nachricht . Also übergeben wir die Unterstrich-ID an das Objekt. Hier verwenden wir Dollar in, und wie wir hier wissen, müssen wir eine Reihe von Nachrichten-IDs übergeben . Wie können wir das bekommen? Wir erhalten sie aus nicht zugestellten Nachrichten , also der Reihe von IDs Wir schreiben unzugestellte Nachrichten auf eine Punktkarte. Hier erhalten wir jede Nachrichtenpfeilfunktion und geben einfach die Unterstrich-ID der Nachricht zurück Mit diesem Ausdruck erhalten wir das Array der nicht zugestellten Nachrichten-IDs, da Map-Methode ein Array zurückgibt Außerdem können wir hier nicht zugestellte Nachrichten direkt weiterleiten. Aber vorerst bleibe ich dabei. Wenn du das separat machen willst, dann kannst du das auch tun. Was möchtest du jetzt aktualisieren? Dafür übergeben wir weitere Cali-Klammern und übergeben hier den Wert Dollar auf Objekt, den Status auf Zugestellt Stellen Sie sicher, dass Sie die richtige Schreibweise schreiben, die Sie in das Nachrichtenschema Also aktualisieren wir die Nachrichten erfolgreich. Jetzt kommt ein lustiger Teil. Was denkst du? Was sollen wir danach tun? Um das klarer zu erklären, stellen Sie sich vor, Hale und Mike unterhalten sich. Derzeit ist Mike offline und Hali hat drei Nachrichten gesendet. Wie wir wissen, wird der Status standardmäßig gesendet Hier ist unser Empfänger nicht online. Logik im Ereignis „Nachricht senden“ wird nichts bewirken. Der Status bleibt wie gesendet. Jetzt, genau wie Halley, sendet John auch zwei Nachrichten an Mike Ihr Status wird ebenfalls auf „Gesendet“ gesetzt. Jetzt, nach einiger Zeit, kommt Mike online und verbindet sich mit der Steckdose. Sobald wir diese drei Nachrichten von Halley und zwei Nachrichten von John aktualisieren , was bedeutet, dass wir bei insgesamt fünf Nachrichten den Status „Zugestellt“ aktualisieren werden Nun, was sollten Halley und John vom Backend bekommen Wir können einfach Halleys drei Nachrichten-ID an Halley und Johns zwei Nachrichten-ID an John senden Halleys drei Nachrichten-ID an Halley und und ihnen Nachrichten mitteilen, deren IDs diese sind. Diese Nachrichten werden aktualisiert, sobald sie zugestellt Unser Frontend aktualisiert also den UI-Teil anhand dieser IDs, was bedeutet, dass im Frontend doppelte Häkchen angezeigt werden können So einfach ist das. Nun, hier ist eine Sache. Stellen Sie sich vor, Halley sendet 100 Nachrichten und Mike ist für ein Jahr offline Und wenn er online geht wir nach dem Update alle hundert Nachrichten-IDs an Halley senden , kann das die Datenlast erhöhen Ich denke also, anstatt die gesamte Nachrichten-ID zu übergeben, können wir Jet-IDs senden, deren Titer aktualisiert werden, um sie zuzustellen, und diese einzige Chat-ID deckt alle Nachrichten innerhalb des Wir müssen also nicht alle Nachrichten-IDs weitergeben. Unsere Schlussfolgerung ist also, dass wir ein Objekt erstellen, bei dem der Eigenschaftsname die Benutzer-ID ist, und als Wert speichern wir eine Reihe von Chat-IDs , die aktualisiert werden. Der Grund, warum wir hier ein Array von Chat-IDs verwenden , ist, dass es auch für den Gruppenchat funktioniert. Für einen einzelnen Benutzer kann es mehrere Chat-IDs geben, deren Nachrichten bei der Zustellung aktualisiert werden. Nachdem wir dieses Objekt erhalten haben, wählen wir diese Benutzer-ID aus, suchen die Socket-ID in unserer Online-Benutzerübersicht und senden einfach die zugestellte Ereignisnachricht aus und senden diese Chat-IDs. Denken Sie derzeit nicht darüber nach, wie Frontend Chats aktualisieren wird. Es kann verwaltet werden. Hier liegt unser Hauptaugenmerk darauf, dieses Objekt zu erstellen und eine Ereignisnachricht an jeden Absender zu senden. Der Rest der Arbeit wird vom Frontend erledigt. Unser Frontend aktualisiert auch all diese Nachrichten in der Chat-Liste und der Nachrichtenliste der Chat-Liste und der Nachrichtenliste oder leitet die Daten einfach um Lassen Sie uns diesen Teil implementieren. Wir werden Schritt für Schritt vorgehen. Zunächst müssen wir das Objekt erstellen, das die Benutzer-ID als Eigenschaft und ein Array von Chat-IDs als Wert hat . Die Anzahl der gruppierten Chat-IDs entspricht den nicht zugestellten Nachrichten mit einem Punkt. Hier haben wir zwei Parameter AEC ist der Akkumulator, Akkumulator ist unser Endergebnis nicht zugestellten Nachrichten mit einem Punkt. Hier haben wir zwei Parameter: AEC ist der Akkumulator, Akkumulator ist unser Endergebnis . Wenn wir eine Nachricht erhalten, bei der es sich um ein einzelnes Nachrichtenobjekt handelt, Pfeilfunktion, und beim zweiten Argument können wir den Standardwert dieses Akkumulators übergeben Also übergeben wir hier ein leeres Objekt. Zuallererst werden wir das überprüfen. Nachrichtenabsender ist bereits in unserem SC-Objekt verfügbar oder nicht. I AC eckige Klammer für den Zugriff auf den Schlüssel des Objekts und übergebe hier den Nachrichtenpunkt Sender. Wenn im Akkumulator der Nachrichtenpunkt nicht verfügbar ist, fügen wir hier ein Ausrufezeichen Dann erstellen wir darin eine Eigenschaft mit dem Namen Akkumulator eckiger Klammer. Der Absender der Nachricht entspricht entspricht Danach können wir diese Jet-ID einfach zu diesem Array hinzufügen . Akkumulator, quadratisches Paket, Nachrichtenpunktabsender, Punkt-Push-Nachricht, Punkt-Chat-ID Diese Nachricht JetD ist Objekt-ID, also müssen wir sie in eine Zeichenfolge konvertieren Am Ende geben wir einfach den Akkumulator zurück. Dadurch wird sichergestellt, dass der Akkumulator mit neuen Nachrichten weiter wächst. In diesem Code gibt es nun ein kleines Problem. Wenn ein Absender mehrere Nachrichten im Jet hat, werden wir diese Jet-IDs im Array duplizieren, aber wir möchten keine doppelten Jet-IDs im Array senden. An der Stelle dieses Arrays können wir also set verwenden. Set fügt keine doppelten Werte hinzu. An der Stelle dieses leeren Arrays fügen wir also einen neuen Satz hinzu, und an der Stelle, an der wir die Punkt-Push-Methode verwenden, verwenden wir die Punkt-Ed-Methode für Satz. Die Gruppen-Chat-IDs geben ein Objekt mit dem Absender als Eigenschaft zurück und setzen die Chat-IDs als Wert. Jetzt brauchen wir auch am Ende Werte im Array, also müssen wir Set in Array konvertieren. Dafür verwenden wir hier für Loop const IDs des Absenders im Gruppenchat In dieser Schleife gruppieren wir einfach Chat-IDs, der Sender in eckigen Klammern entspricht leeren Array und innerhalb dieses Spread-Operators und wir fügen einfach Gruppen-Chat-IDs mit eckigen Klammern Sender hinzu Jetzt haben wir unser Objekt mit der Benutzer-ID als Eigenschaft und einem Array von Chat-IDs als Wert. Jetzt müssen wir nur noch an den Absender senden und das Jet-ID-Array als Daten übergeben. Auch hier verwenden wir für Loop, Const Sender ID, gruppierte Jets Die Absender-ID ist der Schlüssel unseres Gruppen-Chat-IDS-Objekts. In dieser Schleife müssen wir nun herausfinden, ob die Absender-ID online ist oder nicht. Const Sockets entspricht also Punkt „Absender-ID abrufen“ für Online-Benutzer Wenn wir Sockets haben, denen wir bereits wissen, dass sie ein Array sein können und wir für jeden Sockets Dot verwenden Hier erhalten wir eine individuelle Socket-ID, Pfeilfunktion und darin fügen wir einfach zwei Socketd.it-Nachrichten hinzu, wir einfach zwei Socketd.it-Nachrichten hinzu Beim zweiten Parameter übergeben wir Datenobjekt-IDs an Gruppen-Chat-IDs, die quadratische Dadurch werden alle CAT-IDs an diesen Absender gesendet. Wenn Sie möchten, können wir es also separat deklarieren. Die Kosten für die Chat-IDs entsprechen also den Gruppen-Chat-IDs, eckigen Klammern und der Absender-ID. Unten geben wir die Chat-IDs an die Chat-IDs weiter und fertig. Kommen wir nun zu dieser Implementierung. Also die Änderungen, Browser öffnen. Im ersten Fenster melde ich mich mit Hals Token an. Und im zweiten Fenster habe ich mich mit einem anderen Konto angemeldet. Generieren Sie ein neues Token für ein anderes Konto. Und füge es auf unserer Website ein. Lassen Sie uns jetzt Room beitreten. Kopieren Sie also die Chat-ID aus dem Mongo Dew-Kompass, fügen Sie sie ein und treten Sie dem Raum von seinem Konto aus Jetzt sende ich eine Nachricht. Dies ist ein Test für die erste Liefersituation und das Senden. Siehst du, hier werden wir geliefert. Dies ist unsere erste Implementierung , wenn unser Empfänger online ist. Lassen Sie uns nun testen, wann unser Empfänger offline ist. Schließen wir also dieses zweite Fenster und senden wir erneut die Nachricht von Hallo, hier wird zweite Zustellsituation getestet. Sehen Sie hier, wir bekommen keine Nachricht zugestellt. Wenn wir unsere Datenbank und die Nachrichtensammlung überprüfen, die Sammlung aktualisieren und endlich erhalten wir den Status unserer Nachricht als gesendet, was bedeutet, dass sie nicht zugestellt wurde. Wenn jetzt unser zweiter Benutzer online geht, sollte dieser Nachrichtenstatus aktualisiert werden und Hardy erhält auch die Chat-IDs , deren Nachrichten aktualisiert wurden. Lassen Sie uns die SDML-Seite im zweiten Fenster öffnen. Melden Sie sich mit dem zweiten Kontotoken an, wo ist das, kopieren Sie es und fügen Sie es dem Token Sobald wir im ersten Fenster auf Okay, S klicken , sehen wir das Benachrichtigungssymbol auf dieser Registerkarte, und wenn wir zu diesem Fenster wechseln, erhalten wir, dass Ihre gesendeten Nachrichten zugestellt werden. Das bedeutet, dass unsere Implementierung gut funktioniert, und auch in der Konsole werden Sie Jet-IDs erhalten , die aktualisiert werden. Ist ein sehr interessanter Teil der Chat-Anwendung. Selbst das Ändern des Status zur Szene ist nicht so schwierig wie das Ändern des Aktualisierungsstatus zu „Geliefert“. Wenn Sie verwirrt sind, können Sie sich diese Lektion noch einmal ansehen, die Logik verstehen und damit Logik mit Ihrem Code vergleichen. Auf diese Weise werden alle Ihre Zweifel geklärt. In der nächsten Lektion werden wir nun Status der Aktualisierungsnachrichten wie beschrieben implementieren. 200. Nachrichtenstatus auf sichtbar aktualisieren: Mal sehen, wie wir den Nachrichtenstatus auf Szene aktualisieren können. Status „Gesehen“ bedeutet, dass unser Empfänger die Nachricht gesehen hat. Hier haben wir also auch zwei Situationen. Lassen Sie uns sie anhand eines Beispiels verstehen. Stellen Sie sich vor, Harley hat vier unsichtbare Nachrichten von Mike. Der Status all dieser vier Nachrichten ist zugestellt. Jetzt, in dem Moment, in dem Halley den Chat von Mike öffnet aktualisieren wir den Status dieser vier zugestellten Nachrichten auf Szene Wir müssen also zugestellte Nachrichten abrufen und sie so aktualisieren , wie es aussieht, wenn unser Benutzer den Chat öffnet Das ist unsere erste Situation. Stellen Sie sich jetzt vor, Harley ist bereits im Chat oder Raum verfügbar und Mike sendet eine Nachricht Zu diesem Zeitpunkt müssen wir auch die neue Nachricht als Setter markieren , da Hurley bereits im Chatroom verfügbar ist Das ist unsere zweite Situation. Lassen Sie uns sie nacheinander implementieren. In der ersten Situation müssen wir also die Statistiken aktualisieren, wenn unser Benutzer der Chat-ID des Raums beitritt. Hier hören wir uns also ein weiteres Ereignis an, rufen Socket Dot on auf, markieren Nachrichten als gesehen und wir übergeben hier die Callback-Funktion Zuallererst werden wir wieder alle Nachrichten finden , die unser aktueller Benutzer nicht gesehen hat Const unseen messages entspricht also await message dot find, und hier übergeben wir erste Chat-ID des Vergleichsobjekts an die Chat-ID, und in diesem Parameter erhalten wir die Chat-ID vom Frontend A Lassen Sie uns diese Funktion asynchron machen. Zurück zu unserem Vergleichsobjekt, Chat-ID zu Chat-ID, Absender zu Cully-Klammern, Dollar NE entspricht nicht der Benutzer-ID, das ist die aktuelle Benutzer-ID, die wir von der Socket-Middleware erhalten, und wie wir den Status an zugestellt das ist die aktuelle Benutzer-ID, die wir von der Socket-Middleware erhalten , und wie wir den Auch hier wollen wir nur die ausgewählten Füllungen abrufen, also wählen Sie einen Punkt aus und geben Sie die ID und den Absender an . Nach dieser feinen Abfrage halten wir uns an die Bedingung, dass die Punktlänge unsichtbarer Nachrichten größer als Null ist. Erst dann führen wir die Aktualisierungsabfrage halten wir uns an die Bedingung, dass Punktlänge unsichtbarer Nachrichten größer als Null ist Erst dann führen wir die Aktualisierungsabfrage In diesem Zustand schreiben wir also Await Message, Dot Update, viele Zunächst benötigen wir dasselbe Zustandsobjekt. Kopieren Sie also dieses Objekt aus der Find-Methode und fügen Sie es hier ein. Gut. Nun zum zweiten Argument, wir müssen Objekt, Wet Dollar Set, Object, Status, an die Szene übergeben . Lassen Sie mich überprüfen, ob wir diesen Wert in unserem Schema übergeben oder nicht. Oh, hier lesen wir weiter. Also färben Sie das auf Szene ab, weil das benutzerfreundlicher ist. Speichern Sie das und kehren Sie zu unserer Veranstaltung zurück. Jetzt ist die Frage wieder dieselbe. Was wollen wir tun, nachdem wir die Nachrichten wie gesehen aktualisiert haben? Richtig, wir werden jeden Absender informieren , dessen Nachrichten auf SN aktualisiert wurden. Hier benötigen wir also nur die Absender-ID weil unsere Jet-ID fest ist, die wir vom Frontend erhalten Aus diesem Grund ist es viel einfacher als ein ausgestelltes Event Die Kosten für die Absender-IDs sind also gleich, um mir mitzuteilen , welche Methode wir verwenden, um das neue Array aus dem vorhandenen Array zu extrahieren Richtig, wir verwenden unsichtbare Nachrichten Dot Map. Hier erhalten wir die Funktion mit einem Pfeil für einzelne Nachrichten und geben einfach den Absender der Nachricht als Punkt zurück Dieser Absender ist die Objekt-ID, also müssen wir ihn in eine Zeichenfolge konvertieren. Wie wir wissen, sammelt diese Zuordnungsmethode alle Chat-IDs aus den unsichtbaren Nachrichten, sodass wir möglicherweise doppelte Absender-IDs in diesem Array erhalten Wir können das mit Set lösen. Wir schließen diese Kartenmethode Klammern ein und genau hier ein neues Set werden ein Set erstellen, und um dieses Set in ein Array umzuwandeln, schließen wir es einfach mit eckigen Klammern ein und verteilen das Set Diese Kartenmethode gibt uns ein Array mit doppelten Absender-IDs. Deshalb konvertieren wir es in ein Set. Ich setze, wir kommen nicht zu doppelten Werten, und danach konvertieren wir sie wieder in ein einfaches Array. Jetzt haben wir Absender-IDs, also können wir es einfach für Loop Const Sender tun, was die individuelle Absender-ID der Absender-IDs ist Stellen Sie sicher, dass Sie hier of not in verwenden , denn wir verwenden in, um Objektschlüssel zu erhalten, und wir verwenden of forgetting value from array Bisher waren unsere Gruppen-Chat-IDs Objekt. Deshalb verwenden wir in. Aber hier sind die Absender-IDs ein Array. Deshalb verwenden wir hier aus. Ich habe diesen Fehler schon einmal gemacht und es ist wirklich frustrierend, weil ich den Fehler nicht bekomme und der Code immer noch nicht so funktioniert , wie ich es möchte Stellen Sie also sicher, dass Sie sich daran erinnern. In dieser Schleife kosten wir wieder Sockets , was Punkt, an dem Online-Benutzer Sender erhalten, entspricht. Hier machen wir das Gleiche wie zuvor. Wenn Steckdosen verfügbar sind, Steckdosen nicht verfügbar. Hier erhalten wir eine einzelne Socket-ID, Pfeilfunktion und darin machen wir Iot zwei, Socket-ID, Punkt M-Nachrichtenszene. Als Daten senden wir die Chat-ID an die Chat-ID, und wir senden auch die Benutzer-ID, die diese Nachrichten sendet. Von zwei Benutzer-IDs gesehen, und das war's. Sie können sehen, wie einfach es ist. Das ist unsere erste Situation. Lassen Sie uns nun die zweite Situation implementieren. In diesem Fall ist unser Benutzer bereits in diesem Raum verfügbar. Wir müssen den Status aktualisieren, wenn anderer Benutzer im selben Raum eine neue Nachricht sendet. Anstatt also Logik in „Nachricht senden“ zu schreiben , können wir sogar das gleiche Ereignis „Nachricht als gesehen markieren“ vom Frontend ausgeben das gleiche Ereignis „Nachricht als gesehen markieren“ vom , wenn der Benutzer die neue Nachricht im gemeinsamen Raum erhält. Unsere Endimplementierung in Bezug auf die Statusszene ist hier also abgeschlossen. Lassen Sie uns nun einfach diese Implementierung probieren. also im Frontend einem Raum beitreten, geben wir hier dieses Ereignis aus, markieren Nachrichten als gesehen und übergeben hier den Chat-ID-Wert. Außerdem müssen wir dasselbe Ereignis ausgeben , wenn wir die neue Nachricht erhalten. Im GET-Nachrichtenereignis fügen wir hinzu, ob die Punktabsenderpunkt-Unterstrich-ID der Bedingungsdaten nicht der Punkt-Unterstrich-ID des Benutzers entspricht Dies ist die Benutzer-ID unseres angemeldeten Benutzers. Wenn das stimmt, dann machen wir Socket Dot und markieren Nachrichten als gesehen. Beim zweiten Argument übergeben wir den D-Punkt-Wert. Sehen Sie sich die Änderungen an und werfen Sie einen Blick darauf. Lassen Sie uns dieses Fenster aktualisieren und Harleys Token hier weitergeben. Und steige auch in den Jet ein. Und von unten senden wir die Nachricht. Dies dient dazu, den Status der Szene zu testen und zu versenden. Wenn wir nun in unserer Datenbank unsere letzte Nachricht überprüfen, sehen wir den Status zum Senden. Und jetzt, wenn wir ein neues Fenster öffnen und uns mit meinem ersten Account-Token anmelden. Wenn wir jetzt erneut den Status unserer Nachricht überprüfen, stellen wir fest, dass sie auf „Zugestellt“ aktualisiert wurde. Jetzt kopiere ich diese Chat-ID und trete diesem Raum von einem anderen Benutzer bei. Lassen Sie uns jetzt noch einmal unsere Datenbank überprüfen und die Daten aktualisieren. Sehen Sie hier, dass wir die Nachricht an die Szene senden und dass der Benutzer Daten im Chat aktualisiert bekommt und wer diese Nachricht gesehen hat. So aktualisieren wir den Status, wie er gesehen wurde, mit Socket. 201. Gruppenfelder im Schema hinzufügen: Lassen Sie uns nun einige Funktionen zu unserer Anwendung hinzufügen. Derzeit sind wir in unserem Chat nur Eins-zu-Eins-Chat implementiert. Lassen Sie uns jetzt auch den Gruppenchat hinzufügen und wir müssen nicht viel darin tun. Zunächst werden wir einige gruppenbezogene Felder in unser Chat-Schema aufnehmen. Hier in den Teilnehmern können wir mehrere Benutzer hinzufügen , die Teil dieser Gruppe sind. Danach benötigen wir auch die letzte Nachricht. Danach übergeben wir diese Gruppe und setzen sie auf Type auf Bullion und standardmäßig auf False Hier können wir Befehle für Gruppen hinzufügen. Wenn wir also Gruppenfunktionen implementieren, können wir uns daran erinnern, welche Felder wir behandeln müssen. Danach hat die Gruppe Admin, also Admins, was einer oder mehrere sein können Wir kopieren einfach das Teilnehmer-Array mit der Objekt-ID und dem Verweis auf den Benutzer Füge es hier hinzu. Was brauchen wir als Nächstes? Ja, wir benötigen einen Gruppennamen , der vom Typ zur Zeichenfolge steht, und der Benutzer kann auch ein Gruppensymbol oder ein Gruppenbild hinzufügen, das ebenfalls vom Typ zur Zeichenfolge ist. Ich denke, das ist genug für den Gruppenchat. Achten Sie auch hier darauf, dass Sie für Gruppenfüllungen nicht required zu true hinzufügen , denn wenn der Chat eins zu eins ist, kann das zu einem Schemafehler führen , wenn der Chat eins zu eins ist, der Wert von required auf true für zu eins ist, der Wert von required auf true für Gruppenfüllungen hat. Sehen wir uns nun an, was wir im Nachrichtenschema tun müssen. Hier für Gruppen müssen wir nicht viel hinzufügen. Wir brauchen nur den Status für alle Gruppenmitglieder. In der Gruppennachricht reicht der Status nicht aus. Hier fügen wir einfach den Status der abgelegten Sendung hinzu, also Array, und darin speichern wir Objekte für den Status jedes Teilnehmers. Also zuerst der Benutzer im Objekttyp Mongs Punktschema Punkttypen Punkt Objekt-ID Verweis auf Benutzer. Dies ist die Benutzer-ID jedes Teilnehmers. Außerdem fügen wir für diesen Benutzer den Status hinzu . Kopieren Sie also dasselbe Objekt von hier und fügen Sie es darin ein. Danach benötigen wir auch Zeit, bis unsere Nachricht zugestellt wird, bei der Eingabe bis zum Datum, und außerdem müssen wir gesehen haben und auch bis zum Datum tippen und fertig, wir brauchen keine weiteren Felder. Wenn wir sie in Zukunft benötigen, können wir sie hier definitiv hinzufügen. 202. Erstellen einer neuen Gruppen-API: Lassen Sie uns nun eine API zum Erstellen einer neuen Gruppe erstellen. Hier müssen wir dafür keinen Socket verwenden. In der Chat-Route können wir diese API zum Erstellen von Chats einfach kopieren und unten einfügen . Gut. Ändern Sie jetzt den Endpunkt, um eine Gruppe zu erstellen. Und in dieser Funktion müssen wir kleine Änderungen vornehmen. Zunächst erhalten wir am Ort des Empfängers ein Teilnehmer-Array, dem es sich um die Benutzer-IDs der Teilnehmer handelt. Außerdem erhalten wir ihren Gruppennamen. Für das Gruppenbild können wir separat eine weitere API hinzufügen. Und hier müssen wir den Anfragetext destrukturieren. Als nächstes ändern wir auch die Bedingung. Wenn Teilnehmer nicht verfügbar sind, geben wir die Fehlermeldung zurück, dass Teilnehmer erforderlich sind. Jetzt müssen wir hier keinen Chat mehr finden , da dieselben Teilnehmer mehrere Gruppen haben können. Wir entfernen einfach diese Chat-Variable und geben sie als Ist-Bedingung an. Und hier fügen wir const chat hinzu. Innerhalb des Objekts fügen wir Teilnehmer zu Teilnehmern hinzu. Aber hier müssen wir auch die aktuelle Benutzer-ID zum Teilnehmer-Array hinzufügen . Hier fügen wir ein Array hinzu und fügen die Benutzer-ID ein. Als Nächstes von Gruppenname zu Gruppenname. A hat den Wert true, und wir übergeben Admins an das Array, und innerhalb dieses Arrays übergeben wir die aktuelle Benutzer-ID Wenn wir in Zukunft weitere Teilnehmer hinzufügen oder Teilnehmer entfernen möchten, oder wenn wir neue Administratoren hinzufügen oder den Gruppennamen aktualisieren möchten, aktualisieren Sie weitere Teilnehmer hinzufügen oder Teilnehmer entfernen möchten, wir neue Administratoren hinzufügen oder den Gruppennamen aktualisieren möchten, aktualisieren das Gruppenbild Für all das können wir separate APIs erstellen. Im Moment brauchen wir sie nicht, da unser Hauptaugenmerk darauf liegt, Echtzeit-Chat-Funktionen zu erlernen. Lassen Sie uns also diese API testen. Dafür öffnen wir Postman. Wir benötigen einen anderen Benutzer, um sie zur Gruppe hinzuzufügen. Öffnen Sie also die Registrierungs-API für neue Benutzer. Hier übergeben wir einen anderen Benutzernamen. John unterstreicht 24, E-Mail an john at red gml.com und Passwort, ich behalte dasselbe Du weißt warum, weil ich Passwörter vergessen habe. Guter neuer Benutzer erstellt. Lassen Sie uns nun die Anfrage zum Erstellen von Chats duplizieren und umbenennen, um eine neue Gruppe zu erstellen , und verweisen wir auf den Schrägstrich API HATS Slash Create Auch in der Kopfzeile haben wir bereits ein Token und im Hauptteil des Objekts mussten wir zuerst die Teilnehmer anordnen, hier fügen wir alle Aus der Datenbank kopieren wir einfach die ID von zwei anderen Personen. Achten Sie darauf, dass Sie nicht die Objekt-ID Ihres aktuellen Kontos kopieren , deren Token Sie im Header übergeben. Gut. Jetzt, nach den Teilnehmern, geben wir den Gruppennamen weiter, und wie sollen wir die Gruppe nennen? Sagen wir Node Ninjas. Das ist der Name der Schule, oder? Ja, und schicke die Anfrage. Siehst du, hier erhalte ich einen internen Serverfehler. Lassen Sie mich überprüfen, was falsch ist. In einem Terminal erhalten wir Fehler bei den Teilnehmern. Oh, hier übergebe ich direkt Array innerhalb von Array. Also verteilen wir das Teilnehmer-Array, speichern die Änderungen und lassen uns die Anfrage erneut senden. Siehst du, hier erstellen wir einen neuen Gruppenjet. 203. Hinzufügen von Gruppenchat-Logik in Socket-Ereignissen: Lassen Sie uns die Gruppen-Chat-Logik in unseren Socket-Events anwenden. Zunächst beginnen wir mit dem Ereignis „Nachricht senden“. Stellen Sie sich vor, ein Benutzer sendet eine neue Nachricht in einer Gruppe. In beiden Fällen müssen wir nur den Inhalt der Nachricht und auch die Chat-ID übergeben, wenn der Benutzer eine Eins-zu-Eins-Nachricht oder der Benutzer eine Gruppennachricht vom Frontend sendet der . In unserem Gruppenchat überprüfen wir also auch, ob der Inhalt übergeben wurde oder nicht. Außerdem finden wir den Jet anhand seiner ID. Als Nächstes erstellen wir auch eine neue Nachricht mit demselben Objekt, aber bei einer Gruppennachricht müssen wir den Zustellungsstatus einhalten, den Zustellungsstatus auswählen und danach die Bedingung übergeben, falls die Gruppe jette true ist, dann müssen wir ein Objekt-Array erstellen , das wie folgt aussieht Dafür verwenden wir also, dass der Lieferstatus der Punktkarte der Teilnehmer entspricht Punktkarte der Teilnehmer Hier erhalten wir die Benutzerpfeilfunktion, und darin geben wir einfach Object zurück. Im Objekt, Benutzer zu Benutzer und Status hier, übergeben wir die Bedingung. Online-Benutzer sind Benutzer. Wenn dies zutrifft, fügen wir hinzu, dass der Status zugestellt wurde. Als gesendet. Außerdem fügen wir hier „geliefert um zwei“ hinzu, wir benötigen auch die gleiche Bedingung, damit wir vor dieser Rückgabe eine Variable hinzufügen können. Die Kosten im Internet entsprechen den Kosten für Online-Nutzer. An der Stelle, an der diese Bedingung gilt, geben wir online weiter und in der Lieferadresse auch, wenn der Benutzer wahr ist, dann geben wir ein neues Datum ein, andernfalls geben wir Null an. Jetzt ist hier eine Sache. Bei diesen Teilnehmern erhalten wir auch die ID des Absenders und wir möchten dem Lieferstatus keine Absender-ID hinzufügen. Hier haben wir Empfänger, das ist die Filterversion der Teilnehmer. An der Stelle der Jet-Dot-Teilnehmer fügen wir also die Punktkarte der Empfänger hinzu. Dadurch müssen wir den Status unten nicht explizit aktualisieren . Danach aktualisieren wir auch den letzten Status im Chat. Jetzt füllen wir hier die Sendar-Daten aus und geben das Get-Nachrichten-Ereignis für die Chat-ID Jetzt füllen wir auch die Daten aus, aber hier müssen wir auch Lieferstatus „Benutzer“ angeben, da wir im Einzelgespräch nur unseren globalen Status verwenden, aber im Gruppenchat müssen wir die Uhrzeit jedes Benutzers anzeigen Hier fügen wir eine weitere Methode zum Auffüllen hinzu. zunächst den Lieferstatus als Benutzer ein, und was möchten Sie ausfüllen Geben Sie die ID und den Benutzernamen als Unterstrich ein. Sehen wir uns nun an, was wir unter Nachrichten als zugestelltes Ereignis markieren müssen Nachrichten als zugestelltes Ereignis markieren Wie wir wissen, ist es also wenig verwirrend, den Zustellungsstatus von angemeldeten Benutzern in einer Gruppennachricht festzulegen. Anstatt dasselbe Ereignis zu verwenden, ist es besser, ein separates Ereignis für Gruppennachrichten zu erstellen. Diese kennzeichnen also Nachrichten als zugestelltes Ereignis nur für Einzelchats. Auch in dieser Hinsicht müssen wir kleine Änderungen vornehmen. Wie wir wissen, sind diese Chat-IDs alle Chat-IDs, in denen unser Benutzer verfügbar ist Dazu gehören jedoch auch Gruppenchats. Hier in der Chat-Suchmethode übergeben wir also eine weitere Bedingung. Gruppe wird auf Falsch gesetzt, was bedeutet, dass es nur eins zu eins zurückgibt, und das war's. Wir müssen nichts anderes ändern. Lassen Sie uns jetzt ein neues Ereignis erstellen. Socket Dot on Event, sagen wir, Gruppennachrichten als zugestellt markieren und wir übergeben hier eine SyncLwcFunction Ruft dieses Ereignis auf, wenn unser Benutzer am Frontend angemeldet hat, genauso wie wir Nachrichten als zugestelltes Ereignis markieren ausgeben Jetzt benötigen wir zunächst alle Gruppen-Jet-IDs , in denen unser Benutzer verfügbar ist. Jet IDs entspricht Await Chat Dot Find. Im Vergleichsobjekt geben wir die Teilnehmer an die Benutzer-ID weiter. Ist group auf true gesetzt. Und hier wollen wir nur Ausweise. Also, welche Methode wir verwenden werden, richtig, wir verwenden Punkt Distinct und übergeben hier die Unterstrich-ID Danach müssen wir nun unzugestellte Nachrichten in diesen Gruppen-IDs finden unzugestellte Nachrichten in diesen Gruppen-IDs deren Status Wie zuvor entspricht const undelivered messages also dot find Objekt, wir übergeben die Chat-ID an das Objekt, Dollar an Auch Absender zu Objekt, Dollar N für nichts entspricht der Benutzer-ID, bei der es sich um die Benutzer-ID handelt, bei der es sich um die angemeldete Benutzer-ID handelt Jetzt müssen wir auch die Nachrichten finden , die nicht an den aktuell angemeldeten Benutzer zugestellt wurden Also hier übergeben wir den Lieferstatus. Zu Einspruch, und wie wir wissen, ist der Lieferstatus eine Reihe von Objekten mit dem Benutzer und seinem Status. Wir müssen den Benutzer überprüfen, da unsere Benutzer-ID und unser Status auf Senden gesetzt sind. Dazu müssen wir eine Bedingung angeben, die innerhalb der einzelnen Elemente eines Arrays übereinstimmen muss. In unserem Fall sind es Benutzer und Status. Lass dich nicht verwirren, sieh dir das an. Wir können hier einen anderen mongoib-Operator, Dollar Aleem, verwenden , der dem Objekt entspricht. Hier übergeben wir Benutzer-ID, und der Benutzerstatus muss Mit diesem Bild können wir also Bedingungen auch in der Reihe von Objekten spezifizieren Außerdem benötigen wir keine Nachrichten oder Informationen, also fügen wir einfach einen Punkt hinzu, wählen aus und übergeben hier Unterstrich-ID, Jet-ID, Absender und Lieferdaten. Großartig. Danach übergeben wir die Bedingung nicht zugestellter Nachrichten, deren Länge größer als Null ist Erst dann wollen wir die Aktualisierungsabfrage ausführen. In diesem Protokoll verwenden wir vier kontinuierliche Schleifenmeldungen, die nicht zugestellt wurden. Und innerhalb dieser vier Schleifen gewichten wir einfach die Nachricht mit Punkt eins Zuerst übergeben wir das Vergleichsobjekt, Unterstrich-ID an die Nachrichtenpunkt-Unterstrich-ID und in den Codes den Punkt Zustellungsstatus von Benutzer zu Benutzer-ID Beim zweiten Argument übergeben wir Objekt mit Dollarwert auf Objekt an erster Stelle im Code, Lieferstatus Punkt, Dollarpunktstatus, zwei Dieser Dollarpunktstatus hilft uns dabei, nur die Füllung zu aktualisieren, deren Benutzer die Benutzer-ID ist. Jetzt möchten wir auch in Codes „ Zugestellt zum Zeitpunkt“ den Lieferstatus „ Punkt geliefert am“ hinzufügen , und wir geben hier ein neues Datum weiter. Und fertig. Diese For-Schleife aktualisiert den Status all dieser nicht zugestellten Was wollen wir nun tun, nachdem wir die Nachrichten aktualisiert haben? Richtig, wir wollen den Jet-IDs schicken , deren Status aktualisiert ist. Aus unserem vorherigen Ereignis „ Nachrichten als zugestellt markieren können wir nach dieser Aktualisierungsmethode einfach die gesamte Logik übernehmen. Und füge es nach der Herbstschleife ein und stelle sicher, dass es auch im I-Blog ist. Zuallererst erstellen wir in diesem Blog ein Objekt für Absender und als Wert rufen wir die Chat-IDs ab, die aktualisiert werden Der Grund, warum wir dieses Set verwenden, ist, dass es alle doppelten Chat-IDs entfernt und uns eindeutige Chat-IDs Danach konvertieren wir das in ein Array und zuletzt führen wir diese Fallschleife für den Absender anhand der Gruppen-Jet-IDs aus. Und in dieser Schleife finden wir die Socket-IDs dieser Absender und geben einfach den aktuellen Status der Ereignisnachricht aus, und wir geben diese Jet-IDs an den zugehörigen Absender Wir müssen also an dieser Logik nichts ändern. Sie können sehen, wie einfach es ist. Wir müssen nur klarstellen , was wir tun wollen. Gehen wir nun zum letzten Ereignis über, nämlich Nachrichten als gesehen markieren. Auch hier erstellen wir ein separates Ereignis für Gruppennachrichten als gesehen markieren. Socket-Punkt bei Gruppennachrichten als gesehen markieren. Und hier übergeben wir die ASN-Callback-Funktion, und im Parameter dieser Funktion benötigen wir die Jet-ID dieser Gruppe Jetzt kopieren wir die Abfrage für nicht zugestellte Nachrichten aus dem von der Gruppe zugestellten Ereignis und Hier ändern wir nun unzugestellte Nachrichten in unsichtbare Nachrichten, Chat-ID, Chat-ID, Absender in Objekt, Dollar NI für nicht gleich Benutzer-ID, Zustellungsstatus, Bild, Benutzer-ID und Status ist Objekt, Dollar, Dollar Jetzt können wir die I-Bedingung erfüllen, wenn Punktlänge unsichtbarer Nachrichten größer als Null ist. Dann wollen wir die Aktualisierungsabfrage Dann wollen wir Auch hier kopieren wir diese vier Schleifen aus dem zugestellten Gruppenereignis und fügen sie in unser gesehenes Ereignis Hier ändern wir nun diese nicht zugestellten Nachrichten in unsichtbare Nachrichten um, und im Update-Dollar, der am Ort der Zustellung festgelegt ist, vermarkten wir SN, und auch am Ort der Zustellung am, aktualisieren wir Stellen Sie sicher, dass Sie in keiner dieser CLI-Klammern eine Fehlermeldung erhalten in keiner dieser CLI-Klammern eine Fehlermeldung Seien Sie vorsichtig damit. Was möchtest du nun tun, nachdem wir die Nachrichten wie gesehen aktualisiert haben? Wir kopieren einfach die Logik aus dem einfachen Szenenereignis. Und fügen Sie es nach unserer Aktualisierungsabfrage ein. Im Grunde sehen wir uns hier dem Absender gegenüber , der Angst vor diesen Nachrichten hat, und mithilfe von for loop senden wir einfach eine Nachricht im Ereignis mit Chat-ID und gesehen von, und das war's Lassen Sie uns nun diese Implementierung testen. Hier öffnen wir die endgültige SDML-Datei im Browser und übergeben das Token für den Benutzer Gut. Jetzt müssen wir dem Gruppenchat beitreten. Aus dem Mongo Di, den wir in der Chat-Sammlung auswählen, kopieren wir einfach unsere Gruppen-Chat-ID , fügen sie in die Chat-ID ein und treten dem Raum Lassen Sie uns nun die Nachricht in dieser Gruppe senden. Hallo, das ist Gruppenchat und sende ihn. Gut. Wenn wir unsere Datenbank überprüfen, die Sammlung aktualisieren, und unten, C, erhalten wir eine Nachricht, und im Lieferstatus erhalten wir ein leeres Array. Lass mich sehen, was falsch ist. Gehen Sie zu unserem Event „Nachricht senden“ über. Hier in der neuen Nachricht haben wir vergessen, den Lieferstatus hinzuzufügen. Also Lieferstatus zu Lieferstatus, speichern Sie die Änderungen und lassen Sie uns noch einmal probieren oder implementieren. Aktualisieren Sie den Browser und übergeben Sie das Benutzertoken. Kopieren Sie die Chat-ID aus der Chat-Sammlung fügen Sie sie in die Chat-ID ein und treten Sie dem Raum bei. Lassen Sie uns jetzt die Nachricht erneut senden. Hallo, das ist Gruppenchat und sende diese Nachricht. Wenn wir jetzt noch einmal unsere Datenbank überprüfen, die Sammlung unten aktualisieren, erhalten wir eine neue Nachricht und im Lieferstatus erhalten wir jetzt den Status für jeden Teilnehmer. Großartig. Jetzt fügen wir ein weiteres Fenster hinzu, öffnen Sie erneut sdmlFle hier füge ich ein Token eines anderen Kontos Und sobald ich die Eingabetaste drücke, sehen Sie in unserem ersten Fenster, erhalten wir eine Benachrichtigung, dass Ihre gesendete Nachricht zugestellt wurde, was bedeutet, dass unser Gruppenereignis als zugestelltes Ereignis markieren als zugestelltes Ereignis Ich aktualisiere die Datenbank sehe im Nachrichtenzustellungsstatus, dass der Benutzerstatus zugestellt ist, und wir werden auch pünktlich hier zugestellt. Gut. Lass mich jetzt demselben Chat beitreten. Also nimm diese Jet-ID. Und füge es hier ein und trete dem Raum bei. Sehen Sie, im ersten Fenster erhalten wir eine Benachrichtigung, dass Ihre Nachricht von diesem Benutzer gesehen wurde. Wenn wir die Datenbank erneut überprüfen, die Sammlung aktualisieren und unten nach diesem Benutzer suchen, diesem Benutzer suchen aktualisieren wir unseren Status wie gesehen und wir erhalten auch die Szene zu gegebener Zeit. Das bedeutet, dass unsere Funktion Gruppennachrichten als Szenenereignis markieren ebenfalls ordnungsgemäß funktioniert. Es ist so einfach und nicht verwirrend , weil wir die Logik in verschiedene Gruppenereignisse aufteilen. So implementieren wir den Gruppenchat im Socket. 204. Abschnitt 16 - Bereitstellungsoptionen: Willkommen im letzten Abschnitt des ultimativen Node Hair-Kurses. In diesem Abschnitt werden wir den Bereitstellungsprozess von Node-Anwendungen sehen . Derzeit läuft unsere Anwendung also auf unserem lokalen Computer. Um unsere Anwendung nun global nutzen zu können, müssen wir sie bereitstellen. Es ist wirklich einfach. Mach dir darüber keine Sorgen. Es gibt also zwei Möglichkeiten, Knotenanwendungen bereitzustellen. Wir können Pass verwenden, was Platform-as-a-Service bedeutet, oder wir können Docker verwenden Jetzt fragen wir uns vielleicht, was Pass und Docker sind. Pass oder Platform-as-a-Service bedeutet also, dass wir eine Plattform verwenden können, die uns bei der Bereitstellung unserer Anwendung hilft PAS, wir haben Render, Eoco , Google Cloud Platform, AWS , Microsoft, Azure usw. Diese Plattformen bieten eine Vielzahl von Funktionen, sodass wir uns nicht viele Gedanken über den Bereitstellungsprozess machen müssen Stellen Sie sich vor, Sie möchten einen Imbissstand eröffnen. Anstatt sich Gedanken darüber zu machen, einen Herd zu kaufen , Strom einzurichten und Wasseranschlüsse zu bekommen, mieten Sie einfach eine voll ausgestattete Küche. Hier müssen Sie nur Ihre Zutaten mitbringen, Ihr Essen kochen und mit dem Verkauf beginnen. Genau das macht PAS für Entwickler. Mit PAs müssen wir uns keine Gedanken über die Einrichtung von Servern, Datenbanken, Netzwerken oder Skifahren machen. Diese Plattformen kümmern sich um all das für uns. Wir schreiben einfach unseren Note-JS-Code , stellen ihn bereit und er läuft. So einfach ist das. Auf der anderen Seite, wenn Sie die Kontrolle über Ihre Bereitstellung haben oder Ihre Node-Anwendung auf Ihrem eigenen Webserver bereitstellen möchten , dann ist Docker eine großartige Option Mit Docker können wir ein Image unserer Anwendung erstellen und dieses Image auf jedem Computer der Welt bereitstellen dieses Image auf jedem Computer der Welt Wie Sie sich vorstellen können, ist die Verwendung von Docker ein wenig komplexer Prozess. Im Moment müssen wir uns darüber keine Gedanken machen. Wenn Sie sich also keine Gedanken über Server, Load Balancer, Infrastruktur oder den Neustart Ihrer Anwendung beim Absturz machen möchten Server, Load Balancer, Infrastruktur , ist Platform-as-a-Service eine gute Option In diesem Abschnitt werden wir also Render für die Bereitstellung unserer Node-Anwendung verwenden , da es die einfachste Art der Bereitstellung von Node-Anwendungen bietet die einfachste Art der Bereitstellung von Node-Anwendungen und außerdem hervorragende Funktionen bietet Verschiedene Leute mögen unterschiedliche Plattformen, aber ich denke, Rendern ist eine großartige Art der Bereitstellung und es ist auch kostenlos. So können wir unsere Anwendung kostenlos und ohne Kartendetails bereitstellen . 205. Vereinfachung des Codes: Bevor wir unsere Anwendung bereitstellen, sollten wir unsere Indexpunkt-JS-Datei sauberer und lesbarer machen Es wird einen guten Eindruck in unserem Team und wir alle arbeiten auch gerne an sauberem Code. Lassen Sie uns das verwirklichen. Hier erstellen wir eine separate Datei für separate Dinge, z. B. für die Datenbankverbindung, eine separate Datei. Für Routen haben wir eine weitere Datei und für Sockets haben wir auch eine separate Datei wie diese. Es ist wirklich einfach. Lass uns das eins nach dem anderen machen. Zunächst trennen wir die Datenbankverbindung. Hier in unserem Projekt erstellen wir einen neuen Ordner namens Startups. Darin erstellen wir eine neue Datei namens DibTJS. In dieser Datei möchten wir nun Code für die Datenbankverbindung hinzufügen Sie hier aus der Indexpunkt-JS-Datei Schneiden Sie hier aus der Indexpunkt-JS-Datei die Mongoose Dot Connect-Methode Und füge es in unsere neuen fünf ein. Jetzt brauchen wir hier ein paar Dinge. Zuerst brauchen wir die Mangos. Mango-Success entspricht Mangos entspricht Außerdem benötigen wir diesen Logger, sconct Logger entspricht require, wir gehen einen Ordner nach oben, gehen zur Konfiguration, hier importieren wir sconct Logger entspricht require, wir gehen einen Ordner nach oben, gehen zur Konfiguration, hier importieren wir Logger. Nun, eine Frage, die Sie sich vielleicht stellen, wie können wir diesen Code zu unserer Indexpunkt-JS-Datei hinzufügen Es ist wirklich einfach. Lass dich nicht verwirren. Lass es mich dir zeigen. Hier unten modulieren wir einfach, dass Punktexporte gleich sind. Hier fügen wir eine Funktion innerhalb dieser Funktion hinzu, wir verschieben einfach diese Mongoose Dot Connect-Methode Zurück zur Indexpunkt-JS-Datei. Sag mir, wie können wir etwas aus der DB Dot JS-Datei eingeben ? Wir verwenden die erforderlichen Forward-Slash-Startups DV. Dieser Ausdruck gibt alles zurück, was wir aus dieser DB-Datei exportieren und was wir exportieren Wir können das in einer Variablen namens const DB speichern und dann diese Funktion aufrufen Anstatt dies in zwei Zeilen zu tun, können wir das einfach in einer Zeile tun Um diese Funktion in der Variablen DB zu speichern, können wir sie einfach hier aufrufen Wenn wir diese Funktion aufrufen, wird der Verbindungscode ausgeführt, und genau das wollen wir Also hier ist unser erster Schritt getan. Lassen Sie uns nun die Implementierung all dieser Routen trennen. Im Startordner erstellen wir eine neue Datei namens routes dot js. Außerdem exportieren wir, wie zuvor, das Modul Punktexporte. Dies entspricht der Funktion innerhalb dieser Funktion Wir fügen alle unsere Routen hinzu. Schneiden Sie also alle App-Routen mit App-Middleware sowie natürlich Express Dot Json und auch Global Error Sie und fügen Sie sie in unsere Routen-Datei ein. Jetzt brauchen wir hier ein paar Dinge. Zuallererst brauchen wir diese App und wie können wir diese App bekommen? Sollen wir in dieser Datei eine neue App erstellen und sie dann verwenden? Nein, das können wir nicht tun, da dadurch eine neue Express-Anwendung erstellt wird. Aber hier wollen wir dieselbe Anwendung verwenden. Was ist hier die Lösung? Die Lösung ist wirklich einfach. Hier, aus der Index-JS-Datei, hatten wir nach dieser Datenbank die Angabe von Zeitraum, Schrägstrich beim Start und Schrägstrichrouten benötigt , was unsere Funktion ist Wir rufen diese Funktion auf und übergeben einfach app als Argument. In unserer Routenfunktion erhalten wir einfach App als Parameter. Was wollen wir als Nächstes? Wir brauchen Kurs und wie können wir das erreichen, ja, wir können den gleichen Weg benutzen. Aber wie wir wissen, ist natürlich unser Paket, und wir können das Paket in jeder Datei verwenden, indem wir es einfach eingeben. Mit App können wir das nicht machen, nur deshalb bekommen wir App als Parameter. oben ist der Kurs „Kosten“ also gleich dem Wert „Kosten erforderlich“. benötigen wir Express, das wir auch hier importieren können. Cost Express entspricht Require Express. Danach benötigen wir auch Logger, Sconct, Logger, was Require entspricht, wir gehen eine Zeile höher, Config und Logger Als Nächstes benötigen wir diese Routen. SeconstUser routes entspricht require Hier verschieben wir auch einen Ordner nach oben, um Benutzer weiterzuleiten. Duplizieren Sie diese Zeile nun noch zweimal , indem Sie Alter plus Sieben plus Abwärtspfeil oder Optionspunkt Sieben plus Abwärtspfeil Hier ändern wir zunächst den Variablennamen in Routen posten und Datei in Beitrag Als Nächstes ändern wir die Variable in Chat-Routen und die Datei in Chats und fertig. Wir sind mit Schritt zwei fertig. Lassen Sie uns nun unsere Socket-Logik trennen. Aus dieser Online-Benutzervariablen wählen wir unseren Code aus, bis wir den Serverpunkt LISN erhalten Schneiden Sie den Startordner aus, wir erstellen eine neue Datei namens Socket Dot JS In dieser Datei modulieren wir erneut, Punktexporte der Funktion entsprechen. In dieser Funktion fügen wir unseren Code hinzu. Zuallererst brauchen wir hier diese AO-Methode. Sag mir, sollen wir ein neues Ao-Objekt erstellen? Wir müssen dasselbe Ao-Objekt verwenden, das wir mit dem Server erstellt haben. In der Indexpunkt-JS-Datei hatten wir den Socket Period Startups benötigt. Und hier rufen wir diese Funktion auf und übergeben hier einfach Ao Object. In der Socket Dot JS-Datei bekommen wir hier für das Io-Objekt einen Parameter. So einfach ist das. In dieser Logik müssen wir eine Menge Dinge importieren, also versuchen Sie nicht, sich zu beeilen. Gehen wir Zeile für Zeile vor. Siehst du, in diesem Haus brauchen wir dieses JWT In der obersten Konstante entspricht JWT dem JSON-Webtoken require. Als Nächstes, was wir brauchen Ja, wir brauchen dieses Chat-Modell und wir brauchen auch dieses Nachrichtenmodell. Also oben, die Kosten für den Chat sind gleich wir hier einen Ordner für die Chats der Models benötigen. Und wenn Sie beim Importieren einer Datei verwirrt sind, lassen Sie mich Ihnen meine Trigger zeigen, wenn ich eine Datei importiere Hier wollen wir das Nachrichtenmodell importieren. Cost message is equal to require. Zuerst reduziere ich alle Ordner mit dieser Schaltfläche und öffne dann einfach den Ordner, in dem ich gerade arbeite. Ist Start und öffnet auch den Ordner, aus dem ich importieren möchte. Das sind Modelle. Derzeit befinden wir uns im Stu-Ordner Wir müssen diesen Ordner verlassen, also fügen wir einen Schrägstrich für Punkt, Zeitraum Dann wollen wir in den Ordner Models gehen und aus dem Nachrichtenmodell importieren Siehst du, so einfach ist das. Lassen Sie mich jetzt sehen, was wir sonst noch importieren müssen. Ich denke, das ist alles was wir brauchen. Wenn wir etwas übersehen, erhalten wir eine Fehlermeldung. Mach dir darüber keine Sorgen. Schauen wir uns nun an, wie unser Index Dsi aussieht Siehst du, es ist jetzt klar, aber lass es uns klarer machen Hier haben wir eine Menge ungenutzter Eingaben. Wir können sie entfernen. Zuerst entfernen wir die Codeeingabezeile Drücken Sie also Strg+X oder Befehlstaste+X, um die gesamte Zeile zu entfernen. Also entfernen wir Mongos und entfernen alle durchgeführten Importe , die alle nicht verwendet werden Sehen Sie, jetzt sieht unser Code sauberer einfacher zu skalieren aus, und wir alle lieben es, mit dieser Art von sauberen Anwendungen zu arbeiten So sollte der Code professioneller Entwickler aussehen. 206. Node-App für die Produktion vorbereiten: Bevor wir mit dem Bereitstellungsprozess beginnen, ist es besser, unsere Node-Anwendung für die Produktion vorzubereiten . Dafür benötigen wir also einige Pakete, wie zum Beispiel das erste ist Helmet. Das verwenden wir bereits in unserem vorherigen Projekt. Grundsätzlich wird der Helm zur Sicherheit unserer Anwendung verwendet . Dies ist eine hervorragende Option, um die Sicherheit unserer App mit minimaler Konfiguration zu verbessern . Außerdem schützt es unsere App vor häufigen Sicherheitslücken im Internet, indem richtigen STDP-Header Installieren Sie in unserem Terminal NPM Helmet und wenn Sie dieselbe Person wie ich verwenden möchten, können Sie die Rate 8.1 0.0 verwenden und die Jetzt ist ein anderes Paket Kompression. Dies ist auch ein sehr nützliches Paket für Knotenanwendungen. Wie wir wissen, müssen wir manchmal große Datenmengen an viele Benutzer senden. Zum Beispiel eine Liste von Beiträgen oder eine Liste von Nachrichten. Dieses Paket wird diese großen Datenmengen komprimieren und die Belastung beim Senden großer Datenmengen reduzieren. Also installiert NPM Compression auf d 1.8 0.0 und drückt Enter. Gut. Lassen Sie uns nun diese Pakete in unserer Anwendung implementieren. Keine Sorge, es sind nur zwei Kernlinien. Also hier im Starter-Ordner erstellen wir eine neue Datei namens prod dot js In dieser Datei importieren wir diese beiden Pakete. Also const, helm ist gleich helm erforderlich und const, compression ist gleich komprimieren erforderlich Wie zuvor exportieren wir Funktionen aus diesem Modul. Export von Modulpunkten entspricht also Der Export von Modulpunkten entspricht also der hier exportierten Funktion. Hier bekommen wir die App als Parameter, und darin wollen wir diese Mitte implementieren. App Dot U Helmet, das ist die Funktion, die wir nennen. Dadurch wird in unserer Anwendung nur ein Helm verwendet. Außerdem fügen wir app.us-Komprimierung hinzu, und wir rufen sie auch auf und fertig Mit diesen beiden Codezeilen wenden wir diese Pakete in unserer Sie können diesen Code auch in die Route Dot JS-Datei einfügen. Daran ist nichts falsch. Jetzt müssen wir dieses Modul nur noch in unsere Haupt-Indexpunkt-JS-Datei importieren . Hier vor diesen Routen benötigen wir einfach den Zeitraum DatabSPD, der diese Funktion zurückgibt Also müssen wir diese Funktion aufrufen und einfach Ihre App als Argument übergeben Stellen Sie sicher, dass es hinzugefügt wird, bevor diese Route importiert wird. Unser Helm und unsere Kompression gelten also für alle Routen, und das war's. Durch die Verwendung dieser beiden Zeilen können wir unsere Anwendung ein wenig verbessern. 207. Überblick über den Bereitstellungsprozess: Sehen wir uns den Überblick über den Bereitstellungsprozess an, damit wir nicht verwirrt werden. Derzeit ist unser Code auf unserem lokalen Computer verfügbar, oder wir können sagen, auf unserem Computer. Um unsere Anwendung jetzt im Internet verfügbar zu machen, verwenden wir die Render-Plattform. Zunächst laden wir unseren Code auf Github und verbinden dann unser Github-Repository mit unserem Dienst, dem Rendern. Mach dir darüber keine Sorgen. Es ist wirklich einfach. Ich werde alle Schritte auf einfache und unkomplizierte Weise erklären. Außerdem werden wir sehen, wie wir unseren Code aktualisieren können, nachdem wir unsere Anwendung bereitgestellt haben. Beginnen wir mit dem Hochladen der Node-Anwendung auf Github. 208. Hochladen der Node-Anwendung auf Github: Mal sehen, wie wir unser Projekt auf Github hochladen können. Falls Sie Github nicht kennen, kurz gesagt, es handelt sich um eine Website, auf der Entwickler Code speichern, teilen und mit anderen Entwicklern zusammenarbeiten können . Außerdem ermöglicht Github Entwicklern, ein Repository zu erstellen, oder wir können Repos aufrufen, in denen sie ihren Code speichern und Änderungen im Laufe der Zeit verfolgen können ihren Code speichern und Änderungen im Laufe der Zeit verfolgen Dies ist die beste und einfachste Möglichkeit für Teams, gemeinsam an demselben Projekt zu arbeiten gemeinsam an demselben Projekt ohne den Code des anderen zu überschreiben Es gibt also viele Möglichkeiten, unseren Code auf Github hochzuladen, aber wir werden uns den einfachsten und einfachsten Weg ansehen, nämlich die Verwendung der Github-Desktop-Anwendung Gehen Sie zum Browser und suchen Sie nach Github Desktop-Anwendung und öffnen Sie diesen ersten Link Klicken Sie nun auf die Schaltfläche Herunterladen. Das wird einige Zeit dauern. nach Abschluss dieses Downloads Öffnen Sie nach Abschluss dieses Downloads das Setup und unser Installationsvorgang wird gestartet. Gut. Wenn Sie diese Anwendung jetzt zum ersten Mal öffnen, müssen Sie sich mit Ihrem Github-Konto anmelden. Um Ihnen das zu zeigen, entferne ich mein Github-Konto aus der GitHub-Desktop-Anwendung Um sich anzumelden, gehen Sie zur Datei, öffnen Sie Optionen und klicken Sie auf dieses Zeichen auf forgitub.com Fahren Sie mit dem Browser fort. Dadurch werden wir auf die GitUBoffical-Website weitergeleitet. Geben Sie Ihren Benutzernamen und das Passwort Ihres Gitub-Accounts ein und klicken Ich muss mein Konto verifizieren und fertig. Und jetzt klicken Sie auf diese Open Github-Desktop-Anwendung. Es leitet uns automatisch zu unserer Anwendung weiter. Keine Sorge, Sie müssen es nur zum ersten Mal einrichten. Lassen Sie uns nun überprüfen, ob wir angemeldet sind oder nicht. Gehen Sie also erneut zu Datei und Optionen, und in den Konten können wir sehen, dass wir unsere Konten haben. Gehen Sie zur Git-Option und von hier aus können wir unseren Namen und unsere E-Mail-Adresse für unseren Github festlegen. Wenn wir also Code auf Github veröffentlichen, sehen andere Teammitglieder diesen Namen und diese E-Mail-Adresse. außerdem sicher, dass du hier deine offizielle E-Mail-Adresse auswählst und auf Speichern klickst. Bevor wir weitermachen, haben wir, wie wir wissen, in unserem Projekt einen Ordner mit Knotenmodulen. Wir möchten dies nicht auf Github veröffentlichen, da wir jederzeit mit dem Befehl NPM install den Ordner Node Module generieren können Befehl NPM install Es ist also nutzlos, wir laden den ganzen Ordner mit den Knotenmodulen hoch , der viele Dateien enthält Also müssen wir ignorieren, dass dieser Ordner auf Github hochgeladen wird. Dafür erstellen wir in unserem Projekt im Stammverzeichnis eine neue Datei namens dot git ignore. Stellen Sie sicher, dass Sie in diesem Dateinamen keinen Tippfehler machen. Es sollte Punkt Gitignore sein. In dieser Datei können wir nun hinzufügen, welche Dateien und Ordner wir ignorieren möchten, oder in einfachen Worten, welche Dateien und Ordner wir nicht auf Github hochladen möchten Nehmen wir an, wir wollen diesen Knotenmodulordner ignorieren, also schreiben wir Node Underscore modules, was der Ordnername ist, und einen Schrägstrich, der anzeigt, dass es sich um einen Ordner handelt In ähnlicher Weise möchten wir den Protokollordner ignorieren. Also, was schreiben wir? Schreiben Sie Logs mit einem Schrägstrich. Jetzt ist hier eine Sache Wenn wir unseren Code auf Github hochladen, wird dieser Code, wie wir wissen, öffentlich und jeder kann unser Projekt sehen. Nehmen wir nun an, wir laden unser Projekt hoch und dieser Donvfle wird auch auf Github hochgeladen Dadurch werden alle unsere geheimen Informationen veröffentlicht und jeder kann sie missbrauchen Also müssen wir auch diese Punkt-NV-Datei und Gitignore hinzufügen. Lassen Sie mich Ihnen eine kurze Anleitung zum Abrufen der Gate Ignore-Datei zeigen. Gehen Sie einfach zu Ihrem Browser und suchen Sie nach Get Ignore, Github. Öffnen Sie diesen ersten Link und hier erhalten wir alle Vorlagen für verschiedene Arten von Anwendungen. Lass Android Git ignorieren. Außerdem haben Sie C plus plus, C und viele weitere Dateien. Suchen Sie nun oben im Knoten Gitignore und öffnen Sie diese Datei Siehst du, hier bekommen wir den Inhalt der GETi Nur Datei. Kopieren Sie einfach diesen Code und fügen Sie diesen Code in unsere GETi-Nur-Datei Speichern Sie die Änderungen und wir haben unsere GETi Nur-Datei. Cool. Laden wir jetzt endlich unseren Code auf Github hoch. unseren Code zum Repository hinzuzufügen, gehen Sie zu Datei und wählen Sie Lokales Repository hinzufügen. Und hier wählen wir unseren Pfad zu unserer Inkifi-Anwendung aus. Jetzt heißt es hier, dass wir ein neues Repository erstellen müssen, also klicken Sie auf diesen Link Und hier müssen wir unseren Repository-Namen übergeben. Außerdem können wir hier eine Beschreibung schreiben. Dies ist die Social-Media-Anwendung und klicken Sie auf Repository erstellen. Lassen Sie uns nun überprüfen, ob wir den richtigen Weg hatten oder nicht. Klicken Sie also im Explorer auf Anzeigen und sehen Sie hier, dass wir unseren Linky-Five-Ordner erhalten . Schließen Sie ihn und klicken Sie einfach auf Veröffentlichtes Repository Hier können wir den Namen und die Beschreibung des Repositorys ändern und auch den Datenschutz für den Code auswählen Sie können es auch privat machen, aber ich möchte Ihnen diesen Code geben. Deshalb mache ich ihn öffentlich und klicke auf Veröffentlichen. Es wird einige Zeit dauern und fertig. Lass es uns auf Github sehen, also klicke auf View on Github und schau, hier bekommen wir unsere Bewerbung. Wunderbar. Sie können sehen, wie einfach es ist, Code auf Github hochzuladen. In der nächsten Lektion werden wir nun unser Renderkonto einrichten. 209. Bereitstellen der Node-App auf Render: Lassen Sie uns unsere Backend-Anwendung auf Render bereitstellen. Gehen Sie also zu render.com und zunächst registrieren wir hier unser Konto Wir können Google oder Github für die Registrierung verwenden oder wir können einfach E-Mail und Passwort verwenden, und wir haben dieses Dashboard. Mach dir darüber keine Sorgen. Klicken Sie einfach auf die Schaltfläche Neu und hier wählen wir den Webservice aus. Jetzt müssen wir hier unser Github-Konto verbinden. Also verbinde Glicon Github und logge dich mit deinem Github-Konto ein Stellen Sie sicher, dass Sie dasselbe Github-Konto verwenden , in dem wir unseren Backend-Code veröffentlichen Auf dieser Seite können wir auswählen, welches Repository wir zu unserem Renderkonto hinzufügen möchten Sie können auch das gesamte Repository hinzufügen, aber ich schlage vor, nur die ausgewählte Repository-Option auszuwählen . Von hier aus können wir das Repository auswählen, sodass wir unsere Inkifi-Anwendung auswählen können Dadurch werden wir nun zur Startseite des Dashboards weitergeleitet. Siehst du, jetzt haben wir hier unser Repositorium. Klicken Sie einfach auf dieses Repository und hier erhalten wir unser Formular. Jetzt fügen wir hier zunächst unseren Anwendungsnamen hinzu , der unser Linkifi ist Wir werden diesen Namen als Basis-URL unserer Anwendung verwenden. Als Nächstes haben wir eine Umgebung, die auf Knoten eingestellt ist. Ändere das nicht. Als Nächstes können wir den Zweig unseres Github-Repositorys auswählen , der Haupt- oder Master-Zweig ist. Wir können auch eine Region auswählen. Jetzt fügen wir für das Stammverzeichnis einen Punkt hinzu und für den Build-Befehl schreiben wir NPM install Für den Startbefehl fügen wir einfach Node Index Dot JS hinzu. Grundsätzlich wird Render mit diesem Befehl unsere Anwendung ausführen. Von unten wählen wir unseren Servicetyp aus, den wir kostenlos auswählen. Klicken Sie nun auf dieses erweiterte Drop-down-Menü und wählen Sie Geheime Datei hinzufügen und geben Sie ihr einen Namen, Punkt und V. Nun zurück zu unserem Wagon-Projekt, und darin öffnen wir dotyNvFle, in dem wir unsere geheimen Variablen haben Kopieren Sie einfach den gesamten Code und klicken Sie auf der Render-Website auf Inhalt und fügen Sie unseren Klicken Sie jetzt einfach auf Webservice erstellen und sehen Sie, wie unser Bereitstellungsprozess gestartet wird. Es wird einige Zeit in Anspruch nehmen, etwa fünf bis zehn Minuten. C, erfolgreich gebaut. Jetzt wird es bereitgestellt und danach erhalte ich eine Fehlermeldung bei einer guten B-Verbindung. Lass mich das überprüfen Es handelt sich um einen Fehler im Zusammenhang mit der DB-Variablen. Ich glaube, ich habe einen Fehler gemacht, als ich eine geheime Datei hinzugefügt habe. Also hier gehen wir zur Registerkarte Umgebung und lassen Sie mich hier den Dateiinhalt überprüfen. Es ist gut. Oh, hier gebe ich einen falschen Dateinamen ein. Es sollte dotNV sein. Ich habe diesen Fehler absichtlich erstellt, weil ich Ihnen zeigen möchte, wie Sie die Umgebung für einen Bus überprüfen Also die Änderungen und zurück zu Logstb. Hier wird der Bereitstellungsprozess erneut gestartet . Und hier bekommen wir wieder einen Fehler bei der Datenbankverbindung. Warum? Derzeit ist unsere Datenbank also eine lokale Datenbank, was bedeutet, dass sie auf unserem lokalen Computer funktioniert. Wenn wir jetzt eine Knotenanwendung bereitstellen, können wir nicht auf die lokale Datenbank zugreifen. Zu diesem Zeitpunkt müssen wir also eine Cloud-Datenbank hinzufügen, und das werden wir in der nächsten Lektion tun. 210. Hinzufügen von MongoDB Cloud: Derzeit haben wir in unserem Backend eine lokale Mongo Debe-Datenbank, daher müssen wir unsere Mongo Dibe-Datenbank in der Cloud erstellen Mongo Dibe-Datenbank Dadurch werden alle Benutzer dieselbe Datenbank verwenden. Gehen Sie also zu mongotib.com und melden Sie sich einfach mit Ihrem Konto Die Einrichtung dauert nur 1 Minute. Ich habe mich bereits angemeldet, also versuche ich hier, mich mit meinem Konto anzumelden . Gott sei Dank ist es geöffnet. Jetzt in der oberen linken Ecke, hier haben wir einen neuen Projekt-Button. Klicken Sie darauf und hier schreiben wir unseren Projektnamen , der unser Linky Fi ist, und klicken Sie auf Weiter Jetzt können wir von hier aus Teammitglieder zu unserem Projekt hinzufügen. Klicken Sie einfach auf Projekt erstellen. Klicken Sie nun auf die Schaltfläche Erstellen. Hier wählen wir den Plan aus, gehen einfach zur kostenlosen Version und klicken auf Create Deployment. Und hier erhalten wir unseren Benutzernamen und unser Passwort für unsere Datenbank. Also kopiere ich den ersten Benutzernamen und füge ihn in Note Paid hier ein. Kopieren Sie danach auch dieses zufällige Passwort und fügen Sie es ebenfalls ein. Dies ist der wichtigste Schritt. Wir können diesen Benutzernamen und dieses Passwort als Backup unserer Datenbank speichern . Klicken Sie nun auf Datenbank erstellen. Als nächstes klicken wir auf, wählen Sie eine Verbindungsmethode. Wählen Sie hier Compass aus. Sehen Sie, hier bekommen wir die Mangaib Connection URL für die Cloud. Keine Sorge, kopieren Sie einfach diesen Datenbank-Link und fügen in unsere ENV-Datei an der Stelle dieser lokalen Mangaibi-Tinte unseren MongoibCloud-Link und fügen in unsere ENV-Datei an der Stelle dieser lokalen Mangaibi-Tinte unseren MongoibCloud-Link ein. Außerdem habe ich hier vergessen, am Ende dieser URL einen Datenbanknamen hinzuzufügen am Ende dieser URL einen Datenbanknamen Stellen Sie also sicher, dass Sie es so hinzufügen. Okay? Lass uns jetzt weitermachen. Wir müssen Zugriff auf ein Netzwerk gewähren, das Daten in unserer Datenbank lesen und schreiben kann. Von überall aus kann der Benutzer auf unsere Datenbank zugreifen und Beiträge daraus abrufen. Gehen Sie auf der linken Seite zu Network Xs. Hier haben wir unsere aktuelle Adresse. Klicken Sie auf Bearbeiten und dann einfach auf Zugriff von überall zulassen. Du setzt unsere Adresse auf 0.0.0.0, das sind die Asse für alle und klickst auf Bestätigen Dies wird wenig Zeit in Anspruch nehmen und es wird sich herausstellen, dass es aktiv ist. Gut. Wenn Sie auch die den Datenbankzugriff Einstellungen für den Datenbankzugriff überprüfen möchten, z. B. das Passwort bearbeiten oder etwas anderes, können Sie dies von diesem Schritt aus tun. Lassen Sie uns nun überprüfen, ob eine Verbindung besteht oder nicht. Öffnen Sie also das Terminal und schreiben Sie node, index dot js und drücken Sie die Eingabetaste. Dies wird einige Zeit dauern und wir werden erfolgreich eine Verbindung herstellen, also funktioniert es. Jetzt müssen wir unseren bereitgestellten Code aktualisieren. Wie können wir das machen? Wir müssen einfach nur unseren Code auf Github übertragen und Render erkennt diese Änderungen automatisch Deshalb fügen wir kein Projekt zu Github hinzu. Jetzt ist hier eine Sache. Wir wissen, dass wir diese Dotty- und V-Datei beim Hochladen auf Github ignorieren diese Dotty- und V-Datei beim Hochladen auf die Werte der Umgebungsvariablen zu aktualisieren, müssen wir zur Render-Website gehen Hier wählen wir Umgebungsvariablen aus. Klicken Sie auf Bearbeiten und von hier aus können wir einfach unsere Werte bearbeiten. Ich ersetze die Datenbank-URL durch Cloud. Auch hier müssen Sie Ihren Datenbanknamen am Ende dieser URL hinzufügen . Klicken Sie nun auf, speichern, neu erstellen und bereitstellen. Gut. Wenn wir unsere Logs überprüfen, werden wir nach einiger Zeit wieder das Deployment Log erhalten. Und sehen Sie hier, wie wir Mongo erfolgreich mit B verbunden haben. Wunderbar. Lassen Sie uns nun probieren, ob unsere Anwendung tatsächlich funktioniert oder nicht. Also hier kopieren wir die Cspace-URL unserer bereitgestellten Anwendung. Öffnen Sie jetzt Postman, und darin duplizieren wir diese API zum Erstellen eines neuen Benutzers, weil wir nur die neue Datenbank erstellen, sodass wir unsere vorherigen Daten nicht darin haben Lassen Sie uns nun die lokale Host-URL mit unserer bereitgestellten Anwendungs-URL ändern und die Anfrage senden Sehen Sie, hier bekommen wir JWT Token, was bedeutet, dass unsere API funktioniert. Lassen Sie uns das überprüfen auf der Mongo Deb-Website zu unserer Linkify-App, hier finden wir Browse Colection und sehen, hier finden wir alle unsere Sammlungen, und wenn wir Siehst du, hier bekommen wir den neuen Benutzer. Wunderbar. Aber warte, während ich hier den Namen der Geschmacks-Datenbank finde. Ich glaube, ich habe vergessen, den Datenbanknamen in die Sammlungs-URL aufzunehmen. Gehen Sie zu den Umgebungsvariablen und klicken Sie auf Bearbeiten. Und ja, nach dieser URL füge ich Forward-SLAS hinzu und hier füge ich den Datenbanknamen Nehmen wir an, unser Linky fi und klicken Sie einfach auf Speichern, Neuerstellen und Bereitstellen Es wird unsere Anwendung neu erstellen und am Ende stellen wir eine Verbindung zu unserer Datenbank Lassen Sie mich die API noch einmal probieren, die neue Benutzeranfrage senden und hier erhalte ich ein neues Token. Gut. Gehen Sie jetzt zur Mongoib-Website und aktualisieren Sie die Datenbank. Siehst du, hier erhalte ich unsere Inkifi-Datenbank. Großartig. Lassen Sie mich Ihnen jetzt auch zeigen wie wir unseren Code aktualisieren und erneut bereitstellen können Was können wir also in unserem Projekt ändern? Lassen Sie uns diese Konsolenmeldung machen, Server läuft auf Portar PT Dies dient nur zur Demo Speichern Sie die Änderungen und aktualisieren Sie den Code beim Rendern Wir müssen nur unseren Code auf Github pushen, rendern, unsere Updates automatisch abrufen und erneut bereitstellen Also zurück zu unserer Github-Desktop-Anwendung, und hier übergeben wir die Commit-Nachricht Nehmen wir an, aktualisieren Sie die Konsolennachricht und klicken Sie auf Commit one file to main und drücken Sie am Ende einfach Origin. Jetzt gehen wir auf unserer Render-Website zum Deploy-Bereich, und hier können wir nach ein bis zwei Minuten sehen, dass es bereitgestellt wird und am Ende sehen wir, dass der Server auf Port Unser Port läuft, was bedeutet, dass unser Code erfolgreich aktualisiert wurde. Sie können sehen, dass der Bereitstellungsprozess wirklich einfach und unkompliziert ist. Sie müssen lediglich Ihren Code in das Github-Repository hochladen und dann mithilfe von Render werden wir unsere Anwendung schnell bereitstellen. Und wenn wir unsere Anwendung aktualisieren wollen, müssen wir nur die Änderungen auf Github übertragen und in den zwei bis drei Minuten wird unser Server neu gestartet und wir erhalten unsere Updates. 211. Was ist MVC-Architektur? [BONUS]: Wenn Sie als Entwickler arbeiten, dann haben Sie bestimmt schon von der MVC-Architektur in großen Projekten gehört MVC-Architektur in großen Projekten Schauen wir uns also an, was MVC-Architektur ist und warum wir sie brauchen. MVC steht also für Model View Controller. Im Grunde ist es eine Möglichkeit unseren Anwendungskern zu organisieren In Zukunft wird es also viel einfacher sein, die Anwendung zu verwalten, zu warten und zu skalieren. In einfachen Worten, es handelt sich eine Ordnerstruktur, die verschiedene Teile unserer Anwendung voneinander trennt. In der MVC-Architektur erstellen wir drei separate Ordner. Einer für das Modell, der zweite für die Ansicht und der dritte für den Controller Lass dich nicht verwirren. Es ist wirklich einfach. Der Modellordner ist also der Ort, an dem sich unsere Daten befinden. Hier müssen wir definieren, wie Daten strukturiert sein sollen und wie sie mit Ihrer Datenbank interagieren sollen. In der Node-Anwendung haben wir beispielsweise bereits einen Modellordner erstellt, in dem wir alle Modelle und Schemas für jede Mongo Be-Sammlung speichern und Schemas für jede Mongo Be-Sammlung Deshalb nennen wir diesen Ordner Als Nächstes haben wir den Ordner anzeigen. Ansicht bedeutet, was der Benutzer sieht. Es ist der UI-Teil unserer Anwendung. In der Node-Anwendung haben wir beispielsweise möglicherweise Template-Engines wie EJS oder PUG oder wir haben SDML- oder CSS-Dateien, die wir anzeigen möchten Wenn wir also Frontend-bezogenen Code haben, können wir diesen Code im View-Ordner speichern Jetzt haben wir endlich den Controller-Ordner. Im Controller-Ordner speichern wir die Logik unserer Anwendung. Wenn wir beispielsweise die Route unseres Benutzers öffnen, können wir hier sehen, dass es sich um eine ASN-Callback-Funktion handelt, die ausgeführt wird, wenn jemand eine Post-Anfrage an diesen Endpunkt sendet Post-Anfrage an diesen Das ist der logische Teil. Im Ordner des Controllers speichern wir die ASN-Funktionen separat und importieren sie dann einfach hier in die Routen Keine Sorge, wir müssen diese Funktionen einfach ausschneiden und einfügen Das werden wir in nur einer Minute sehen. Hier verstehen wir das MVC-Modell für Daten, Ansicht für Dinge im Zusammenhang mit der Benutzeroberfläche und den Controller für die Anwendungslogik Aber Sie fragen sich vielleicht, was ist der Sinn dieser MVC-Architektur Warum mögen es große Unternehmen? Wie wir wissen, arbeiten in großen Unternehmen große Teams an einer Anwendung. Wenn wir für jedes Teil wie Modell, Ansicht und Controller einen separaten Ordner erstellen, wird dies zu einer Trennung der einzelnen Bereiche führen. Durch die Trennung kann unser Code hier einfacher verwaltet werden. Angenommen, ein Team arbeitet an den Funktionen im Zusammenhang mit Beiträgen, ein zweites Team an Funktionen im Zusammenhang mit Zahlungen und ein anderes Team an den benutzerbezogenen Funktionen. Jedes Team musste sich nicht mit der Postmodelldatei , der Zahlungsmodelldatei oder der Benutzermodelldatei befassen. Sie werden an ihren einzelnen Funktionen arbeiten, und aus diesem Grund wird es nicht zu großen Konflikten kommen, wenn sie Code auf Github veröffentlichen. Ein weiterer Vorteil von MVC ist die einfache Wartung. Wir möchten das Modell aktualisieren, dann müssen wir die View-Dateien nicht aktualisieren Ein weiterer Vorteil ist, dass es viel einfacher zu skalieren ist. unsere App wächst, ist es einfacher, neue Funktionen hinzuzufügen , da alles bereits gut organisiert ist diesem Grund senken große Unternehmen und heutzutage auch Freiberufler diese MVC-Architektur Hier ist nun die Ordnerstruktur für die MVC-Architektur in Der erste ist unser Hauptprojektordner. Danach fügen wir die Indexpunkt-JS-Datei hinzu, die unsere Hauptdatei ist. Außerdem fügen wir andere Dateien oder Ordner hinzu, z. B. Package Dot Sn-Datei oder die Dot ENV-Datei oder den Middleware-Ordner Sie bleiben hier im Hauptordner Danach fügen wir allen Modellen, die wir speichern, den Modellordner hinzu. Als nächstes Ordner für alle UI-bezogenen Dateien und dann den Ordner Controllers für den gesamten Logikteil, und in Node JS haben wir den Ordner Routes. Also werden wir alle Routen in diesem Ordner hinzufügen. Nun, diese Ordnerstruktur ist gut für kleine oder mittlere Projekte, aber große Unternehmen wie Paypal und Netflix verwenden kaum eine andere Ordnerstruktur. Es liegt definitiv an Ihnen und Ihrem Unternehmen, welche Ordnerstruktur Sie wählen. Ich zeige Ihnen beide Möglichkeiten. Diese weitere Option ist etwas anders und eignet sich gut für Big Bend-Anwendungen. Hier sind wir der Hauptprojektordner. Darin hatten wir eine Indexpunkt-JS-Datei, die der Haupteinstiegspunkt unserer Anwendung ist. Außerdem haben wir ENV-Dateien, Package Dot JCNFLE Docker-Dateien und UploadedFles sowie Ordner, und UploadedFles sowie Ordner Danach fügen wir hier einen weiteren Ordner namens source oder SRC hinzu. Hier können wir unseren Middleware-Ordner, den Convey-Ordner und den Utils-Ordner usw. speichern source oder SRC hinzu. Hier können wir unseren Middleware-Ordner, den Convey-Ordner und den Utils-Ordner usw. speichern. Außerdem speichern wir im SRC-Ordner den Modulordner für jedes Modul, und in diesem Ordner können wir Ordner für jede Funktion wie Benutzerordner, Post-Ordner usw. hinzufügen und in diesem Ordner können wir Ordner für jede Funktion wie Benutzerordner, Post-Ordner usw. hinzufügen. In jedem Ordner können wir drei Dateien definieren user dot model dot gs user dot routes dot js und user dot controller dot So können wir eine weitere Datei hinzufügen: user dot service dot js. Diese Datei ist nicht verpflichtend, aber einige Unternehmen verwenden sie gerne. In dieser Servicedatei können wir Datenbankabfragen speichern. Es ist nicht zwingend erforderlich, diese Dot Service-Datei für Benutzer hinzuzufügen , aber einige Unternehmen fügen sie gerne hinzu. Auf diese Weise können wir auch vier Dateien für den Post-Ordner hinzufügen. Wenn wir eine neue Funktion wie ein Produkt hinzufügen möchten, erstellen wir hier im Modulordner den Ordner product, und dann können wir vier Dateien in den Produktordner hinzufügen. Wie wir sehen können, ist das sehr komplex, aber es ist wirklich gut für große und komplexe Anwendungen. Sie können verwenden, was Sie wollen. Es liegt ganz bei dir. Die Ordnerstruktur kann von Unternehmen zu Unternehmen etwas unterschiedlich sein. Sie sich darüber keine Sorgen. In der nächsten Lektion werden wir die MVC-Architektur in unserer Anwendung anwenden und dann diese Änderungen implementieren 212. MVC-Architektur anwenden [BONUS]: Lassen Sie uns nun die MVC-Architektur in unserem Linky Fi-Projekt anwenden in unserem Linky Derzeit haben wir in unserer Anwendung also eine sehr organisierte Struktur, da wir bereits den Modellordner und den Routenordner haben Hier benötigen wir keinen View-Ordner, da es keinen Template-Engine-Code gibt. Wir müssen also nur ein bisschen tun um ihn zu verwalten. Also lass uns das machen. Zuallererst erstellen wir hier einen Ordner namens SRC. Wenn Sie diesen Konfigurationsordner mögen, halten Sie die Strg- oder Befehlstaste gedrückt wählen Sie ihn bis zu den Stu-Ordnern Stellen Sie sicher, dass Sie diesen Node-Module-Ordner nicht verschieben. Gut. Lassen Sie uns nun sehen, was wir in der Index-JS-Datei ändern müssen. Meistens müssen wir die Teile der Eingabedatei ändern. Siehst du, hier haben wir diese Startpfade. Wir müssen es aktualisieren. Hier erstellen wir mehrere Cursor indem wir Alter oder Option gedrückt halten. Und füge hier SRC hinzu. Um sicherzugehen, dass wir diese Datei bekommen oder nicht, lass mich das überprüfen, indem ich diesen Dateinamen entferne Sehen Sie hier, wir bekommen Dateivorschläge, was bedeutet, dass es richtig ist Jetzt müssen wir nichts mehr im Index der JS-Datei ändern . Jetzt haben wir im SRC-Ordner bereits den Ordner Models und Routes Aber wie wir wissen, bewerben wir uns hier. Komplexe Node-Anwendungsstruktur. Also hier erstellen wir einen neuen Ordner namens modules. In diesem Modulordner müssen wir hauptsächlich vier Ordner erstellen, müssen wir hauptsächlich vier Ordner erstellen da wir hier vier Modelle haben. Lassen Sie uns zuerst einen Ordner namens Jet und dann einen weiteren Ordner namens Message erstellen . Dann noch einen Ordner für den Beitrag und den letzten Ordner für den Benutzer. Denken Sie jetzt daran, dass wir in jedem Ordner drei Dateien erstellen müssen. Also lass uns das machen. Zuerst verschieben wir die Benutzer-JS-Datei aus dem Modellordner und dann in den Benutzerordner. Hier benennen wir den Dateinamen in user dot model dot js um. Hier werden möglicherweise Aktualisierungseingaben angefordert. Stellen Sie sicher, dass Sie auf Ja klicken. Und wenn Sie dieses Menü nicht erhalten, müssen Sie es manuell tun. Lassen Sie uns nun die Datei „user dot js Route“ aus dem Routenordner verschieben und sie in den Benutzermodulordner verschieben. Jetzt fragt es nach einem Update. Sagen Sie hier, dass Sie den Route-Dateinamen des Benutzers dot js aktualisieren sollen. Lassen Sie uns diese Datei nun in den Benutzer dot routes dot js umbenennen. Siehst du, jetzt fragt es nicht nach einem Update. Keine Sorge, wir werden das manuell aktualisieren. Jetzt erstellen wir im Benutzermodulordner eine weitere Datei namens user dot controller dot js. Jetzt fragen Sie sich vielleicht, was wir dem Controller hinzufügen werden. Controller speichern wir die Logik unserer Anwendung. Es ist eine Sammlung von Callback-Funktionen unserer APIs. Lass mich dir das zeigen Hier in der Benutzerroute haben wir zuerst die API registriert, und das ist ihre Callback-Funktion Dies ist der Controller für diese Route. Schneiden Sie diese Callback-Funktion von hier aus und in der Controller-Datei müssen wir diese Funktion exportieren Cast-Register-Benutzer ist also gleich und hinter dieser Callback-Funktion Um diese Funktion zu exportieren, fügen wir ein Modul hinzu, dass Exporte dem Objekt entsprechen, da wir von hier aus mehrere Funktionen exportieren wollen Hier können wir also einen registrierten Benutzer zum registrierten Benutzer hinzufügen oder diesen entfernen. Speichern Sie diese Datei, und jetzt müssen wir diese Funktion zur Route des Benutzers hinzufügen. Also oben fügen wir die Kosten für den Benutzer hinzu, der Controller entspricht dem Erfordernis. Hier importieren wir aus dem Punkt mit dem Schrägstrich und dem Benutzer Dot Controller Jetzt fügen wir anstelle von API CallwayFunction einfach den Benutzercontroller hinzu und registrieren den Benutzer . Stellen Sie sicher, dass Sie diese Funktion hier nicht aufrufen, wir müssen eine Funktionsreferenz hinzufügen Lassen Sie uns jetzt dasselbe auch für andere APIs tun. Also schneide diesen Login-API-Controller ab. In unserer Datei definieren wir eine neue Funktion Die Kosten für die Anmeldung des Benutzers entsprechen dem Einfügen eines Callbacks hier. Als Nächstes haben wir diese API-Callback-Funktion. Und in unserer Controller-Datei erstellen wir eine neue Funktion Cost, get user ist gleich , es hier einzufügen. Ebenso müssen wir jede Callback-Funktion ausschneiden und in der Controller-Datei trennen Ich weiß, das ist ein bisschen besorgniserregend, also mach ein bisschen Musik und wir können das zusammen beenden Wenn Sie die Rückruffunktion , entspricht Cost, request, reset password in der Datei dem Einfügen hier. Wenn Sie die nächste Callback-Funktion ausschneiden, Cast Reset Password in der Datei entspricht Cast Reset Password in der Datei dem Einfügen hier Die nächste Callback-Funktion für Follow the user ausschneiden, und in der Datei Cast, follow user entspricht dem Einfügen hier Schneiden Sie nun die nächste Callback-Funktion aus, d. h. Ablehnen, Anfordern. In der Datei entspricht Cast, Reject , Follow, Request dem Einfügen hier. Ich habe jetzt die nächste Colbk-Funktion für Annahme einer Anfrage erhalten, und in der Datei entspricht der Wert cost except, follow request dem Wert Past it here Die nächste Callback-Funktion für die Follower-Liste ausschneiden und in der Datei const, get other user, follow, list entspricht Keine Sorge, wir haben nur noch wenige übrig. Schneide die nächste Callback-Funktion ab, um die folgende Liste aufzurufen. Und in der Datei const, get other user, folgende Liste entspricht dem Einfügen hier Schneide die nächste Callback-Funktion aus. Und in der Datei fügen wir Kosten hinzu und folgen dem Benutzer, um es hier einzufügen Zurück zur Routendatei benötigen wir außerdem diese allgemeine Cs-Funktion für die Registrierungs- und Anmelde-API. Also schneiden wir auch diese ganze Funktion aus und fügen sie in die Datei des Controllers ein. Hier haben Sie möglicherweise die Funktion zum Generieren von Tokens für überschüssiges Token und Verweis-Tokens für beide aktualisiert Funktion zum Generieren von Tokens für . Hier habe ich meinen alten Code, weil Updates sind, nachdem ich den Kurs veröffentlicht habe, aber mach dir keine Sorgen, es ist derselbe Prozess, schneide die ganze Funktion und das dt in der Controller-Datei aus. Wenn Sie eine Refresh-Route und eine Logout-Route haben, dann machen Sie dasselbe auch für diese APIs Hier müssen wir nur diese Funktionen exportieren und sie dann der Routen-Datei hinzufügen Nachdem wir den Benutzer registriert haben, fügen wir den Anmeldebenutzer hinzu, erhalten die Benutzeranfrage, das Passwort zurücksetzen, dem Benutzer folgen, ablehnen, der Anfrage folgen, akzeptieren, folgen, anfragen, anderen Benutzer abrufen, Liste folgen, anderen Benutzer abrufen, Liste folgen und den letzten Benutzer nicht mehr folgen Speichern Sie diese Datei, und in unserer Routendatei fügen wir den Benutzer euUser controller dot login hinzu Ich destrukturiere die Funktionen hier nicht , denn wenn einige neue Entwickler unseren Code sehen, er oder sie Nun, Benutzercontroller Punkt Gott Benutzer, Benutzer Controller, Punkt anfordern Passwort zurücksetzen, Benutzer-Controller Punkt Passwort zurücksetzen, Benutzer Controller Punkt Follower Benutzer Controller, Punkt Ablehnen, Folgen, Anfrage, Benutzer Controller, Punkt akzeptieren, Anfrage folgen, Anfrage folgen Benutzercontroller, Punkt Benutzer abrufen, Liste folgen. Als nächstes Benutzer Controller, Punkt andere Benutzer abrufen, folgende Liste und zuletzt Benutzer Controller Punkt Benutzer nicht mehr folgen Jetzt müssen wir die notwendigen Dinge für diese Controller importieren notwendigen Dinge für diese Controller Oben sehen wir alle ungenutzten Importe , die nach unten sortiert wurden. Wir können sie also zusammen sammeln, indem wir die Sauce nach unten bewegen und diese Importe einfach ausschneiden und sie ganz oben in die Controller-Datei einfügen . Gut. Jetzt müssen wir den Benutzermodellpfad aktualisieren, also ändern wir ihn in ein Benutzerpunktmodell mit Punktstrich, da er sich im aktuellen Ordner befindet Außerdem können wir sicherstellen, dass diese Pfade in Ordnung sind. Ja, die sind okay. Speichern Sie diese Datei. Und wenn wir unsere Routendatei überprüfen, sehen wir, dass sie sehr sauber aussieht. Auf diese Weise können wir API-Endpunkte mit API-Methoden sehr deutlich erkennen API-Endpunkte mit API-Methoden Jetzt müssen wir dasselbe auch für Jets und Post tun . Lass uns das schnell machen. Zuerst verschieben wir das Jet-Modell in den Jet-Module-Ordner und benennen den Dateinamen in Chat Dot Model Dot JS um. Lassen Sie uns die Chat-Route in den Ordner mit den Chat-Modulen verschieben und die Eingabe aktualisieren. Benennen Sie nun den Dateinamen chat dot Rous dot js um. Jetzt müssen wir eine neue Datei für Chat Dot Controller Dot JS erstellen Chat Dot Controller Dot JS Zurück zur Routen-Datei. Zuerst schneiden wir diesen ersten API-Callback und erstellen in der Controller-Datei eine neue Funktion Der Preis, Chats zu bekommen, entspricht dem Einfügen hier. Danach schneiden wir die nächste Callback-Funktion aus und in der Datei entspricht Cast get chat messages dem Einfügen hier. Als Nächstes schneiden wir die nächste Callback-Funktion aus, und in der Datei entspricht cost, create chat dem Einfügen hier Als Nächstes benötigen wir die API zum Senden von Nachrichten nicht die API zum Senden von Nachrichten , da wir sie mit Socket handhaben Wir können dieses Produkt entfernen jetzt haben wir die nächste Callback-Funktion und in der Datei entspricht cost create group dem Einfügen hier. Jetzt müssen wir diese Funktionen von hier aus exportieren. Am Ende entspricht der Modulexport Object, Gchat nach GChat, sodass wir die Getchat-Nachrichten entfernen, einen Chat erstellen und eine Gruppe erstellen können einen Chat erstellen und eine Gruppe erstellen Speichern Sie das und in der Routendatei geben wir hier die Kosten ein. Der Chat-Controller entspricht hier dem Wert require, der gleiche Chat-Punkt-Controller . Jetzt werden wir diese Funktionen in unseren APIs hinzufügen Also Chat-Controller, Punkt GAD-Jets, Chat-Controller, Punkt Nachrichten abrufen, Chat-Controller, Punkt Chat erstellen und letzter Chat-Controller Punkt Gruppe erstellen Jetzt schneiden wir diese Modellimporte von hier aus, speichern diese Datei und fügen sie in unsere Controller-Datei ganz oben ein. Gut. Jetzt müssen wir hier auch den Pfad dieser beiden Modelle aktualisieren. Also ändern wir den Pfad des Chat-Modells das Chat-Punktmodell mit einem Schrägstrich und für Nachricht A fügen wir das Nachrichtenmodell in den Nachrichtenmodulordner Also gehen wir einen Ordner weiter nach oben, Nachrichten-Slash-Nachrichten-Punktmodell. Speichern Sie diese Datei und wir müssen das Nachrichtenmodell in den Nachrichtenmodulordner verschieben Ändern Sie nun den Dateinamen in message dot model dot js. Jetzt müssen wir diesen Vorgang nur noch für unser letztes Post-Modul durchführen. Zuerst verschieben wir Post Model in den Post-Module-Ordner und benennen den Dateinamen in post model dot js um. Jetzt verschieben wir die Post-Route in den Post-Modul-Ordner, aktualisieren die Eingabe, benennen den Dateinamen posten Dot Routes Dot Js. Gut. Jetzt müssen wir eine neue Datei für Post Dot Controller dot js erstellen. Zurück zur Routen-Datei. Zuerst schneiden wir den ersten API-Callback und erstellen in der Controller-Datei eine neue Funktion Cast Create Post entspricht dem Einfügen hier. Danach schneiden wir neben Callback-Funktion ab und in der Datei Cast ist get my post gleich, um ihn hier einzufügen Schneiden Sie als Nächstes die nächste Callback-Funktion aus. Und in der Datei entspricht Cs get following post dem Posting hier. Als Nächstes schneiden wir eine weitere API-Callback-Funktion ab. Und in der Datei ist const, delete post gleich, und fügen Sie es Machen Sie sich nicht zu viele, nur die letzten Funktionen, die noch vor Ihnen liegen. Schneiden Sie die nächste Colbeg-Funktion und „Gefällt mir nicht“ zu markieren Und in der Datei, const, like, anders als post gleich ist, füge es hier Schneide die nächste Colbeg-Funktion aus. Und in der Datei fügen wir Kosten hinzu Kommentar hinzufügen entspricht dem Einfügen hier. Schneide die nächste Callback-Funktion aus. Und wieder fügen wir in der Datei Kosten hinzu, fügen einen Kommentar hinzu, antworten entspricht dem Einfügen hier. Und jetzt für die letzte API-Callback-Funktion, schneiden wir sie aus und in der Controller-Datei fügen wir Kosten hinzu, löschen den Kommentar, was dem Einfügen hier entspricht Jetzt müssen wir diese Funktionen exportieren. Das Modul Punktexporte entspricht im Objekt, Beitrag erstellen, Beitrag erstellen, Beitrag abrufen. Folgender Beitrag, Beitrag löschen, Beitrag liken, Kommentar hinzufügen, Kommentar hinzufügen, Kommentar hinzufügen, Antwort hinzufügen und Befehl löschen. Speichern Sie dies und in der Datei mit den Post-Routen oben fügen wir die Kosten hinzu, dass der Post-Controller dem Post-Dot-Controller für einen bestimmten Zeitraum entspricht dem Post-Dot-Controller für einen bestimmten Zeitraum Jetzt können wir in unserer API diese Controller hinzufügen, den Post-Controller kopieren und schreiben, postcontroller, dot create post, postcontroller, dot GET myPost, post Controller, dot GET following Post, post Controller, dot GET following Post, post Controller, dot delete Post Post Controller, Punkt, im Gegensatz zu Post, Post Controller, Dot Add Command, Post Controller, Punkt Add Kommentar antworten und Post Controller Punkt Gut. Lassen Sie uns nun die ungenutzten Importe aus der Routes-Datei ausschneiden. Speichern Sie diese Datei und in die Controller-Datei ganz oben fügen wir sie hier ein. Hier müssen wir nun diese beiden Pfade aktualisieren, Punkt, Schrägstrich, Post-Punkt-Modell, und für Benutzerpfad gehen wir einen Ordner nach oben, Benutzerordner, Shuser Dot Speichern Sie das, so wie wir sehen können, unsere Dateien sehen übersichtlicher aus Hier sind unsere Ordner für Modelle und Routen jetzt leer, sodass wir sie einfach löschen können, und ich denke, wir müssen den Pfad an einer weiteren Stelle aktualisieren, nämlich Routes Dot Jsle im Startordner Sehen Sie hier, der Pfad wurde nicht automatisch aktualisiert. Also hier ändern wir einfach den Pfad zu modules, user, slash user dot Routes Module posten Post-Dot-Routen und Module JET-Jett-Routen und fertig Großartig. Lassen Sie uns diesen Code jetzt schnell auf Github pushen. Dadurch kann unser Code automatisch bereitgestellt werden. Öffnen Sie also die Github-Desktop-Anwendung. Und hier bekommen wir alle Änderungen. Schreiben Sie die Commit-Nachricht. Und bestätige sie. Und endlich haben wir diesen Code einfach auf Github gestellt und das war's. Dieser wird automatisch bereitgestellt. So verwalten große Unternehmen in der Berufswelt ihren No-JS-Code. Außerdem kann es je nach Unternehmen oder Team, mit dem Sie zusammenarbeiten, einen etwas anderen Ansatz je nach Unternehmen oder Team, mit dem Sie zusammenarbeiten, Dies ist jedoch die gängigste Ordnerstruktur , die professionelle Entwickler heutzutage verwenden.