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.
Tartalomjegyzék
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.
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.
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 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.