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.