Heim  >  Artikel  >  Web-Frontend  >  Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

青灯夜游
青灯夜游nach vorne
2022-03-21 20:12:572771Durchsuche

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!

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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, IOC

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.

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

und Service verwendet @Injectable-Dekorator, um Folgendes zu deklarieren:

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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:

AOP

Was bedeutet AOP? Was ist aspektorientierte Programmierung?

Eine Anfrage kann die Logik von Controller, Dienst und Repository (Datenbankzugriff) durchlaufen:

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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:

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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:,

MiddlewareMiddleware

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:

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre VorteileRouting-Middleware ist für eine bestimmte Route , mit kleinerem Umfang:

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre VorteileDies ü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

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 es freigegeben werden soll :

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre VorteileDie 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:

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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:

1Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

Guard kann die Zugriffskontrolllogik des Routings abstrahieren, aber keine Anfragen und Antworten ändern. Diese Art von Logik kann verwendet werden Interceptor:

Interceptor

Interceptor bedeutet Interceptor. Sie können vor und nach der Ziel-Controller-Methode etwas Logik hinzufügen:

1Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

Die Art und Weise, einen Inteceptor zu erstellen, ist wie folgt:

1Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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:

1Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

1Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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

Pipe bedeutet Pipeline, was bedeutet wird verwendet, um einige Überprüfungen und Konvertierungen von Parametern durchzuführen:

1Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

Der Weg zum Erstellen einer Pipe ist wie folgt:

1Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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:

  • ValidationPipeValidationPipe
  • ParseIntPipe
  • ParseBoolPipe
  • ParseArrayPipe
  • ParseUUIDPipe
  • DefaultValuePipe
  • ParseEnumPipe
  • ParseFloatPipe
  • ParseIntPipe

ParseBoolPipe

ParseArrayPipe1Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

ParseUUIDPipe

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre VorteileDefaultValuePipe

ParseEnumPipe

ParseFloatPipe

Ebenso kann Pipe nur auf einer bestimmten Route oder auf jeder Route wirksam werden:

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

Egal, ob Pipe, Guard, Interceptor oder der Controller letztendlich aufgerufen wird, Der Prozess kann ausgelöst werden. Wie reagiert man auf einige Ausnahmen? 2Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

Diese Zuordnung von Ausnahmen zu Antworten ist auch eine gängige Logik. Nest.js bietet ExceptionFilter zur Unterstützung:

ExceptionFilter

ExceptionFilter 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: 🎜
  • BadRequestExceptionBadRequestException
  • UnauthorizedException
  • NotFoundException
  • ForbiddenException
  • NotAcceptableException
  • RequestTimeoutException
  • ConflictException
  • GoneException
  • PayloadTooLargeException
  • UnsupportedMediaTypeException
  • UnprocessableException
  • InternalServerErrorException
  • NotImplementedException
  • BadGatewayException
  • ServiceUnavailableException
  • GatewayTimeoutException
  • UnauthorizedException

NotFoundException

ForbiddenException2Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

NotAcceptableException

RequestTimeoutException

ConflictException

GoneException

PayloadTooLargeException

2Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre VorteileUnsupportedMediaTypeException

UnprocessableException

InternalServerErrorException2Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

NotImplementedException

BadGatewayException

ServiceUnavailableException

GatewayTimeoutException

Man kann es natürlich auch selbst erweitern:

2Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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-Mechanismen2Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre Vorteile

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.

2Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre VorteileDer entsprechende Quellcode lautet wie folgt:

2Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre VorteileBei 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:

Verstehen Sie die AOP-Architektur von Node.js Nest.js und sprechen Sie über ihre VorteileThrow 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.

Zusammenfassung

Nest.js ist wie Express auf der Grundlage der http-Plattform gekapselt und wendet Architekturideen wie MVC, IOC und AOP an.

MVC ist die Aufteilung in Modell- und Ansichtscontroller. 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ä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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen