A kezeletlen kivételek zavart és frusztrációt okozhatnak. Tisztítsa meg őket kivételes szűrőkkel.

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 tartalmazza a statusCode és a üzenet, a Nest.js ezeket az értékeket adja vissza az alapértelmezett válasz helyett.

instagram viewer

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 egy nevű fájllal http.exception.ts és adja hozzá a következő importokat:

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

import { Request, Response } from'express';

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

  • Kivételszűrő: Ez egy kivételszűrő megvalósítását leíró felület.
  • Fogás: Ez egy dekorátor, amely egy osztályt jelöl meg Nest kivételszűrőként.
  • ArgumentsHost: Ez az interfész 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 (például HTTP, RPC vagy WebSockets) az argumentumok lekéréséhez.
  • HttpException: Ez egy olyan osztály, amely az alap Nest HTTP-kivételt határozza meg.
  • Kérés & Válasz: Ezek az Express.js kérés- és válaszobjektum interfészei.

Ezután hozzon létre egy osztályt, HttpExceptionFilter, amely megvalósítja Kivételszűrő. Jelölje meg a Fogás dekorátor, hogy jelezze, hogy kezeli a HttpExceptions-t:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

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

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

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 sajátjába fő.ts fájlt. Ezután adja át a kivételszűrő egy példányát a app.useGlobalFilters módszer:

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

Ha kivételt szeretne egy vezérlőhöz kötni, importálja a Használja a szűrőket dekorátor és a kivételszűrőd. Jelölje be a vezérlő osztályát a @UseFilters dekorátort, és adja át a kivételszűrő egy példányát argumentumként a díszítőnek:

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

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.

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 dobhat 404-et állapotkód hibák a... val NotFoundException osztály:

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

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

Ez a kódblokk használja feltételes kijelentés ellenőrizni, hogy az adott felhasználó létezik-e. Ha nem, akkor 404-es hibát dob ​​a segítségével NotFoundException, üzenetet ad át érvké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: Kivételt dob, amely rossz kérést jelez, állapotkódja: 400. 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.
  • Jogosulatlan kivétel: Kivételt dob, amely a jogosulatlan hozzáférést jelzi állapotkóddal 401. 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.
  • TiltottKivétel: Kivételt dob, amely tiltott hozzáférést jelez állapotkóddal 403. Ezt a kivételt akkor használhatja, ha egy felhasználó hitelesített, de nem engedélyezett konkrét művelet végrehajtására.
  • RequestTimeoutException: Kivételt dob, jelezve, hogy a kérés időtúllépése lejárt a következő állapotkóddal 408. 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ás.
  • KonfliktusKivétel: Kivételt dob, amely ütközést jelez a következő állapotkóddal 409. 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: Kivételt dob, amely belső szerverhibát jelez, állapotkóddal: 500. Ezt a kivételt akkor használhatja, ha váratlan hiba történik a szerver oldalon, ami azt jelzi, hogy a szerver belső probléma miatt nem tudja teljesíteni a kérést.

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.