Niet-afgehandelde uitzonderingen kunnen verwarring en frustratie veroorzaken. Ruim ze op met uitzonderingsfilters.
De uitzonderingsfilters van Nest.js bieden een manier om uitzonderingen globaal of per controller te onderscheppen en af te handelen.
Hiermee kunt u de logica voor foutafhandeling centraliseren, foutreacties opmaken en consistente foutafhandeling in uw hele applicatie bieden. Leer meer over uitzonderingsfilters en hoe u deze kunt gebruiken om toepassingsfouten op de juiste manier af te handelen.
Standaardfoutafhandeling in Nest.js
Standaard heeft Nest.js een uitzonderingslaag die eventuele uitzonderingen afhandelt die uw applicatiecode niet verwerkt.
Wanneer er een onverwerkte fout optreedt in uw applicatie, onderschept Nest.js deze en stuurt een 500 interne serverfout terug naar de client. De JSON die Nest.js in dit geval retourneert, ziet er als volgt uit:
{
"statusCode": 500,
"message": "Internal server error"
}
Als het foutobject dat door uw code wordt gegenereerd een status code en een bericht, retourneert Nest.js deze waarden in plaats van het standaardantwoord.
Om dit algemene gedrag te voorkomen en een zinvoller foutantwoord naar de client te sturen, moet u zorgvuldig omgaan met alle fouten die in uw toepassing kunnen optreden. Je kunt dit bereiken met de ingebouwde of aangepaste uitzonderingsfilters van Nest.js.
Een aangepast uitzonderingsfilter maken
Om het proces van het maken van een aangepast uitzonderingsfilter te demonstreren, kunt u proberen er een te maken die alle HTTP-uitzonderingen afhandelt.
Begin met een bestand genaamd http.exception.ts en voeg de volgende import eraan toe:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';
import { Request, Response } from'express';
Deze invoer dient de volgende doeleinden.
- Uitzonderingsfilter: Dit is een interface die de implementatie van een uitzonderingsfilter beschrijft.
- Vangst: dit is een binnenhuisarchitect die een klasse markeert als Nest-uitzonderingsfilter.
- ArgumentenHost: deze interface biedt methoden voor het ophalen van de argumenten die aan een handler zijn doorgegeven. Hiermee kunt u de juiste uitvoeringscontext (bijvoorbeeld HTTP, RPC of WebSockets) kiezen waaruit u argumenten wilt ophalen.
- Http-uitzondering: dit is een klasse die de basis-HTTP-uitzondering van Nest definieert.
- Verzoek & Antwoord: Dit zijn respectievelijk de interfaces voor een Express.js-verzoek en antwoordobject.
Maak vervolgens een klasse, HttpExceptionFilter, dat implementeert Uitzonderingsfilter. Annoteer het met de Vangst decorateur om aan te geven dat het HttpExceptions verwerkt:
@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}
Vul vervolgens de klasse in met deze 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',
});
}
Dit codeblok haalt de request- en response-objecten op uit het ArgumentsHost-object en haalt relevante informatie uit de uitzondering. Het retourneert een gestructureerd JSON-objectantwoord, met details over de fout, naar de client.
Bindende uitzonderingsfilters
Afhankelijk van uw behoeften kunt u een uitzonderingsfilter aan een controller of aan uw gehele toepassing koppelen.
Om een uitzonderingsfilter globaal te binden, importeert u eerst het uitzonderingsfilter in uw belangrijkste.ts bestand. Geef vervolgens een exemplaar van uw uitzonderingsfilter door aan de 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();
Om een uitzondering aan een controller te binden, importeert u het Gebruik filters decorateur en uw uitzonderingsfilter. Annoteer uw controllerklasse met de @GebruikFilters decorateur en geef een exemplaar van uw uitzonderingsfilter door als argument aan de decorateur:
@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}
Waar u uw filter bindt, bepaalt de reikwijdte van uw foutafhandeling. Controllergebonden filters zijn alleen geschikt voor de controller waaraan u deze hebt gebonden, en applicatiegebonden filters zijn geschikt voor de gehele applicatie.
Ingebouwde uitzonderingen gebruiken om fouten te veroorzaken
Nest.js biedt ingebouwde uitzonderingsklassen die u kunt gebruiken om fouten te genereren.
Je kunt bijvoorbeeld 404 gooien statuscodefouten met de NotFoundException klas:
getUserById(id: number) {
const user = users.find((user) => user.id id);
if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}
Dit codeblok maakt gebruik van een voorwaardelijke verklaring om te controleren of de opgegeven gebruiker bestaat. Als dit niet het geval is, genereert het een 404-fout met behulp van de NotFoundException, waarbij een bericht als argument wordt doorgegeven.
Gemeenschappelijke ingebouwde uitzonderingsklassen
Andere ingebouwde uitzonderingsklassen omvatten, maar zijn niet beperkt tot, het volgende.
- BadRequestException: Genereert een uitzondering die een ongeldig verzoek aangeeft met de statuscode van 400. U kunt deze uitzondering gebruiken wanneer het verzoek van de client ongeldig of onjuist is opgemaakt en de server het niet kan verwerken vanwege een fout van de client. Het houdt doorgaans in dat de klant het verzoek moet wijzigen om het geldig te maken.
- Ongeautoriseerde uitzondering: Genereert een uitzondering die ongeautoriseerde toegang aangeeft met de statuscode van 401. U kunt deze uitzondering gebruiken wanneer een gebruiker niet is geverifieerd of niet over de benodigde machtigingen beschikt om toegang te krijgen tot een bron.
- VerbodenUitzondering: Genereert een uitzondering die verboden toegang aangeeft met de statuscode van 403. U kunt deze uitzondering gebruiken als een gebruiker dat is geauthenticeerd maar niet geautoriseerd om een specifieke actie uit te voeren.
- RequestTimeoutException: Genereert een uitzondering die aangeeft dat er een time-out is opgetreden voor de aanvraag met de statuscode van 408. U kunt deze uitzondering gebruiken wanneer een server een verzoek beëindigt omdat het te lang duurde om het te verwerken.
- ConflictUitzondering: Genereert een uitzondering die een conflict aangeeft met de statuscode van 409. U kunt deze uitzondering gebruiken als er een conflict is tussen het verzoek van de client en de huidige status van de bron, bijvoorbeeld wanneer u probeert een bron te maken die al bestaat.
- InternalServerErrorException: Genereert een uitzondering die een interne serverfout aangeeft met de statuscode van 500. U kunt deze uitzondering gebruiken wanneer er een onverwachte fout optreedt aan de serverzijde, wat aangeeft dat de server het verzoek niet kan vervullen vanwege een intern probleem.
Praktische tips voor foutafhandeling in Nest.js
Zorg ervoor dat u bij het afhandelen van fouten in Nest.js uitzonderingsfilters gebruikt om uitzonderingen globaal of per controller op te vangen en af te handelen. U kunt ook aangepaste filters maken voor specifieke uitzonderingstypen.
Zorg er bovendien voor dat u de juiste ingebouwde uitzonderingsklassen gebruikt om juiste en betekenisvolle fouten te genereren. Deze praktijken kunnen de betrouwbaarheid van je Nest.js-apps aanzienlijk verbeteren.