Heim > Artikel > Web-Frontend > Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile
Dieser Artikel führt Sie durch die AOP-Architektur von Node, dem Back-End-Framework Nest.js, und stellt die Vorteile der Nest.js-AOP-Architektur vor. Ich hoffe, dass er für alle hilfreich ist!
Nest.js ist ein Nodejs-Backend-Framework. Es kapselt HTTP-Plattformen wie Express, 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 MVC, IOC und AOP hier? Werfen wir einen Blick darauf:
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 @Controller-Dekorator zur Verfügung, um Controller zu deklarieren:
und Service verwendet @Injectable-Dekorator, um Folgendes zu deklarieren:
Klasse, die über @Controller, @Injectable-Dekorator deklariert wurde. Es wird gescannt von Nest.js, entsprechende Objekte werden erstellt und einem Container hinzugefügt. Alle diese Objekte werden automatisch gemäß den im Konstruktor deklarierten Abhängigkeiten eingefügt (DI (Abhängigkeitsinjektion). Diese Idee wird als IOC (Inverse Of Control) bezeichnet.) .
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 Aufruflink eine gemeinsame Logik hinzufügen möchten, wie sollten Sie sie hinzufügen? Wie Protokollierung, Berechtigungskontrolle, Ausnahmebehandlung usw.
Am einfachsten ist es, 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:
Ein solcher horizontaler Erweiterungspunkt wird als Aspekt bezeichnet, und diese transparente Programmiermethode, die eine Aspektlogik hinzufügt, wird als AOP (aspektorientierte Programmierung) bezeichnet.
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 das Zwiebelmodell Die AOP-Implementierung von Express ist ebenfalls dieselbe, da Sie eine Ebene transparent umschließen und etwas Logik hinzufügen können, ohne dass die innere Ebene davon Kenntnis hat.
Und Nest.js hat mehr Möglichkeiten, AOP zu implementieren, insgesamt gibt es fünf, darunter Middleware, Guard, Pipe, Inteceptor, ExceptionFilter:,
Nest.js basiert auf Express und kann natürlich Middleware verwenden, aber Es ist weiter unterteilt in globale Middleware und Routing-Middleware:
Globale Middleware ist die Middleware von Express. Vor und nach der Anfrage wird etwas Verarbeitungslogik hinzugefügt:
Routing-Middleware ist für eine bestimmte Route , mit kleinerem Umfang:
Dies übernimmt direkt das Konzept von Express und ist leichter zu verstehen.
Werfen wir einen Blick auf einige erweiterte Konzepte von Nest.js, wie zum Beispiel Guard:
Guard
Die Art und Weise, Guard zu erstellen, ist wie folgt:
Guard muss die CanActivate-Schnittstelle und die canActive-Methode implementieren. Es kann die angeforderten Informationen aus dem Kontext abrufen und dann einige Berechtigungsüberprüfungen und andere Verarbeitungen durchführen, bevor es „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 AOP Die Vorteile der Architektur.
Und genau wie Middleware die globale Ebene und die Routing-Ebene unterstützt, kann Guard auch global aktiviert werden:
Guard kann die Zugriffskontrolllogik des Routings abstrahieren, aber keine Anfragen und Antworten ändern. Diese Art von Logik kann verwendet werden Interceptor:
Interceptor bedeutet Interceptor. Sie können vor und nach der Ziel-Controller-Methode etwas Logik hinzufügen:
Die Art und Weise, einen Inteceptor zu erstellen, ist wie folgt:
Interceptor So implementieren Sie die NestInterceptor-Schnittstelle , implementieren Sie die Intercept-Methode, rufen Sie next.handle() auf, um den Ziel-Controller aufzurufen, und Sie können davor und danach eine Verarbeitungslogik hinzufügen.
Controller Die Verarbeitungslogik davor und danach kann asynchron sein. Nest.js organisiert sie über rxjs, sodass Sie verschiedene Operatoren von rxjs verwenden können.
Interceptor unterstützt die unabhängige Aktivierung jeder Route, die nur auf einen bestimmten Controller wirkt, und unterstützt auch die globale Aktivierung, die auf alle Controller wirkt:
Zusätzlich zur Berechtigungskontrolle von Routen und der Verarbeitung davor und nach dem Ziel-Controller sind dies alle Neben der allgemeinen Logik ist die Verarbeitung von Parametern auch eine allgemeine Logik, sodass Nest.js auch die entsprechenden Aspekte extrahiert, nämlich Pipe:
Pipe bedeutet Pipeline, was bedeutet wird verwendet, um einige Überprüfungen und Konvertierungen von Parametern durchzuführen:
Der Weg zum Erstellen einer Pipe ist wie folgt:
Pipe muss die PipeTransform-Schnittstelle implementieren und die Transformationsmethode implementieren, die eine Parameterüberprüfung durchführen kann auf den Wert des eingehenden Parameters, z. B. ob das Format und der Typ korrekt sind. Löst eine Ausnahme aus, wenn sie korrekt sind. 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:
ValidationPipe
ValidationPipe
ParseIntPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
DefaultValuePipe
ParseEnumPipe
ParseFloatPipe
ParseIntPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
DefaultValuePipe
ParseEnumPipe
ParseFloatPipe
Egal, ob Pipe, Guard, Interceptor oder der Controller letztendlich aufgerufen wird, Der Prozess kann ausgelöst werden. Wie reagiert man auf einige Ausnahmen?
Diese Zuordnung von Ausnahmen zu Antworten ist auch eine gängige Logik. Nest.js bietet ExceptionFilter zur Unterstützung: ExceptionFilterExceptionFilter kann ausgelöste Ausnahmen verarbeiten und entsprechende Antworten zurückgeben: 🎜🎜🎜🎜🎜Create Die Form von ExceptionFilter ist wie folgt : 🎜🎜🎜🎜🎜Zunächst 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 Ausnahme Die entsprechende Antwort gibt dem Benutzer eine benutzerfreundlichere 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 von HttpException: 🎜BadRequestException
BadRequestException
UnauthorizedException
NotFoundException
ForbiddenException
NotAcceptableException
RequestTimeoutException
ConflictException
GoneException
PayloadTooLargeException
UnsupportedMediaTypeException
UnprocessableException
InternalServerErrorException
NotImplementedException
BadGatewayException
ServiceUnavailableException
GatewayTimeoutException
UnauthorizedException
NotFoundException
ForbiddenException
NotAcceptableException
RequestTimeoutException
ConflictException
GoneException
PayloadTooLargeException
UnsupportedMediaTypeException
UnprocessableException
InternalServerErrorException
NotImplementedException
BadGatewayException
ServiceUnavailableException
GatewayTimeoutException
Man kann es natürlich auch selbst erweitern:
Nest.js erreicht auf diese Weise die entsprechende Beziehung zwischen Ausnahmen und Antworten, sofern unterschiedliche HttpExceptions vorhanden sind Wenn Sie den Code eingeben, wird die entsprechende Antwort zurückgegeben, was sehr praktisch ist.🏜 ist die Sequenzbeziehung?
Die Abfolge mehrerer AOP-Mechanismen
Middleware, Guard, Pipe, Interceptor und ExceptionFilter können alle eine bestimmte Verarbeitungslogik transparent zu einer bestimmten Route oder allen Routen hinzufügen. 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:
Bei der Eingabe dieser Route wird natürlich zuerst Guard aufgerufen, um festzustellen, ob eine Erlaubnis usw. vorliegt. Wenn keine Erlaubnis vorliegt, wird hier eine Ausnahme ausgelöst:
Throw Die HttpException wird von ExceptionFilter behandelt.
Wenn Sie die Berechtigung haben, wird der Interceptor eine Kette organisieren, eine nach der anderen aufrufen und schließlich die Controller-Methode aufrufen:
Bevor die Controller-Methode aufgerufen wird, wird die Pipe zur Verarbeitung verwendet Parameter:konvertiert jeden Parameter:
Es ist leicht, sich den Aufrufzeitpunkt von ExceptionFilter vorzustellen, der darin besteht, die Ausnahme zu behandeln, bevor er reagiert. Und 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. ZusammenfassungNest.js ist wie Express auf der Grundlage der http-Plattform gekapselt und wendet Architekturideen wie MVC, IOC und AOP an. IOC bedeutet, dass Nest.js automatisch Klassen mit @Controller- und @Injectable-Dekoratoren scannt, ihre Objekte erstellt und die Objekte, von denen es abhängig ist, automatisch basierend auf den 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. 🎜🎜Middleware, Guard, Interceptor, Pipe und ExceptionFileter von Nest.js sind nur Aspekte an verschiedenen Standorten. Sie können alle flexibel auf eine bestimmte Route oder alle Routen angewendet werden AOP. 🎜🎜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. Anschließend wird Interceptor aufgerufen. Erweitern Sie eine Logik vor und nach dem Controller und rufen Sie Pipe auf, um Parameter zu überprüfen und zu konvertieren, bevor Sie den Zielcontroller erreichen. 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 zu erweiternde Architektur zu erreichen. 🎜🎜Haben Sie die Vorteile der AOP-Architektur gespürt? 🎜🎜Weitere Informationen zu Knoten finden Sie unter: 🎜nodejs-Tutorial🎜! 🎜Das obige ist der detaillierte Inhalt vonVerstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!