Ubehandlede undtagelser kan forårsage forvirring og frustration. Rengør dem med undtagelsesfiltre.

Nest.js-undtagelsesfiltre giver mulighed for at opfange og håndtere undtagelser globalt eller pr. controller.

De lader dig centralisere fejlhåndteringslogikken, formatere fejlsvar og give ensartet fejlhåndtering på tværs af din applikation. Lær om undtagelsesfiltre, og hvordan du bruger dem til korrekt håndtering af applikationsfejl.

Standardfejlhåndtering i Nest.js

Som standard har Nest.js et undtagelseslag, der håndterer eventuelle undtagelser, som din applikationskode ikke håndterer.

Når der opstår en uhåndteret fejl i din applikation, fanger Nest.js den og returnerer en 500 intern serverfejl til klienten. Den JSON, som Nest.js returnerer i dette tilfælde, ser sådan ud:

{
"statusCode": 500,
"message": "Internal server error"
}

Hvis fejlobjektet, som din kode kaster, indeholder en statuskode og en besked, vil Nest.js returnere disse værdier i stedet for standardsvaret.

For at undgå denne generiske adfærd og sende et mere meningsfuldt fejlsvar til klienten, skal du omhyggeligt håndtere alle de fejl, der kan opstå i din applikation. Du kan opnå dette ved at bruge Nest.js' indbyggede eller tilpassede undtagelsesfiltre.

instagram viewer

Oprettelse af et brugerdefineret undtagelsesfilter

For at demonstrere processen med at oprette et brugerdefineret undtagelsesfilter, prøv at oprette et, der håndterer alle HTTP-undtagelser.

Start med en fil kaldet http.exception.ts og tilføje følgende importer til det:

import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';

import { Request, Response } from'express';

Denne import tjener følgende formål.

  • Undtagelsesfilter: Dette er en grænseflade, der beskriver implementeringen af ​​et undtagelsesfilter.
  • Fangst: Dette er en dekoratør, der markerer en klasse som et Nest-undtagelsesfilter.
  • ArgumenterVært: Denne grænseflade giver metoder til at hente de argumenter, der er sendt til en behandler. Det giver dig mulighed for at vælge den passende udførelseskontekst (f.eks. HTTP, RPC eller WebSockets) at hente argumenter fra.
  • HttpException: Dette er en klasse, der definerer den grundlæggende Nest HTTP-undtagelse.
  • Anmodning & Respons: Dette er grænsefladerne for henholdsvis et Express.js-anmodnings- og svarobjekt.

Opret derefter en klasse, HttpExceptionFilter, der implementerer Undtagelsesfilter. Anmærk det med Fangst dekorator for at angive, at den håndterer HttpExceptions:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

Udfyld derefter klassen med denne kode:

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 kodeblok henter anmodnings- og svarobjekterne fra ArgumentsHost-objektet og udtrækker relevant information fra undtagelsen. Det returnerer et struktureret JSON-objektsvar med detaljer om fejlen til klienten.

Bindende undtagelsesfiltre

Du kan binde et undtagelsesfilter til en controller eller hele din applikation, afhængigt af dine behov.

For at binde et undtagelsesfilter globalt skal du først importere undtagelsesfilteret til din main.ts fil. Send derefter en forekomst af dit undtagelsesfilter 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 at binde en undtagelse til en controller skal du importere Brug filtre dekoratør og dit undtagelsesfilter. Anmærk din controller-klasse med @UseFilters dekoratør og send en forekomst af dit undtagelsesfilter som et argument til dekoratøren:

@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}

Hvor du binder dit filter, bestemmer omfanget af din fejlhåndtering. Controller-bundne filtre henvender sig kun til den controller, du har bundet den til, og applikationsbundne filtre henvender sig til hele applikationen.

Brug af indbyggede undtagelser til at smide fejl

Nest.js har indbyggede undtagelsesklasser, du kan bruge til at smide fejl.

For eksempel kan du kaste 404 statuskodefejl 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 kodeblok bruger en betinget erklæring for at kontrollere, om den givne bruger findes. Hvis ikke, kaster den en 404-fejl ved hjælp af NotFoundException, sende en besked som et argument.

Fælles indbyggede undtagelsesklasser

Andre indbyggede undtagelsesklasser inkluderer, men er ikke begrænset til, følgende.

  • BadRequestException: Kaster en undtagelse, der indikerer en dårlig anmodning med en statuskode på 400. Du kan bruge denne undtagelse, når klientens anmodning er ugyldig eller forkert udformet, og serveren ikke kan behandle den på grund af klientens fejl. Det indebærer typisk, at klienten skal ændre anmodningen for at gøre den gyldig.
  • Uautoriseret Undtagelse: Kaster en undtagelse, der indikerer uautoriseret adgang med en statuskode på 401. Du kan bruge denne undtagelse, når en bruger ikke er godkendt eller mangler de nødvendige tilladelser til at få adgang til en ressource.
  • Forbudt Undtagelse: Kaster en undtagelse, der angiver forbudt adgang med en statuskode på 403. Du kan bruge denne undtagelse, når en bruger er autentificeret, men ikke autoriseret at udføre en bestemt handling.
  • RequestTimeoutException: Kaster en undtagelse, der angiver, at anmodningen har timeout med en statuskode på 408. Du kan bruge denne undtagelse, når en server afslutter en anmodning, fordi det tog for lang tid at behandle.
  • ConflictException: Kaster en undtagelse, der indikerer en konflikt med en statuskode på 409. Du kan bruge denne undtagelse, hvor der er en konflikt mellem klientens anmodning og den aktuelle tilstand for ressourcen, f.eks. når du forsøger at oprette en ressource, der allerede eksisterer.
  • InternalServerErrorException: Kaster en undtagelse, der indikerer en intern serverfejl med en statuskode på 500. Du kan bruge denne undtagelse, når der opstår en uventet fejl på serversiden, hvilket indikerer, at serveren ikke kan opfylde anmodningen på grund af et internt problem.

Bedste praksis for fejlhåndtering i Nest.js

Når du håndterer fejl i Nest.js, skal du sørge for at bruge undtagelsesfiltre til at fange og håndtere undtagelser globalt eller pr. controller. Du kan også oprette brugerdefinerede filtre til specifikke undtagelsestyper.

Sørg desuden for, at du bruger de passende indbyggede undtagelsesklasser til at kaste korrekte og meningsfulde fejl. Disse fremgangsmåder kan forbedre pålideligheden af ​​dine Nest.js-apps markant.