Ubehandlede unntak kan forårsake forvirring og frustrasjon. Rengjør dem med unntaksfiltre.
Nest.js-unntaksfiltre gir en måte å fange opp og håndtere unntak globalt eller per kontroller.
De lar deg sentralisere feilhåndteringslogikk, formatere feilsvar og gi konsistent feilhåndtering på tvers av applikasjonen. Lær om unntaksfiltre og hvordan du bruker dem til å håndtere applikasjonsfeil på riktig måte.
Standard feilhåndtering i Nest.js
Som standard har Nest.js et unntakslag som håndterer eventuelle unntak som applikasjonskoden din ikke håndterer.
Når det oppstår en ubehandlet feil i applikasjonen din, fanger Nest.js opp den og returnerer en 500 intern serverfeil til klienten. JSON-en som Nest.js returnerer i dette tilfellet ser slik ut:
{
"statusCode": 500,
"message": "Internal server error"
}
Hvis feilobjektet som koden din kaster inneholder en statuskode og a beskjed, vil Nest.js returnere disse verdiene i stedet for standardsvaret.
For å unngå denne generiske oppførselen og sende et mer meningsfullt feilsvar til klienten, må du omhyggelig håndtere alle feilene som kan oppstå i applikasjonen din. Du kan oppnå dette ved å bruke Nest.js sine innebygde eller egendefinerte unntaksfiltre.
Opprette et tilpasset unntaksfilter
For å demonstrere prosessen med å lage et tilpasset unntaksfilter, prøv å lage et som vil håndtere alle HTTP-unntak.
Start med en fil som heter http.exception.ts og legg til følgende importer til den:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';
import { Request, Response } from'express';
Denne importen tjener følgende formål.
- Unntaksfilter: Dette er et grensesnitt som beskriver implementeringen av et unntaksfilter.
- Å fange: Dette er en dekoratør som markerer en klasse som et Nest-unntaksfilter.
- Argumenter Host: Dette grensesnittet gir metoder for å hente argumentene som sendes til en behandler. Den lar deg velge riktig utførelseskontekst (f.eks. HTTP, RPC eller WebSockets) for å hente argumenter fra.
- HttpException: Dette er en klasse som definerer det grunnleggende Nest HTTP-unntaket.
- Be om & Respons: Dette er grensesnittene for henholdsvis et Express.js-forespørsel og et svarobjekt.
Deretter oppretter du en klasse, HttpExceptionFilter, som gjennomfører Unntaksfilter. Merk den med Å fange dekorator for å indikere at den håndterer HttpExceptions:
@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}
Deretter fyller du klassen med denne koden:
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',
});
}
Denne kodeblokken henter forespørsels- og svarobjektene fra ArgumentsHost-objektet og trekker ut relevant informasjon fra unntaket. Den returnerer et strukturert JSON-objektsvar, med detaljer om feilen, til klienten.
Bindende unntaksfiltre
Du kan binde et unntaksfilter til en kontroller eller hele applikasjonen din, avhengig av dine behov.
For å binde et unntaksfilter globalt, importer først unntaksfilteret til din main.ts fil. Send deretter en forekomst av unntaksfilteret til app.useGlobalFilters metode:
// 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();
For å binde et unntak til en kontroller, importer Bruk filtre dekoratør og unntaksfilteret ditt. Merk kontrollereklassen din med @UseFilters dekoratør og send en forekomst av unntaksfilteret som et argument til dekoratøren:
@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}
Hvor du binder filteret ditt vil avgjøre omfanget av feilhåndteringen. Kontrollerbundne filtre vil kun imøtekomme kontrolleren du har bundet den til, og programbundne filtre vil imøtekomme hele programmet.
Bruk av innebygde unntak for å kaste feil
Nest.js har innebygde unntaksklasser du kan bruke til å kaste feil.
For eksempel kan du kaste 404 statuskodefeil med NotFoundException klasse:
getUserById(id: number) {
const user = users.find((user) => user.id id);
if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}
Denne kodeblokken bruker en betinget erklæring for å sjekke om den gitte brukeren eksisterer. Hvis ikke, gir den en 404-feil ved å bruke NotFoundException, sende en melding som et argument.
Vanlige innebygde unntaksklasser
Andre innebygde unntaksklasser inkluderer, men er ikke begrenset til, følgende.
- BadRequestException: Kaster et unntak som indikerer en dårlig forespørsel med en statuskode på 400. Du kan bruke dette unntaket når klientens forespørsel er ugyldig eller feilformet, og serveren ikke kan behandle den på grunn av klientens feil. Det innebærer vanligvis at klienten må endre forespørselen for å gjøre den gyldig.
- Uautorisert unntak: Kaster et unntak som indikerer uautorisert tilgang med en statuskode på 401. Du kan bruke dette unntaket når en bruker ikke er autentisert eller mangler de nødvendige tillatelsene for å få tilgang til en ressurs.
- Forbudt unntak: Kaster et unntak som indikerer forbudt tilgang med en statuskode på 403. Du kan bruke dette unntaket når en bruker er autentisert, men ikke autorisert å utføre en bestemt handling.
- RequestTimeoutException: Kaster et unntak som indikerer at forespørselen har gått ut med en statuskode på 408. Du kan bruke dette unntaket når en server avslutter en forespørsel fordi det tok for lang tid å behandle.
- ConflictException: Kaster et unntak som indikerer en konflikt med en statuskode på 409. Du kan bruke dette unntaket der det er en konflikt mellom klientens forespørsel og ressursens nåværende tilstand, for eksempel når du prøver å opprette en ressurs som allerede eksisterer.
- InternalServerErrorException: Kaster et unntak som indikerer en intern serverfeil med en statuskode på 500. Du kan bruke dette unntaket når det oppstår en uventet feil på serversiden, noe som indikerer at serveren ikke kan oppfylle forespørselen på grunn av et internt problem.
Gode fremgangsmåter for feilhåndtering i Nest.js
Når du håndterer feil i Nest.js, må du huske å bruke unntaksfiltre for å fange opp og håndtere unntak globalt eller per kontroller. Du kan også opprette egendefinerte filtre for bestemte unntakstyper.
Sørg i tillegg for at du bruker de riktige innebygde unntaksklassene for å kaste riktige og meningsfulle feil. Disse fremgangsmåtene kan forbedre påliteligheten til Nest.js-appene dine betydelig.