Excepțiile necontrolate pot provoca confuzie și frustrare. Curățați-le cu filtre de excepție.

Filtrele de excepții Nest.js oferă o modalitate de a intercepta și gestiona excepțiile la nivel global sau pe bază de controler.

Vă permit să centralizați logica de gestionare a erorilor, să formatați răspunsurile la erori și să oferiți o gestionare consecventă a erorilor în aplicația dvs. Aflați despre filtrele de excepții și despre cum să le utilizați pentru a gestiona corect erorile aplicației.

Gestionarea implicită a erorilor în Nest.js

În mod implicit, Nest.js are un strat de excepții care se ocupă de orice excepții pe care codul aplicației dvs. nu le gestionează.

Când apare o eroare nerezolvată în aplicația dvs., Nest.js o prinde și returnează clientului o eroare internă de server 500. JSON-ul pe care îl returnează Nest.js în acest caz arată astfel:

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

Dacă obiectul de eroare pe care îl aruncă codul dvs. conține a statusCode si a mesaj, Nest.js va returna acele valori în loc de răspunsul implicit.

instagram viewer

Pentru a evita acest comportament generic și pentru a trimite clientului un răspuns de eroare mai semnificativ, trebuie să gestionați cu atenție toate erorile care ar putea apărea în aplicația dvs. Puteți realiza acest lucru folosind filtrele de excepții încorporate sau personalizate ale Nest.js.

Crearea unui filtru de excepții personalizat

Pentru a demonstra procesul de creare a unui filtru de excepții personalizat, încercați să creați unul care să gestioneze toate excepțiile HTTP.

Începeți cu un fișier numit http.exception.ts și adăugați următoarele importuri la acesta:

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

import { Request, Response } from'express';

Aceste importuri servesc următoarele scopuri.

  • ExceptionFilter: Aceasta este o interfață care descrie implementarea unui filtru de excepții.
  • Captură: Acesta este un decorator care marchează o clasă ca filtru de excepție Nest.
  • ArgumenteHost: Această interfață oferă metode pentru preluarea argumentelor transmise unui handler. Vă permite să alegeți contextul de execuție adecvat (de exemplu, HTTP, RPC sau WebSockets) pentru a prelua argumentele.
  • HttpException: Aceasta este o clasă care definește excepția HTTP Nest de bază.
  • Cerere & Raspuns: Acestea sunt interfețele pentru un obiect de cerere și, respectiv, de răspuns Express.js.

Apoi, creați o clasă, HttpExceptionFilter, care implementează ExceptionFilter. Adnotă-l cu Captură decorator pentru a indica faptul că se ocupă de HttpExceptions:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

Apoi, populați clasa cu acest cod:

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',
});
}

Acest bloc de cod preia obiectele de cerere și răspuns din obiectul ArgumentsHost și extrage informații relevante din excepție. Acesta returnează clientului un răspuns structurat de obiect JSON, cu detalii despre eroare.

Legarea filtrelor de excepție

Puteți lega un filtru de excepție la un controler sau la întreaga aplicație, în funcție de nevoile dvs.

Pentru a lega un filtru de excepție la nivel global, importați mai întâi filtrul de excepție în dvs principale.ts fişier. Apoi, transmiteți o instanță a filtrului de excepție la app.useGlobalFilters metodă:

// 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();

Pentru a lega o excepție la un controler, importați fișierul Utilizați filtre decorator și filtrul dvs. de excepție. Adnotă clasa ta de controler cu @UseFilters decorator și transmiteți o instanță a filtrului de excepție ca argument pentru decorator:

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

Acolo unde vă legați filtrul va determina domeniul de aplicare al gestionării erorilor. Filtrele legate de controler vor satisface numai controlerul la care l-ați legat, iar filtrele legate de aplicație vor satisface întreaga aplicație.

Utilizarea excepțiilor încorporate pentru a arunca erori

Nest.js oferă clase de excepții încorporate pe care le puteți folosi pentru a arunca erori.

De exemplu, poți arunca 404 erori de cod de stare cu NotFoundException clasă:

 getUserById(id: number) {
const user = users.find((user) => user.id id);

if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}

Acest bloc de cod folosește o declarație condiționată pentru a verifica dacă utilizatorul dat există. Dacă nu, se afișează o eroare 404 folosind NotFoundException, transmițând un mesaj ca argument.

Clase comune de excepție încorporate

Alte clase de excepție încorporate includ, dar nu se limitează la, următoarele.

  • BadRequestException: Lansează o excepție care indică o solicitare greșită cu un cod de stare de 400. Puteți utiliza această excepție atunci când solicitarea clientului este invalidă sau incorectă, iar serverul nu o poate procesa din cauza erorii clientului. De obicei, implică faptul că clientul trebuie să modifice cererea pentru a o face validă.
  • UnauthorizedException: Lansează o excepție care indică accesul neautorizat cu un cod de stare de 401. Puteți utiliza această excepție atunci când un utilizator nu este autentificat sau nu are permisiunile necesare pentru a accesa o resursă.
  • ForbiddenException: Lansează o excepție care indică accesul interzis cu un cod de stare de 403. Puteți folosi această excepție atunci când un utilizator este autentificat, dar neautorizat pentru a efectua o anumită acțiune.
  • RequestTimeoutException: Lansează o excepție care indică faptul că solicitarea a expirat cu un cod de stare de 408. Puteți folosi această excepție atunci când un server încheie o solicitare, deoarece procesarea a durat prea mult.
  • ConflictException: Lansează o excepție care indică un conflict cu un cod de stare de 409. Puteți utiliza această excepție atunci când există un conflict între cererea clientului și starea curentă a resursei, cum ar fi atunci când încercați să creați o resursă care există deja.
  • InternalServerErrorException: Lansează o excepție care indică o eroare internă a serverului cu un cod de stare de 500. Puteți utiliza această excepție atunci când apare o eroare neașteptată pe partea serverului, care indică faptul că serverul nu poate îndeplini cererea din cauza unei probleme interne.

Cele mai bune practici pentru gestionarea erorilor în Nest.js

Când gestionați erori în Nest.js, asigurați-vă că utilizați filtre de excepții pentru a captura și gestiona excepțiile la nivel global sau per controler. De asemenea, puteți crea filtre personalizate pentru anumite tipuri de excepții.

În plus, asigurați-vă că utilizați clasele de excepții încorporate adecvate pentru a genera erori corecte și semnificative. Aceste practici pot îmbunătăți semnificativ fiabilitatea aplicațiilor dvs. Nest.js.