Neobrađene iznimke mogu izazvati zbunjenost i frustraciju. Očistite ih filtrima iznimke.
Nest.js filtri iznimki pružaju način za presretanje i rukovanje iznimkama globalno ili na bazi po kontroleru.
Omogućuju vam centraliziranje logike rukovanja pogreškama, formatiranje odgovora na pogreške i pružanje dosljednog rukovanja pogreškama u vašoj aplikaciji. Saznajte više o filtrima izuzetaka i kako ih koristiti za odgovarajuće rješavanje pogrešaka aplikacije.
Zadano rukovanje pogreškama u Nest.js
Prema zadanim postavkama, Nest.js ima sloj iznimke koji se bavi svim iznimkama koje vaš aplikacijski kod ne obrađuje.
Kada se u vašoj aplikaciji dogodi neobrađena pogreška, Nest.js je hvata i klijentu vraća internu grešku poslužitelja 500. JSON koji Nest.js vraća u ovom slučaju izgleda ovako:
{
"statusCode": 500,
"message": "Internal server error"
}
Ako objekt pogreške koji vaš kod izbacuje sadrži a statusCode i a poruka, Nest.js će vratiti te vrijednosti umjesto zadanog odgovora.
Kako biste izbjegli ovo generičko ponašanje i poslali smisleniji odgovor o pogrešci klijentu, morate marljivo rješavati sve pogreške koje se mogu pojaviti u vašoj aplikaciji. To možete postići korištenjem ugrađenih ili prilagođenih filtara iznimke Nest.js.
Stvaranje prilagođenog filtra iznimke
Da biste demonstrirali postupak stvaranja prilagođenog filtra iznimke, pokušajte stvoriti onaj koji će rukovati svim HTTP iznimkama.
Počnite s datotekom pod nazivom http.exception.ts i dodajte mu sljedeće uvoze:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';
import { Request, Response } from'express';
Ovi uvozi služe u sljedeće svrhe.
- ExceptionFilter: Ovo je sučelje koje opisuje implementaciju filtra izuzetaka.
- Ulov: Ovo je dekorater koji označava klasu kao filtar iznimke Nest.
- ArgumentiHost: Ovo sučelje pruža metode za dohvaćanje argumenata proslijeđenih rukovatelju. Omogućuje vam odabir odgovarajućeg konteksta izvršavanja (npr. HTTP, RPC ili WebSockets) iz kojeg možete dohvatiti argumente.
- HttpException: Ovo je klasa koja definira osnovnu Nest HTTP iznimku.
- Zahtjev & Odgovor: Ovo su sučelja za objekt Express.js zahtjeva i odgovora.
Zatim stvorite klasu, HttpExceptionFilter, koji provodi ExceptionFilter. Označite ga s Ulov dekorater koji označava da obrađuje HttpExceptions:
@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}
Zatim popunite klasu ovim kodom:
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',
});
}
Ovaj blok koda dohvaća objekte zahtjeva i odgovora iz objekta ArgumentsHost i izdvaja relevantne informacije iz iznimke. Klijentu vraća odgovor strukturiranog JSON objekta s detaljima o pogrešci.
Obvezujući filtri izuzetaka
Možete vezati filtar iznimke na kontroler ili cijelu aplikaciju, ovisno o vašim potrebama.
Da biste filtar iznimke vezali globalno, prvo uvezite filtar iznimke u svoj glavni.ts datoteka. Zatim proslijedite instancu svog filtra iznimke u app.useGlobalFilters metoda:
// 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();
Da biste vezali iznimku za kontroler, uvezite Koristite filtre dekorater i vaš filtar izuzetaka. Označite svoju klasu kontrolera s @UseFilters dekorater i proslijedite instancu svog filtra iznimke kao argument dekoratoru:
@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}
Gdje vežete svoj filtar će odrediti opseg vašeg rukovanja greškama. Filtri vezani uz kontroler zadovoljit će samo kontroler s kojim ste ga povezali, a filtri vezani uz aplikaciju zadovoljit će cijelu aplikaciju.
Korištenje ugrađenih iznimaka za izbacivanje pogrešaka
Nest.js pruža ugrađene klase izuzetaka koje možete koristiti za izbacivanje pogrešaka.
Na primjer, možete baciti 404 greške statusnog koda s NotFoundException razred:
getUserById(id: number) {
const user = users.find((user) => user.id id);
if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}
Ovaj blok koda koristi uvjetna izjava kako biste provjerili da li navedeni korisnik postoji. Ako nije, izbacuje pogrešku 404 koristeći NotFoundException, prosljeđivanje poruke kao argumenta.
Uobičajene ugrađene klase iznimki
Druge ugrađene klase izuzetaka uključuju, ali nisu ograničene na sljedeće.
- BadRequestException: Izbacuje iznimku koja ukazuje na loš zahtjev sa statusnim kodom od 400. Ovu iznimku možete koristiti kada je klijentov zahtjev nevažeći ili neispravan, a poslužitelj ga ne može obraditi zbog klijentove pogreške. To obično podrazumijeva da klijent treba modificirati zahtjev kako bi postao valjan.
- UnauthorizedException: Izbacuje iznimku koja ukazuje na neovlašteni pristup sa statusnim kodom od 401. Ovu iznimku možete koristiti kada korisnik nije autentificiran ili mu nedostaju potrebna dopuštenja za pristup resursu.
- ForbiddenException: Izbacuje iznimku koja ukazuje na zabranjeni pristup sa statusnim kodom od 403. Ovu iznimku možete koristiti kada je korisnik ovjeren ali neovlašten izvršiti određenu radnju.
- RequestTimeoutException: Izbacuje iznimku koja pokazuje da je zahtjev istekao sa statusnim kodom od 408. Ovu iznimku možete koristiti kada poslužitelj prekine zahtjev jer je obrada trajala predugo.
- ConflictException: Izbacuje iznimku koja ukazuje na sukob sa statusnim kodom od 409. Ovu iznimku možete koristiti tamo gdje postoji sukob između zahtjeva klijenta i trenutnog stanja resursa, kao što je pokušaj stvaranja resursa koji već postoji.
- InternalServerErrorException: Izbacuje iznimku koja ukazuje na internu grešku poslužitelja sa statusnim kodom od 500. Ovu iznimku možete koristiti kada se neočekivana pogreška dogodi na strani poslužitelja, što ukazuje da poslužitelj ne može ispuniti zahtjev zbog internog problema.
Najbolji primjeri iz prakse za rukovanje pogreškama u Nest.js
Prilikom rukovanja pogreškama u Nest.js, svakako koristite filtre iznimaka za hvatanje i rukovanje iznimkama globalno ili po kontroleru. Također možete izraditi prilagođene filtre za određene vrste iznimaka.
Osim toga, osigurajte da koristite odgovarajuće ugrađene klase iznimke za izbacivanje ispravnih i smislenih pogrešaka. Ovi postupci mogu značajno poboljšati pouzdanost vaših Nest.js aplikacija.