A Nest.js kivételszűrőinek használata a hibák kezelésére

A Nest.js kivételszűrők lehetőséget biztosítanak a kivételek globális vagy vezérlőnkénti elfogására és kezelésére.

Lehetővé teszik a hibakezelési logika központosítását, a hibaválaszok formázását, és következetes hibakezelést biztosítanak az alkalmazásban. Ismerje meg a kivételszűrőket és azok használatát az alkalmazáshibák megfelelő kezelésére.

Alapértelmezett hibakezelés a Nest.js-ben

Alapértelmezés szerint a Nest.js rendelkezik egy kivételréteggel, amely kezeli azokat a kivételeket, amelyeket az alkalmazás kódja nem kezel.

Ha kezeletlen hiba történik az alkalmazásban, a Nest.js elkapja azt, és 500-as belső szerverhibát küld vissza az ügyfélnek. A Nest.js által visszaadott JSON ebben az esetben így néz ki:

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

Ha a kód által kiadott hibaobjektum statusCode-ot és üzenetet tartalmaz, a Nest.js ezeket az értékeket adja vissza az alapértelmezett válasz helyett.

Ennek az általános viselkedésnek a elkerülése érdekében, és értelmesebb hibaválaszt küldhet az ügyfélnek, gondosan kezelnie kell az alkalmazásban előforduló összes hibát. Ezt a Nest.js beépített vagy egyéni kivételszűrőivel érheti el.

Egyéni kivételszűrő létrehozása

Az egyéni kivételszűrő létrehozásának bemutatásához próbáljon meg létrehozni egy olyant, amely kezeli az összes HTTP-kivételt.

Kezdje a http.exception.t nevű fájllal, és adja hozzá a következő importálásokat:

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

import { Request, Response } from 'express';

Ezek az importok a következő célokat szolgálják.

  • ExceptionFilter: Ez egy kivételszűrő megvalósítását leíró felület.
  • Catch: Ez egy dekorátor, amely egy osztályt jelöl meg Nest kivételszűrőként.
  • ArgumentsHost: Ez a felület módszereket biztosít a kezelőnek átadott argumentumok lekérésére. Lehetővé teszi a megfelelő végrehajtási környezet kiválasztását (pl. HTTP, RPC vagy WebSockets) az argumentumok lekéréséhez.
  • HttpException: Ez egy osztály, amely az alap Nest HTTP-kivételt határozza meg.
  • Request & Response: Ezek az Express.js kérés és válasz objektumok felületei.
  GIF-ek mentése iPhone-on etoppc.com

Ezután hozzon létre egy HttpExceptionFilter osztályt, amely megvalósítja az ExceptionFilter-t. Jelölje meg a Catch dekorátorral, jelezve, hogy kezeli a HttpExceptions-t:

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

Ezután töltse fel az osztályt ezzel a kóddal:

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

Ez a kódblokk lekéri a kérés és válasz objektumokat az ArgumentsHost objektumból, és kivonja a releváns információkat a kivételből. Strukturált JSON-objektum választ ad vissza a hiba részleteivel az ügyfélnek.

Kivételszűrők kötése

Kivételszűrőt rendelhet egy vezérlőhöz vagy az egész alkalmazáshoz, igényeitől függően.

Egy kivételszűrő globális összerendeléséhez először importálja a kivételszűrőt a main.ts fájlba. Ezután adja át a kivételszűrő egy példányát az app.useGlobalFilters metódusnak:

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

Kivétel vezérlőhöz való kötéséhez importálja a UseFilters dekorátort és a kivételszűrőt. Jelölje meg a vezérlőosztályát a @UseFilters dekorátorral, és adja át a kivételszűrő egy példányát argumentumként a dekorátornak:

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

A szűrő bekötési helye határozza meg a hibakezelés hatókörét. A vezérlőhöz kötött szűrők csak azt a vezérlőt szolgálják ki, amelyhez kötötte, az alkalmazáshoz kötött szűrők pedig a teljes alkalmazást.

  AIOps vs. MLOps: A legfontosabb különbségek megértése

Beépített kivételek használata a hibák kiszűrésére

A Nest.js beépített kivételosztályokat biztosít, amelyek segítségével hibákat dobhat ki.

Például a NotFoundException osztállyal 404-es állapotkód hibát dobhat:

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

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

Ez a kódblokk egy feltételes utasítást használ annak ellenőrzésére, hogy az adott felhasználó létezik-e. Ha nem, akkor 404-es hibát dob ​​a NotFoundException használatával, és egy üzenetet ad át argumentumként.

Közös beépített kivételosztályok

Egyéb beépített kivételosztályok közé tartoznak, de nem kizárólagosan, a következők.

  • BadRequestException: 400-as állapotkódú, hibás kérést jelző kivételt dob. Ezt a kivételt akkor használhatja, ha az ügyfél kérése érvénytelen vagy hibás, és a szerver nem tudja feldolgozni azt az ügyfél hibája miatt. Ez általában azt jelenti, hogy az ügyfélnek módosítania kell a kérést, hogy érvényes legyen.
  • UnauthorizedException: 401-es állapotkóddal illetéktelen hozzáférést jelző kivételt dob. Ezt a kivételt akkor használhatja, ha a felhasználó nincs hitelesítve, vagy nem rendelkezik az erőforrás eléréséhez szükséges engedélyekkel.
  • ForbiddenException: Tiltott hozzáférést jelző kivételt dob ​​403-as állapotkóddal. Ezt a kivételt akkor használhatja, ha a felhasználó hitelesített, de nem jogosult egy adott művelet végrehajtására.
  • RequestTimeoutException: Kivételt dob, amely jelzi, hogy a kérés időtúllépése 408-as állapotkóddal. Ezt a kivételt akkor használhatja, ha a kiszolgáló leállítja a kérést, mert túl sokáig tartott a feldolgozása.
  • ConflictException: Kivételt dob, amely ütközést jelez 409-es állapotkóddal. Ezt a kivételt akkor használhatja, ha ütközés van az ügyfél kérése és az erőforrás jelenlegi állapota között, például amikor egy már létező erőforrást próbál létrehozni.
  • InternalServerErrorException: 500-as állapotkódú belső szerverhibát jelző kivételt dob. Ezt a kivételt akkor használhatja, ha váratlan hiba történik a kiszolgáló oldalon, jelezve, hogy a szerver belső probléma miatt nem tudja teljesíteni a kérést.
  A Gnome Shell bővítmények egyszerű telepítése az Extension Manager segítségével

A Nest.js hibakezelésének bevált módszerei

A Nest.js hibáinak kezelésekor ügyeljen arra, hogy kivételszűrőket használjon a kivételek globális vagy vezérlőnkénti elfogására és kezelésére. Egyéni szűrőket is létrehozhat bizonyos kivételtípusokhoz.

Ezenkívül győződjön meg arról, hogy a megfelelő beépített kivételosztályokat használja a megfelelő és értelmes hibák kidobásához. Ezek a gyakorlatok jelentősen javíthatják a Nest.js-alkalmazások megbízhatóságát.