
So starten Sie schnell mit VUE3.0: Geben Sie ein und lernen Sie
Nest.js ist ein Back-End-Framework von Nodejs. Es kapselt Express- und andere HTTP-Plattformen, um Architekturprobleme zu lösen. Es bietet MVC, IOC, AOP und andere Architekturfunktionen, die Express nicht bietet, wodurch der Code einfacher zu warten und zu erweitern ist.
Was bedeuten hier MVC, IOC und AOP? Schauen wir sie uns separat an:
MVC ist die Abkürzung für Model View Controller. Unter der MVC-Architektur wird die Anfrage zunächst an den Controller gesendet, der den Dienst der Modellschicht versendet, um die Geschäftslogik zu vervollständigen, und dann die entsprechende Ansicht zurückgibt.

Nest.js stellt den @Controller-Dekorator zur Verfügung, um Controller zu deklarieren:

Der Dienst wird mit dem @Injectable-Dekorator deklariert:

Über @Controller- und @Injectable-Dekoratoren deklarierte Klassen werden von Nest.js gescannt, entsprechende Objekte werden erstellt und einem Container hinzugefügt. Alle diese Objekte werden automatisch gemäß den im Konstruktor deklarierten Abhängigkeiten injiziert, d. h. DI (Abhängigkeit). inject) ), diese Idee wird IOC (Inverse Of Control) genannt.
Der Vorteil der IOC-Architektur besteht darin, dass keine Notwendigkeit besteht, Objekte manuell zu erstellen und sie basierend auf Abhängigkeiten an die Konstruktoren verschiedener Objekte zu übergeben. Alles wird automatisch gescannt, erstellt und injiziert.
Darüber hinaus bietet Nest.js auch die Fähigkeit von AOP (Aspect Oriented Programming), also der Fähigkeit der aspektorientierten Programmierung:
Was bedeutet AOP? Was ist aspektorientierte Programmierung?
Eine Anfrage kann die Logik von Controller, Dienst und Repository (Datenbankzugriff) durchlaufen:

Wenn Sie diesem Anruflink eine allgemeine Logik hinzufügen möchten, wie sollten Sie diese hinzufügen? Wie Protokollierung, Berechtigungskontrolle, Ausnahmebehandlung usw.
Man kann sich leicht vorstellen, den Controller-Layer-Code direkt umzuwandeln und diese Logik hinzuzufügen. Das funktioniert, ist aber nicht elegant, da diese allgemeinen Logiken in die Geschäftslogik eindringen. Können wir Protokolle, Berechtigungen usw. transparent zu diesen Geschäftslogiken hinzufügen?
Ist es möglich, eine Stufe hinzuzufügen, um vor und nach dem Aufruf des Controllers eine gemeinsame Logik auszuführen?
Zum Beispiel:

Solche horizontalen Erweiterungspunkte werden Aspekte genannt, und diese Programmiermethode, die transparent etwas Aspektlogik hinzufügt, wird AOP (aspektorientierte Programmierung) genannt.
Der Vorteil von AOP besteht darin, dass es einige allgemeine Logik in Aspekte aufteilen und die Geschäftslogik rein halten kann. Auf diese Weise kann die Aspektlogik wiederverwendet und dynamisch hinzugefügt und gelöscht werden.
Tatsächlich ist das Zwiebelmodell der Express-Middleware auch eine Implementierung von AOP, weil Sie eine äußere Schicht transparent umhüllen und etwas Logik hinzufügen können, während die innere Schicht nicht wahrnehmbar ist.
Nest.js bietet mehr Möglichkeiten zur Implementierung von AOP, insgesamt gibt es fünf, darunter Middleware, Guard, Pipe, Inteceptor, ExceptionFilter:,
Nest.js basiert auf Express und kann natürlich Middleware verwenden, wurde jedoch weiter unterteilt. , unterteilt in globale Middleware und Routing-Middleware:
Einige Verarbeitungslogiken werden vor und nach der Anforderung hinzugefügt.

Routing-Middleware ist für eine bestimmte Route mit kleinerem Umfang vorgesehen:

Dieses Konzept übernimmt Express direkt und ist leichter zu verstehen.
Werfen wir einen Blick auf einige erweiterte Konzepte von Nest.js, z. B. Guard:
Guard bedeutet Routing Guard. Es kann verwendet werden, um Berechtigungen vor dem Aufruf eines Controllers zu ermitteln und true oder false zurückzugeben, um zu entscheiden, ob Folgendes freigegeben werden soll:

So erstellen Sie einen Guard:

Guard muss die CanActivate-Schnittstelle und die canActive-Methode implementieren. Er kann die angeforderten Informationen aus dem Kontext abrufen und dann einige Berechtigungsüberprüfungen und andere Verarbeitungen durchführen, bevor er true oder false zurückgibt.
Fügen Sie es über den @Injectable-Dekorator zum IOC-Container hinzu und aktivieren Sie es dann in einem Controller:

Der Controller selbst muss nicht geändert werden, aber die Logik der Berechtigungsbeurteilung wird transparent hinzugefügt. Dies ist der Vorteil der AOP-Architektur.
Und genau wie Middleware globale und Routenebenen unterstützt, kann Guard auch global aktiviert werden:

Guard kann die Zugriffskontrolllogik des Routings abstrahieren, aber keine Anforderungen und Antworten ändern. Diese Logik kann Interceptor verwenden:
bedeutet Interceptor. Sie können vor und nach der Ziel-Controller-Methode etwas Logik hinzufügen.

So erstellen Sie einen Inteceptor:

Interceptor muss die NestInterceptor-Schnittstelle und die Intercept-Methode implementieren, um den Ziel-Controller aufzurufen. Sie können vorher und nachher eine Verarbeitungslogik hinzufügen.
Die Verarbeitungslogik vor und nach dem Controller kann asynchron sein. Nest.js organisiert sie über rxjs, sodass Sie verschiedene Operatoren von rxjs verwenden können.
Interceptor unterstützt die individuelle Aktivierung jeder Route, was nur einen bestimmten Controller betrifft, und unterstützt auch die globale Aktivierung, die alle Controller betrifft:


Neben der Berechtigungssteuerung von Routen und der Verarbeitung vor und nach dem Zielcontroller, die alle eine gemeinsame Logik darstellen, ist auch die Verarbeitung von Parametern eine gemeinsame Logik, sodass Nest.js auch die entsprechenden Aspekte extrahiert, nämlich Pipe:
Pipe bedeutet Pipe und wird zur Überprüfung und Konvertierung von Parametern verwendet:

So erstellen Sie eine Pipe:

Pipe muss die PipeTransform-Schnittstelle und die Transformationsmethode implementieren, die eine Parameterüberprüfung des eingehenden Parameterwerts durchführen kann, z. B. ob Format und Typ korrekt sind. Wenn sie nicht korrekt sind, wird eine Ausnahme ausgelöst. Sie können auch eine Konvertierung durchführen und den konvertierten Wert zurückgeben.
Es gibt 8 integrierte Pipes, deren Bedeutung aus den Namen ersichtlich ist:
ValidationPipeParseIntPipeParseBoolPipeParseArrayPipeParseUUIDPipeDefaultValuePipeParseEnumPipeParseFloatPipeEbenso kann Pipe nur auf einer bestimmten Route oder auf jeder Route wirksam werden:


Unabhängig davon, ob Pipe, Guard, Interceptor oder der Controller schließlich aufgerufen werden, können während des Prozesses einige Ausnahmen ausgelöst werden. Wie reagiert man auf bestimmte Ausnahmen?
Diese Zuordnung von Ausnahmen zu Antworten ist auch eine gängige Logik, die Nest.js mit ExceptionFilter unterstützt:
ExceptionFilter kann ausgelöste Ausnahmen verarbeiten und entsprechende Antworten zurückgeben:

Die Form zum Erstellen von ExceptionFilter ist wie folgt:

Zuerst müssen Sie die ExceptionFilter-Schnittstelle und die Catch-Methode implementieren, um Ausnahmen abzufangen. Allerdings müssen Sie mit dem @Catch-Dekorator deklarieren, welche Ausnahmen Sie abfangen möchten Benutzer eine freundlichere Eingabeaufforderung.
Natürlich werden nicht alle Ausnahmen behandelt. Nur Ausnahmen, die HttpException erben, werden von ExceptionFilter behandelt. Nest.js verfügt über viele integrierte Unterklassen
NotImplementedExceptionServiceUnavailableExceptionConflictExceptionBadRequestExceptionUnauthorizedExceptionNotFoundExceptionForbiddenExceptionNotAcceptableExceptionGoneExceptionPayloadTooLargeExceptionUnsupportedMediaTypeExceptionUnprocessableExceptionInternalServerErrorExceptionBadGatewayExceptionRequestTimeoutExceptionGatewayTimeoutExceptionNatürlich können Sie es auch selbst erweitern:

Nest.js realisiert auf diese Weise die Entsprechung zwischen Ausnahmen und Antworten. Solange im Code unterschiedliche HttpExceptions ausgelöst werden, werden die entsprechenden Antworten zurückgegeben, was sehr praktisch ist.
In ähnlicher Weise kann ExceptionFilter auch wählen, ob es global oder auf einer bestimmten Route wirksam werden soll:
einer bestimmten Route:

Global:

Wir verstehen den von Nest.js bereitgestellten AOP-Mechanismus, aber wie ist ihre Reihenfolgebeziehung?
Middleware, Guard, Pipe, Interceptor und ExceptionFilter kann eine bestimmte Verarbeitungslogik transparent zu einer bestimmten Route oder allen Routen hinzugefügt werden. Dies ist der Vorteil von AOP.
Aber wie ist die sequentielle Beziehung zwischen ihnen?
Die Aufrufbeziehung hängt vom Quellcode ab.
Der entsprechende Quellcode lautet wie folgt:

Wenn Sie diese Route betreten, wird natürlich zuerst Guard aufgerufen, um festzustellen, ob eine Berechtigung usw. vorliegt. Wenn keine Berechtigung vorliegt, wird hier eine Ausnahme ausgelöst:

Die ausgelöste HttpException wird von ExceptionFilter behandelt.
Wenn Sie über die entsprechende Berechtigung verfügen, wird der Interceptor aufgerufen. Der Interceptor organisiert eine Kette, ruft einen nach dem anderen auf und ruft schließlich die Controller-Methode auf:

Vor dem Aufruf der Controller-Methode wird Pipe zur Verarbeitung der Parameter verwendet:

Jeder Parameter wird konvertiert:

Es ist leicht, sich den Aufrufzeitpunkt von ExceptionFilter vorzustellen, der darin besteht, die Ausnahme zu behandeln, bevor er antwortet.
Middleware ist ein Express-Konzept, Nest.js erbt es einfach und wird auf der äußersten Ebene aufgerufen.
Dies ist die Aufrufsequenz dieser AOP-Mechanismen. Sobald Sie diese Dinge geklärt haben, werden Sie Nest.js gut verstehen.
Nest.js basiert auf der Express-HTTP-Plattform und wendet Architekturideen wie MVC, IOC und AOP an.
MVC ist die Aufteilung von Model- und View-Controller. Die Anforderung durchläuft zunächst den Controller, ruft dann den Dienst und das Repository der Modellschicht auf, um die Geschäftslogik zu vervollständigen, und gibt schließlich die entsprechende Ansicht zurück.
IOC bedeutet, dass Nest.js automatisch Klassen mit @Controller- und @Injectable-Dekoratoren scannt, ihre Objekte erstellt und die Objekte, von denen es abhängt, automatisch basierend auf Abhängigkeiten einfügt, wodurch die Mühe des manuellen Erstellens und Zusammenstellens von Objekten entfällt.
AOP extrahiert allgemeine Logik und fügt sie über Aspekte an einer bestimmten Stelle hinzu. Es kann Aspektlogik wiederverwenden und dynamisch hinzufügen und löschen.
Die Middleware, Guard, Interceptor, Pipe und ExceptionFileter von Nest.js sind allesamt Implementierungen von AOP-Ideen. Sie können alle flexibel auf eine bestimmte Route oder alle Routen angewendet werden.
Wir haben uns ihre Aufrufsequenz anhand des Quellcodes angesehen. In der äußersten Ebene wird Guard zuerst aufgerufen, um zu bestimmen, ob die Route Zugriffsberechtigungen hat Der Interceptor wird aufgerufen, um die Logik hin und her zu erweitern und Pipe aufzurufen, um Parameter zu überprüfen und zu konvertieren, bevor der Zielcontroller erreicht wird. Alle HttpException-Ausnahmen werden von ExceptionFilter behandelt und geben unterschiedliche Antworten zurück.
Nest.js nutzt diese AOP-Architektur, um eine lose gekoppelte, einfach zu wartende und erweiterbare Architektur zu erreichen.
Haben Sie die Vorteile der AOP-Architektur gespürt?