‫Kursleiter: In Ordnung, also lassen Sie uns nun
‫diese neuen Benutzer erstellen, basierend auf dem Modell, das wir
‫gerade im letzten Video implementiert haben.
‫Wir werden also die meisten benutzerbezogenen Dinge tun,
‫wie das Erstellen neuer Benutzer, das Anmelden
‫von Benutzern oder das Aktualisieren von Passwörtern im Authentifizierungs-Controller.
‫Alle Dinge, die wirklich mit Authentifizierung zu tun haben, befinden
‫sich also nicht in dem Benutzer-Controller, den
‫wir zuvor erstellt
‫haben, sondern wir werden stattdessen einen Authentifizierungs-Controller erstellen.
‫Alle Funktionen, die sich auf
‫die Authentifizierung beziehen, werden also hier abgelegt.
‫Und das wird später etwas mehr Sinn machen,
‫wenn wir dann alle Funktionen verwenden, die
‫ich hier einfügen werde.
‫Und jetzt müssen wir
‫als erstes unseren Benutzer importieren, also
‫natürlich unser Benutzermodell, und das ist
‫eine Ebene höher, dann sollte es in den Modellen und dann im
‫Benutzermodell sein.
‫Gut.
‫Lassen Sie uns also unseren allerersten Controller erstellen und exportieren.
‫Und ich werde dies eine Anmeldung nennen.
‫Sie sehen also, dass ich es nicht "Benutzer erstellen" nenne,
‫wie ich es in einem Tour-Controller
‫getan habe, sondern ich nenne es wirklich "signup",
‫weil dies der Name ist, der im Zusammenhang
‫mit der Authentifizierung etwas mehr Bedeutung hat.
‫Es wird also natürlich eine asynchrone Funktion sein,
‫weil wir einige Datenbankoperationen durchführen werden.
‫Dann anfordern, antworten und wie immer
‫weiter, und dann legen wir hier den neuen Benutzer an.
‫Das ist also sehr ähnlich zu dem, was wir vorher gemacht haben.
‫Diesmal heißt es also newUser, und erinnern
‫Sie sich dann daran,
‫wie wir ein neues Dokument basierend auf einem Modell erstellen.
‫Also verwenden wir natürlich den
‫Modellnamen, der in diesem Fall User
‫ist, und dann verwenden wir die create-Methode.
‫Und dann müssen wir
‫nur noch ein Objekt mit den Daten
‫übergeben, aus denen der Benutzer erstellt werden soll.
‫Und so wie zuvor sind diese Daten tatsächlich in req. Karosserie.
‫All dies wird also ein Versprechen
‫zurückgeben, und das müssen wir abwarten, und das
‫ist der Grund, warum dies eine asynchrone Funktion ist.
‫Und ich sehe hier oben, wir brauchen Exporte.
‫Und jetzt im nächsten Schritt werden
‫wir diesen neuen Benutzer dann tatsächlich an den Client senden.
‫Also res. status, der 201 für erstellt ist,
‫und dann unser JSON-Objekt.
‫Das ist also wieder
‫Erfolg, und dann unsere Dateneigenschaft, die hier wieder
‫Umschlag genannt
‫wird, also eine Eigenschaft, die die Daten selbst enthält.
‫Und die Daten heißen jetzt user,
‫während sie vorher Tour hießen,
‫und was wir hier einsenden werden, ist der newUser.
‫Speichern Sie es, und bevor Sie dies
‫ausprobieren, denken Sie daran, dass dies eine asynchrone Funktion
‫ist und wir hier über die Fehlerbehandlung nachdenken müssen.
‫Was müssen wir hier also tun?
‫Nun, wir müssen diese gesamte Funktion, die
‫wir gerade erstellt haben, in die catchAsync-Funktion einschließen, die wir
‫im letzten Abschnitt erstellt haben.
‫Denken Sie also daran, wie wir das im tourController gemacht
‫haben, wo alle asynchronen Funktionen
‫in diese catchAsync-Funktion eingebunden sind, damit wir
‫den try-catch-Block
‫hier nicht in jede einzelne Funktion schreiben müssen.
‫Erinnern Sie sich an den letzten Abschnitt?
‫Also werde ich
‫eigentlich weitermachen und diese Anforderungserklärung hier kopieren.
‫Also manchmal ein
‫bisschen faul, keine Lust, immer wieder den
‫gleichen Code zu schreiben, also catchAsync, und dann
‫müssen wir das hier am Ende schließen.
‫Und jetzt müssen
‫wir nur noch die Route implementieren,
‫damit dieser Signup-Handler hier dann aufgerufen werden kann.
‫Kommen wir also zu unseren
‫userRoutes, die wir eigentlich schon vor einiger Zeit erstellt haben, und
‫wir haben hier schon einige Routen drin.
‫Aber eigentlich werde ich hier jetzt einen neuen erstellen.
‫Und wie ich gleich zu Beginn dieses Videos erwähnt
‫habe, unterscheidet sich die Benutzerressource ein wenig
‫von allen anderen Ressourcen.
‫Auch hier, weil es wirklich mit allem zu tun hat,
‫was mit der Authentifizierung zu tun hat.
‫Und so haben wir dafür einen
‫anderen Controller, also den authController, die Funktionsnamen haben auch
‫andere Namen, und
‫so haben wir eigentlich auch eine spezielle Route.
‫Sagen wir Router. post, und dann
‫erstellen wir eine Route für die Anmeldung, also /signup, und
‫dann verwenden wir hier die
‫Funktion, die wir gerade erstellt haben.
‫Bevor wir das
‫tun können, müssen wir natürlich diesen Authentifizierungscontroller benötigen.
‫Lassen Sie uns diese Zeile hier
‫einfach duplizieren und user an zwei Stellen ersetzen, und hier haben wir
‫unseren authController, und verwenden wir
‫ihn jetzt. Anmelden.
‫Wie Sie
‫sehen, ist die Anmeldung wirklich ein besonderer Endpunkt.
‫Es passt nicht zu der REST-Architektur, über
‫die wir zuvor gesprochen haben, weil es in diesem
‫Fall nicht viel Sinn macht.
‫Denken Sie also daran, wie wir gesagt
‫haben, dass wir in
‫einigen speziellen Fällen natürlich andere Endpunkte erstellen
‫können, die nicht zu 100% zu der hier im Wesentlichen implementierten REST-Philosophie passen.
‫Dies folgt hier natürlich
‫zu 100% der REST-Philosophie, bei der der Name der URL nichts
‫mit der tatsächlich ausgeführten Aktion zu tun hat.
‫Hier oben ist es natürlich so.
‫Der Name der Route lautet also
‫Anmeldung, weil wir Benutzer anmelden.
‫Und auch hier unten haben wir all
‫diese verschiedenen HTTP-Warps implementiert, aber hier
‫für die Anmeldung brauchen wir wirklich nur POST.
‫Wir können also keine Daten von der Anmeldung abrufen oder
‫eine Anmeldung nicht patchen, also aktualisieren Sie sie nicht.
‫Das macht nicht wirklich Sinn, und in diesem Fall wollen
‫wir nur eine
‫Route für die Anmeldung haben, auf
‫der wir nur Daten POST können.
‫Denn auch hier macht es
‫nur Sinn, tatsächlich Daten an diese Route zu
‫senden, damit dann der neue Benutzer angelegt wird.
‫Und wir werden verschiedene Routen haben, die dieser ähnlich
‫sind, z. B. für die Anmeldung
‫oder das Zurücksetzen des Passworts und alle möglichen Dinge dieser Art.
‫Und wir werden diese
‫Routen auch hier behalten, also die in einem
‫eher REST-Format, denn es gibt auch die
‫Möglichkeit, dass ein Systemadministrator alle Benutzer
‫basierend auf ihrer ID aktualisiert oder löscht oder erhält.
‫Aber darum kümmern wir uns später, denn jetzt wollen wir
‫nur alle Funktionen implementieren, die sich mit
‫der Authentifizierung beschäftigen.
‫Also grundsätzlich Funktionen, die nur für den Nutzer
‫selbst relevant sind.
‫Es ist also kein Admin, der einen Benutzer
‫anmeldet, oder es ist kein Admin, der einen Benutzer
‫anmeldet, sondern es ist der eigene
‫Benutzer, der sich selbst anmeldet oder sich selbst einloggt.
‫Okay, macht das Sinn?
‫Wir sollten also jetzt alles an Ort
‫und Stelle haben, damit es jetzt funktionieren sollte, wenn wir unseren neuen Benutzer erstellen.
‫Also wenn wir uns im Grunde für unsere Bewerbung anmelden.
‫Also versuchen wir es jetzt.
‫Lassen Sie uns einfach diese URL
‫und die Benutzer kopieren und dann registrieren.
‫Dann müssen wir den Body
‫angeben, sagen wir raw und dann JSON.
‫Und natürlich nicht vergessen, diesen auf POST
‫zu setzen.
‫Welche Daten brauchen wir hier also?
‫Denken Sie daran, zuerst ist
‫der Name, dann die E-Mail, und
‫ich trage meine eigenen hier ein, dann das Passwort, und lassen Sie uns
‫hier einfach etwas tun, es spielt keine Rolle.
‫Und wieder werden wir etwas später über
‫die Passwortverwaltung sprechen,
‫und zwar gleich im nächsten Video.
‫Also sollte dieser hier jetzt gleich sein.
‫Also pass1234, nur als Test.
‫Und das Erinnerungsfoto ist nicht erforderlich, und
‫deshalb mache ich das nicht.
‫Also lass uns jetzt sehen.
‫Und jetzt bekommen wir diesen Fehler
‫hier, und das liegt daran, dass ich das Passwort hier falsch geschrieben habe.
‫Okay, das wäre also die deutsche Schreibweise.
‫Und jetzt ist es richtig.
‫Okay, und tatsächlich bekommen wir hier unseren neuen Benutzer.
‫Perfekt.
‫Nehmen wir nun an, dass wir dies mit einem GET versucht haben.
‫Was würden wir bekommen?
‫Nun, "Diese Route
‫ist noch nicht definiert", was daran
‫liegt, dass wir diese Route
‫hier eigentlich schon definiert haben, also im Grunde diesen
‫Teil hier der Route, also lass
‫mich dir das schnell zeigen, also ist
‫es nicht im tourController, sondern in der userController.
‫Im Grunde haben wir hier getUser
‫und dann "Diese Route ist noch nicht definiert. „Das ist also das, was wir bekommen,
‫aber das
‫interessiert uns natürlich nicht wirklich.
‫Und lass uns das jetzt hier bei Postman speichern,
‫damit wir es dann einfach wiederverwenden können.
‫Also melde dich an.
‫Und jetzt, um
‫es schnell zu bestätigen, öffnen wir es
‫auch hier in Compass und sehen nur, dass wir zu diesem
‫Zeitpunkt nur Touren haben, und gehen wir also hier zu Natours,
‫versuchen Sie es neu zu laden, und das ist wahrscheinlich hier oben, und so Tatsächlich bekommen
‫wir jetzt unsere Benutzersammlung hier.
‫Also lasst uns das öffnen, und tatsächlich bekommen wir
‫jetzt unser erstes Dokument hier.
‫Also der Benutzer, den wir gerade erstellt haben.
‫Jetzt können Sie hier das einfache
‫Passwort sehen, und das ist natürlich nicht ideal.
‫Und das ist natürlich nicht ideal,
‫daher sollten Passwörter in
‫einer Webanwendung niemals einfach in einer Datenbank gespeichert werden.
‫Es gibt also eine Menge Passwortverwaltung, die hinter den
‫Kulissen durchgeführt werden muss, und genau das werden wir
‫im nächsten Video tun.