Cum să utilizați filtrele de excepție Nest.js pentru a gestiona erorile

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 conține un statusCode și un mesaj, Nest.js va returna acele valori în loc de răspunsul implicit.

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.

  Introducere în NestJS [+6 Learning Resources]

Î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.
  • ArgumentsHost: 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ă.
  • Solicitare și răspuns: 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 decoratorul Catch pentru a indica faptul că se ocupă de HttpExceptions:

 @Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {}

Apoi, populați clasa cu acest cod:

 catch(exception: HttpException, host: ArgumentsHost) {
    
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();

    
    const request = ctx.getRequest<Request>();

    
    const status = exception.getStatus();

    
    response.status(status).json({
      statusCode: status,
      timestamp: new Date().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ții la nivel global, importați mai întâi filtrul de excepții în fișierul main.ts. Apoi, transmiteți o instanță a filtrului de excepție metodei app.useGlobalFilters:

 
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './exception/http.exception';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  
  app.useGlobalFilters(new HttpExceptionFilter());

  await app.listen(4050);
}

bootstrap();

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

 @Controller()
@UseFilters(new HttpExceptionFilter())
export class AppController {}

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.

  Cum să partajați progresul călătoriei în Google Maps

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, puteți arunca erori de cod de stare 404 cu clasa NotFoundException:

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

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

Acest bloc de cod folosește o instrucțiune condiționată pentru a verifica dacă utilizatorul dat există. Dacă nu, se afișează o eroare 404 folosind NotFoundException, trecâ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: Afișează o excepție care indică accesul neautorizat cu un cod de stare 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 403. Puteți utiliza această excepție atunci când un utilizator este autentificat, dar nu este autorizat să efectueze o anumită acțiune.
  • RequestTimeoutException: Afișează o excepție care indică faptul că solicitarea a expirat cu un cod de stare de 408. Puteți utiliza 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 în cazul în care există un conflict între solicitarea 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, indicând faptul că serverul nu poate îndeplini cererea din cauza unei probleme interne.
  Strategii, instrumente și cele mai bune practici pentru marketeri

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.