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

So implementieren Sie Call, Apply und Binding in nativem JS

1. Implementieren Sie den Anruf Schritt: Legen Si...

JavaScript, um das Bild mit der Maus zu bewegen

In diesem Artikel wird der spezifische JavaScript...

Reines CSS, um den Listen-Pulldown-Effekt auf der Seite zu erzielen

Möglicherweise sehen Sie häufig den folgenden Eff...

Konfigurationsschritte für die MySQL-Gruppenreplikation (empfohlen)

MySQL-Group-Replication ist eine neue Funktion, d...

Mehrere Möglichkeiten zum Einfügen von SVG in HTML-Seiten

SVG (Scalable Vector Graphics) ist ein Bildformat...

Prinzip des Linux-Nohup-Befehls und Beispielanalyse

nohup-Befehl Bei der Verwendung von Unix/Linux mö...

Mysql-Sortierung und Paginierung (Order by & Limit) und vorhandene Fallstricke

Sortierabfrage (Sortieren nach) Im E-Commerce: Wi...

Analyse zweier Verwendungen des A-Tags in HTML-Post-Anfragen

Zwei Beispiele für die Verwendung des „a“-Tags in...

Basiswissen: Was bedeutet http vor einer Website-Adresse?

Was ist HTTP? Wenn wir eine Website durchsuchen m...