Spezifische Verwendung des Ausnahmefilters Exceptionfilter in nestjs

Spezifische Verwendung des Ausnahmefilters Exceptionfilter in nestjs

Wenn wir über den Ausnahmefilter von Nestjs sprechen, müssen wir den globalen Filter von .Net erwähnen, der ziemlich leistungsstark ist. Theoretisch wird er als aspektorientierte Programmierung von AOP bezeichnet, die zu viele Szenarien erleichtert, die eine Ausnahmebehandlung erfordern. Zurück zum Ausnahmefilter von Nestjs: Er implementiert ähnliche Funktionen und verwendet ähnliche Verarbeitungsmethoden, aber eine ist für C# und die andere für Nodejs. Glücklicherweise habe ich in beiden Frameworks ähnliche Dinge gefunden.

Aspektorientierte Programmierung (AOP) ist so etwas wie eine Programmierspezifikation. In der Praxis wird es auch als schnittstellenorientierte Programmierung, SOLID-Prinzipien usw. bezeichnet.

Ausnahmebehandlung in Nestjs

Standardmäßige Ausnahmebehandlung

Nestjs verfügt über einen integrierten globalen Standardausnahmefilter, der Ausnahmen behandelt, die in HttpException umgewandelt werden können.

Wenn es sich um eine HttpException oder eine Ausnahme ihrer Unterklasse handelt, wird das JSON-Format der Ausnahme zurückgegeben:

{"exceptionCode":40005,"message":"Benutzerdefinierte Ausnahme","path":"/"}

Wenn es sich nicht um eine HttpException oder eine Ausnahme ihrer Unterklasse handelt, wird Folgendes zurückgegeben:

{"statusCode":500,"message":"Interner Serverfehler"}

Da Nestjs eine integrierte Standard-Ausnahmebehandlung verwendet, kommt es zu keinem Programmabsturz aufgrund nicht abgefangener Ausnahmen.

Benutzerdefinierte Ausnahmefilterbehandlung

Da das Rückgabewertformat der integrierten Ausnahmebehandlung nicht angepasst werden kann, sind benutzerdefinierte Ausnahmen normal. Benutzerdefinierte Ausnahmen können die zurückgegebenen Ausnahmeinformationen anpassen und benutzerdefinierte Ausnahmecodes hinzufügen, um es dem Clientpersonal zu erleichtern, je nach Ausnahmecode unterschiedliche Anzeigen anzuzeigen.

Wie passe ich Ausnahmen an?

Das Rad nicht neu zu erfinden, ist die Selbstbeherrschung eines Programmierers. Zuerst erstellen wir unsere eigene Exception-Basisklasse:

importiere { HttpException } von "@nestjs/common";

/**
 * Definieren Sie die Basisausnahmeklasse *
 * @export
 * @class BaseException
 * @extends {HttpException}
 */
Exportklasse BaseException erweitert HttpException {

  /**
   * Erstellt eine Instanz von BaseException.
   * @param {number} exceptionCode benutzerdefinierte Ausnahmenummer* @param {string} errorMessage Eingabeaufforderungsnachricht* @param {number} statusCode Statuscode* @memberof BaseException
   */
  Konstruktor(öffentlicher Ausnahmecode: Zahl, öffentliche Fehlermeldung: Zeichenfolge, öffentlicher Statuscode: Zahl) {
    super({ Ausnahmecode: Ausnahmecode, Fehlermeldung: Fehlermeldung }, Statuscode);
  }

  /**
   * Benutzerdefinierten Ausnahmecode abrufen *
   * @zurückkehren {*}
   * @memberof BaseException
   */
  getExceptionCode(): Zahl {
    gib diesen Ausnahmecode zurück;
  }

  getErrorMessage(): Zeichenfolge {
    gib diese Fehlermeldung zurück;
  }

  getStatusCode(): Nummer {
    gib diesen Statuscode zurück;
  }
}

Anschließend erstellen wir einen neuen Ausnahmetyp „Nicht autorisiert“, der einen benutzerdefinierten Ausnahmecode hinzufügt:

importiere { HttpStatus } von "@nestjs/common";
importiere { BaseException } aus "./base.exception";

Exportklasse UnCauhtException erweitert BaseException {
  Konstruktor() {
    super(40000, "Systembetriebsstörung, bitte kontaktieren Sie den Administrator!", HttpStatus.FORBIDDEN);
  }
}

Nachdem wir nun eine benutzerdefinierte Ausnahme erstellt haben, müssen wir nicht autorisierte Ausnahmen behandeln. Erstellen Sie zunächst eine neue benutzerdefinierte Basisklasse zur Ausnahmebehandlung. Bitte beachten Sie, dass wir hier Express verwenden:

importiere { ArgumentsHost, ExceptionFilter, HttpException } von "@nestjs/common";
importiere { HttpArgumentsHost } von "@nestjs/common/interfaces";
importiere { BaseException } aus "src/exceptions/base.exception";
importiere { Antwort, Anfrage } von "express";

/**
 * Abnormaler Basisklassenfilter *
 * @export
 * @class BaseExceptionFilter
 * @implements {ExceptionFilter<BaseException>}
 */
exportiere abstrakte Klasse BaseExceptionFilter implementiert ExceptionFilter<BaseException>
{
  /**
   *Ausnahmeklassenerfassung*
   * @abstrakt
   * @param {BaseException} Ausnahme
   * @param {ArgumentsHost} Gastgeber
   * @memberof BaseExceptionFilter
   */
  abstrakter Catch (Ausnahme: BaseException, Host: ArgumentsHost);

  /**
   * Kontextparameter für HTTP-Anforderungen abrufen *
   * @geschützt
   * @param {ArgumentsHost} Gastgeber
   * @zurückkehren {*}
   * @memberof BaseExceptionFilter
   */
  geschützt getHttpContext(host: ArgumentsHost) {
    host.switchToHttp() zurückgeben;
  }

  /**
   * HTTP-Antwortparameter abrufen *
   * @geschützt
   * @param {HttpArgumentsHost} httpContext
   * @zurückkehren {*}
   * @memberof BaseExceptionFilter
   */
  geschützt getResponse(httpContext: HttpArgumentsHost): Antwort {
    returniere httpContext.getResponse<Antwort>();
  }

  /**
   * HTTP-Anforderungsparameter abrufen *
   * @geschützt
   * @param {HttpArgumentsHost} httpContext
   * @zurückkehren {*}
   * @memberof BaseExceptionFilter
   */
  geschützt getRequest(httpContext: HttpArgumentsHost): Anfrage {
    return httpContext.getRequest<Anfrage>();
  }

  /**
   * Ausnahmeinformationen an den Client schreiben *
   * @param {ArgumentsHost} Gastgeber
   * @param {BaseException} Ausnahme
   * @memberof BaseExceptionFilter
   */
  geschützt writeToClient(host: ArgumentsHost, Ausnahme: BaseException) {
    const ctx = this.getHttpContext(host);
    if (Ausnahmeinstanz von BaseException) {
      dies.getResponse(ctx).status(Ausnahme.statusCode).json({
        Ausnahmecode: Ausnahme.getExceptionCode(),
        Nachricht: Ausnahme.getErrorMessage(),
        Pfad: this.getRequest(ctx).url
      });
    }anders {
      const httpException=Ausnahme;
      dies.getResponse(ctx).status(500).json({
        Meldung: „Unbehandelte Ausnahme“,
        Pfad: this.getRequest(ctx).url
      });
    }

  }
}

Erstellen Sie einen neuen Handler für nicht autorisierte Ausnahmen:

importiere { ArgumentsHost, Catch } von "@nestjs/common";
importiere { AuthException } aus "src/exceptions/auth.exception";
importiere { BaseException } aus "src/exceptions/base.exception";
importiere { BaseExceptionFilter } aus "./base.exception.filter";

@Catch(AuthException)
Exportklasse AuthExceptionFilter erweitert BaseExceptionFilter
{
  Konstruktor(){
    super();
    console.log("Initialisierung des Autorisierungsausnahmekonstruktors"+new Date().toISOString());
  }
  Fang(Ausnahme: AuthException, Host: ArgumentsHost) {
    Ausnahme.AusnahmeCode=40002;
    console.log("Ausführung der Autorisierungsausnahme"+new Date().toISOString());
    this.writeToClient(host,Ausnahme);
  }

}

Hier sind einige Erklärungen zur Klasse zur Behandlung nicht autorisierter Ausnahmen:

  1. Catch-Annotation hinzugefügt, um nur Authexception-Ausnahmen abzufangen, andere Arten von Ausnahmen werden nicht verarbeitet
  2. Erben Sie die benutzerdefinierte Ausnahmebehandlungsklasse Baseexceptionfilter

Anwendung

Ausnahmebehandlungsklassen können auf Methoden, Controller oder global angewendet werden. Sogar derselbe Controller kann mehrere benutzerdefinierte Ausnahmeklassen definieren.

importiere { Controller, ForbiddenException, Get, HttpException, HttpStatus, UseFilters } von '@nestjs/common';
importiere { AppService } aus './app.service';
importiere { AuthException } aus './exceptions/auth.exception';
importiere { BusinessException } aus './exceptions/business.exception';
importiere { UnCauhtException } von './exceptions/uncauht.exception';
importiere { AuthExceptionFilter } aus './filters/auth.exception.filter';
importiere { BusinessExceptionFilter } aus './filters/business.exception.filter';


/**
 * Einfaches Controller-Beispiel mit einer einzigen Route
 */
@UseFilters(AuthExceptionFilter,BusinessExceptionFilter)
@Regler()
exportiere Klasse AppController {
 Konstruktor (privater schreibgeschützter AppService: AppService) {}

 @Erhalten()
 getHello(): Zeichenfolge {
  //neuen Fehler werfen("666");
  throw new BusinessException("benutzerdefinierte Ausnahme",HttpStatus.OK);
  neue AuthException werfen();
  throw new HttpException("benutzerdefinierte Ausnahme",HttpStatus.FORBIDDEN);
  gib dies zurück.appService.getHello();
 }

 @Get("Name")
 getName():Zeichenfolge
 {
  gib "guozhiqi" zurück;
 }
}

Einige Anmerkungen:

  1. Wir verwenden die Usefilters-Annotation, um Ausnahmefilter hinzuzufügen
  2. Wir definieren zwei verschiedene Arten von benutzerdefinierten Ausnahmebehandlungsklassen in Appcontroller
  3. Das heißt, die in unserem Appcontroller ausgelösten Ausnahmen können normal behandelt werden, solange es sich um die beiden von uns definierten Typen handelt.

Ein paar Fragen

Wie oft wird unsere benutzerdefinierte Ausnahmebehandlungsklasse in Usefitlers initialisiert?
Antwort: Die benutzerdefinierte Ausnahmeklasse, die wir nach Typ bei AppController registrieren, wird nur einmal initialisiert, wenn das Programm initialisiert wird. Das heißt, nach dem Start des Programms wird jedes

Die vom Controller und jeder Methode definierten Ausnahmebehandlungsklassen wurden festgelegt.
Was passiert, wenn wir die Ausnahme abfangen, aber nichts damit tun?
Antwort: Wenn unsere Methode zur Ausnahmebehandlung nichts bewirkt, dann herzlichen Glückwunsch! Die Browseranforderung wird erfolgreich angehalten, da die Ausnahme nicht behandelt wird und der Browser daher keine Antwort erhält.

In welcher Reihenfolge werden mehrere Ausnahmen behandelt?
Antwort: Wenn mehrere Ausnahmehandler die Ausnahme abfangen können, ist nur der erste gültig. Das heißt, die Ausnahmebehandlungsklasse unterscheidet sich von der Middleware. Nur eine der Ausnahmebehandlungsklassen kann sie verarbeiten, während die Middleware beide verarbeiten muss.

Wem ähnelt @Usefilters von Nestjs?
Zunächst einmal ähnelt es aus der JS-Perspektive Angular. Wenn Sie sich das Backend ansehen, ähnelt es am meisten Spring.

Die Ausnahmebehandlung von Nestjs ist nicht kompliziert. Kompliziert ist, dass wir unterschiedliche Arten von Ausnahmen behandeln und die Gemeinsamkeiten der Ausnahmen extrahieren müssen.

Referenzdokument: docs.nestjs.cn

Dies ist das Ende dieses Artikels über die spezifische Verwendung des Ausnahmefilters Exceptionfilter in nestjs. Weitere verwandte Inhalte zum Nest-Ausnahmefilter Exceptionfilter finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die folgenden verwandten Artikel weiter. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • So verwenden Sie ExceptionFilter in .Net Core
  • asp.net core MVC globaler Filter ExceptionFilter-Filter (1)

<<:  Detaillierte Einführung in den Nobody-Benutzer und Nologin im Unix/Linux-System

>>:  Super detaillierte Schritte zur Installation von Zabbix3.0 auf Centos7

Artikel empfehlen

Vue implementiert ein Suchfeld mit einer Lupe

In diesem Artikel erfahren Sie, wie Sie mit Vue e...

Vue + Element realisiert Paging-Effekt

In diesem Artikelbeispiel wird der spezifische Co...

Grafisches Tutorial zur Installation und Konfiguration von mysql5.7.20 (Mac)

Grafisches Tutorial zur Installation und Konfigur...

Eine kurze Analyse des Reaktionsprinzips und der Unterschiede von Vue2.0/3.0

Vorwort Seit der offiziellen Einführung von vue3....

Beispielcode mit Vue-Router in HTML

Einführung in Vue und Vue-Router <script src=&...

Zusammenfassung der Vue-Datenreaktionsfähigkeit

Bevor wir über die Datenreaktivität sprechen, müs...

Neun erweiterte Methoden zur Deduplizierung von JS-Arrays (erprobt und effektiv)

Vorwort Die allgemeinen Methoden sind hier nicht ...

Tutorial zur MySQL-Optimierung: Große Paging-Abfrage

Inhaltsverzeichnis Hintergrund LIMIT-Optimierung ...

So löschen Sie Ordner, Dateien und Dekomprimierungsbefehle auf Linux-Servern

1. Ordner löschen Beispiel: rm -rf /usr/java Das ...

Analyse der vier Transaktionsisolationsstufen in MySQL anhand von Beispielen

Vorwort Um bei Datenbankoperationen die Richtigke...

Der gesamte Prozessbericht der Vue-Exportfunktion für Excel

Inhaltsverzeichnis 1. Front-End-Führungsprozess: ...