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 AusnahmebehandlungNestjs 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 AusnahmefilterbehandlungDa 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:
AnwendungAusnahmebehandlungsklassen 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:
Ein paar Fragen Wie oft wird unsere benutzerdefinierte Ausnahmebehandlungsklasse in Usefitlers initialisiert? Die vom Controller und jeder Methode definierten Ausnahmebehandlungsklassen wurden festgelegt. In welcher Reihenfolge werden mehrere Ausnahmen behandelt? Wem ähnelt @Usefilters von Nestjs? 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:
|
<<: Detaillierte Einführung in den Nobody-Benutzer und Nologin im Unix/Linux-System
>>: Super detaillierte Schritte zur Installation von Zabbix3.0 auf Centos7
Einführung: Die Konfiguration von Docker, auf dem...
Bei der Verwendung von Docker-Compose für die Ber...
Heute verwenden wir Uniapp, um Echarts zur Anzeig...
Code kopieren Der Code lautet wie folgt: <styl...
Ich habe kürzlich an einem Projekt gearbeitet – B...
In diesem Artikelbeispiel wird der spezifische Co...
Inhaltsverzeichnis Vorwort 1. Deinstallieren Sie ...
Inhaltsverzeichnis Vorwort 1. Aktuelle gcc-Versio...
Einführung Wenn die MySQL InnoDB-Engine Datensätz...
Inhaltsverzeichnis Erklärung des V-Texts bei „if“...
Kommunikation zwischen Containern 1. Netzwerkfrei...
In diesem Artikel wird der spezifische JavaScript...
Was ist SQL? SQL ist eine Sprache zum Betrieb von...
Der spezifische Code lautet wie folgt: <a href...
Mit zunehmender Anzahl von Besuchen steigt der Dr...