Nicht behandelte Ausnahmen können zu Verwirrung und Frustration führen. Bereinigen Sie sie mit Ausnahmefiltern.
Die Ausnahmefilter von Nest.j bieten eine Möglichkeit, Ausnahmen global oder pro Controller abzufangen und zu behandeln.
Sie ermöglichen es Ihnen, die Fehlerbehandlungslogik zu zentralisieren, Fehlerantworten zu formatieren und eine konsistente Fehlerbehandlung in Ihrer gesamten Anwendung bereitzustellen. Erfahren Sie mehr über Ausnahmefilter und wie Sie sie verwenden, um Anwendungsfehler angemessen zu behandeln.
Standardfehlerbehandlung in Nest.js
Standardmäßig verfügt Nest.js über eine Ausnahmeebene, die alle Ausnahmen behandelt, die Ihr Anwendungscode nicht verarbeitet.
Wenn in Ihrer Anwendung ein nicht behandelter Fehler auftritt, fängt Nest.js ihn ab und gibt einen internen Serverfehler 500 an den Client zurück. Der JSON, den Nest.js in diesem Fall zurückgibt, sieht folgendermaßen aus:
{
"statusCode": 500,
"message": "Internal server error"
}
Wenn das Fehlerobjekt, das Ihr Code auslöst, ein enthält
Statuscode und ein Nachricht, Nest.js gibt diese Werte anstelle der Standardantwort zurück.Um dieses generische Verhalten zu vermeiden und eine aussagekräftigere Fehlerantwort an den Client zu senden, müssen Sie alle Fehler, die in Ihrer Anwendung auftreten können, sorgfältig behandeln. Sie können dies mithilfe der integrierten oder benutzerdefinierten Ausnahmefilter von Nest.js erreichen.
Erstellen eines benutzerdefinierten Ausnahmefilters
Um den Prozess der Erstellung eines benutzerdefinierten Ausnahmefilters zu demonstrieren, versuchen Sie, einen zu erstellen, der alle HTTP-Ausnahmen behandelt.
Beginnen Sie mit einer Datei namens http.Exception.ts und fügen Sie die folgenden Importe hinzu:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';
import { Request, Response } from'express';
Diese Importe dienen den folgenden Zwecken.
- Ausnahmefilter: Dies ist eine Schnittstelle, die die Implementierung eines Ausnahmefilters beschreibt.
- Fangen: Dies ist ein Dekorator, der eine Klasse als Nest-Ausnahmefilter markiert.
- ArgumentsHost: Diese Schnittstelle stellt Methoden zum Abrufen der an einen Handler übergebenen Argumente bereit. Sie können damit den geeigneten Ausführungskontext (z. B. HTTP, RPC oder WebSockets) auswählen, aus dem Argumente abgerufen werden sollen.
- HttpException: Dies ist eine Klasse, die die Basis-Nest-HTTP-Ausnahme definiert.
- Anfrage & Antwort: Dies sind die Schnittstellen für ein Express.js-Anforderungs- bzw. Antwortobjekt.
Als nächstes erstellen Sie eine Klasse, HttpExceptionFilter, das implementiert Ausnahmefilter. Kommentieren Sie es mit dem Fangen Dekorator, um anzugeben, dass er HttpExceptions behandelt:
@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}
Füllen Sie als Nächstes die Klasse mit diesem Code:
catch(exception: HttpException, host: ArgumentsHost) {
// Get the response object from the arguments host
const ctx = host.switchToHttp();
const response = ctx.getResponse(); // Get the request object from the arguments host
const request = ctx.getRequest(); // Get the status code from the exception
const status = exception.getStatus();
// Send a JSON response using the response object
response.status(status).json({
statusCode: status,
timestamp: newDate().toISOString(),
path: request.url,
message:
exception.message
|| exception.getResponse()['message']
|| 'Internal Server Error',
});
}
Dieser Codeblock ruft die Anforderungs- und Antwortobjekte vom ArgumentsHost-Objekt ab und extrahiert relevante Informationen aus der Ausnahme. Es gibt eine strukturierte JSON-Objektantwort mit Details zum Fehler an den Client zurück.
Bindung von Ausnahmefiltern
Sie können einen Ausnahmefilter je nach Bedarf an einen Controller oder Ihre gesamte Anwendung binden.
Um einen Ausnahmefilter global zu binden, importieren Sie zunächst den Ausnahmefilter in Ihr main.ts Datei. Übergeben Sie dann eine Instanz Ihres Ausnahmefilters an die app.useGlobalFilters Methode:
// main.ts
import { NestFactory } from'@nestjs/core';
import { AppModule } from'./app.module';
import { HttpExceptionFilter } from'./exception/http.exception';asyncfunctionbootstrap() {
const app = await NestFactory.create(AppModule);// Bind filter to the application
app.useGlobalFilters(new HttpExceptionFilter());await app.listen(4050);
}
bootstrap();
Um eine Ausnahme an einen Controller zu binden, importieren Sie die Verwenden Sie Filter Dekorator und Ihr Ausnahmefilter. Kommentieren Sie Ihre Controller-Klasse mit dem @UseFilters decorator und übergeben Sie eine Instanz Ihres Ausnahmefilters als Argument an den Decorator:
@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}
Wo Sie Ihren Filter binden, bestimmt den Umfang Ihrer Fehlerbehandlung. Controllergebundene Filter richten sich nur an den Controller, an den Sie sie gebunden haben, und anwendungsgebundene Filter decken die gesamte Anwendung ab.
Verwenden integrierter Ausnahmen zum Auslösen von Fehlern
Nest.js bietet integrierte Ausnahmeklassen, die Sie zum Auslösen von Fehlern verwenden können.
Sie können beispielsweise 404 werfen Statuscodefehler mit dem NotFoundException Klasse:
getUserById(id: number) {
const user = users.find((user) => user.id id);
if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}
Dieser Codeblock verwendet eine bedingte Anweisung um zu prüfen, ob der angegebene Benutzer existiert. Wenn nicht, wird ein 404-Fehler ausgegeben NotFoundException, eine Nachricht als Argument übergeben.
Allgemeine integrierte Ausnahmeklassen
Zu den weiteren integrierten Ausnahmeklassen gehören unter anderem die folgenden.
- BadRequestException: Löst eine Ausnahme aus, die auf eine fehlerhafte Anfrage mit dem Statuscode hinweist 400. Sie können diese Ausnahme verwenden, wenn die Anfrage des Clients ungültig oder fehlerhaft ist und der Server sie aufgrund des Fehlers des Clients nicht verarbeiten kann. Normalerweise bedeutet dies, dass der Client die Anfrage ändern muss, um sie gültig zu machen.
- UnauthorizedException: Löst eine Ausnahme aus, die auf einen unbefugten Zugriff mit dem Statuscode hinweist 401. Sie können diese Ausnahme verwenden, wenn ein Benutzer nicht authentifiziert ist oder nicht über die erforderlichen Berechtigungen zum Zugriff auf eine Ressource verfügt.
- Verbotene Ausnahme: Löst eine Ausnahme aus, die auf einen verbotenen Zugriff mit dem Statuscode hinweist 403. Sie können diese Ausnahme verwenden, wenn ein Benutzer vorhanden ist authentifiziert, aber nicht autorisiert eine bestimmte Aktion ausführen.
- RequestTimeoutException: Löst eine Ausnahme aus, die darauf hinweist, dass die Anforderung mit dem Statuscode abgelaufen ist 408. Sie können diese Ausnahme verwenden, wenn ein Server eine Anfrage beendet, weil die Verarbeitung zu lange gedauert hat.
- ConflictException: Löst eine Ausnahme aus, die auf einen Konflikt mit dem Statuscode hinweist 409. Sie können diese Ausnahme verwenden, wenn ein Konflikt zwischen der Clientanforderung und dem aktuellen Status der Ressource besteht, beispielsweise beim Versuch, eine bereits vorhandene Ressource zu erstellen.
- InternalServerErrorException: Löst eine Ausnahme aus, die auf einen internen Serverfehler mit dem Statuscode hinweist 500. Sie können diese Ausnahme verwenden, wenn auf der Serverseite ein unerwarteter Fehler auftritt, der darauf hinweist, dass der Server die Anforderung aufgrund eines internen Problems nicht erfüllen kann.
Best Practices für die Fehlerbehandlung in Nest.js
Achten Sie bei der Behandlung von Fehlern in Nest.js darauf, Ausnahmefilter zu verwenden, um Ausnahmen global oder pro Controller abzufangen und zu behandeln. Sie können auch benutzerdefinierte Filter für bestimmte Ausnahmetypen erstellen.
Stellen Sie außerdem sicher, dass Sie die entsprechenden integrierten Ausnahmeklassen verwenden, um ordnungsgemäße und aussagekräftige Fehler auszulösen. Diese Vorgehensweisen können die Zuverlässigkeit Ihrer Nest.js-Apps erheblich verbessern.