Neobravnavane izjeme lahko povzročijo zmedo in frustracije. Očistite jih s filtri izjem.

Filtri izjem Nest.js omogočajo prestrezanje in obravnavanje izjem globalno ali na podlagi posameznega krmilnika.

Omogočajo vam centralizacijo logike obravnavanja napak, oblikovanje odzivov na napake in zagotavljanje doslednega obravnavanja napak v vaši aplikaciji. Preberite več o filtrih izjem in o tem, kako jih uporabiti za ustrezno obravnavanje napak aplikacije.

Privzeto obravnavanje napak v Nest.js

Nest.js ima privzeto plast izjem, ki obravnava vse izjeme, ki jih koda vaše aplikacije ne obravnava.

Ko se v vaši aplikaciji pojavi neobravnavana napaka, jo Nest.js ujame in odjemalcu vrne notranjo napako strežnika 500. JSON, ki ga Nest.js vrne v tem primeru, je videti takole:

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

Če predmet napake, ki ga vrže vaša koda, vsebuje a statusCode in a sporočilo, bo Nest.js vrnil te vrednosti namesto privzetega odgovora.

Da bi se izognili temu splošnemu vedenju in odjemalcu poslali bolj smiseln odgovor na napako, morate vestno obravnavati vse napake, ki se lahko pojavijo v vaši aplikaciji. To lahko dosežete z uporabo vgrajenih ali prilagojenih filtrov izjem Nest.js.

instagram viewer

Ustvarjanje filtra izjem po meri

Če želite prikazati postopek ustvarjanja filtra izjem po meri, poskusite ustvariti takšnega, ki bo obravnaval vse izjeme HTTP.

Začnite z datoteko, imenovano http.exception.ts in ji dodajte naslednje uvoze:

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

import { Request, Response } from'express';

Ta uvoz služi za naslednje namene.

  • ExceptionFilter: To je vmesnik, ki opisuje izvedbo filtra izjem.
  • Ujemi: To je dekorater, ki razred označi kot filter izjem Nest.
  • ArgumentiHost: Ta vmesnik nudi metode za pridobivanje argumentov, posredovanih obdelovalcu. Omogoča vam, da izberete ustrezen kontekst izvajanja (npr. HTTP, RPC ali WebSockets), iz katerega pridobite argumente.
  • HttpException: To je razred, ki definira osnovno izjemo Nest HTTP.
  • Prošnja & Odziv: To sta vmesnika za zahtevo Express.js in odgovorni objekt.

Nato ustvarite razred, HttpExceptionFilter, ki izvaja ExceptionFilter. Označite ga z Ujemi dekorater, ki nakazuje, da obravnava HttpExceptions:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

Nato napolnite razred s to kodo:

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

Ta blok kode pridobi objekte zahteve in odgovora iz objekta ArgumentsHost in iz izjeme izvleče ustrezne informacije. Odjemalcu vrne odgovor strukturiranega objekta JSON s podrobnostmi o napaki.

Filtri vezavnih izjem

Filter izjem lahko povežete s krmilnikom ali celotno aplikacijo, odvisno od vaših potreb.

Če želite globalno povezati filter izjem, najprej uvozite filter izjem v svoj main.ts mapa. Nato posredujte primerek vašega filtra izjem v 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();

Če želite izjemo povezati s krmilnikom, uvozite UseFilters dekorater in vaš filter izjem. Označite svoj razred krmilnika z @UseFilters dekoraterju in posredujte primerek vašega filtra izjem kot argument dekoratorju:

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

Kje boste povezali filter, bo določil obseg vaše obravnave napak. Filtri, vezani na krmilnik, bodo poskrbeli samo za krmilnik, na katerega ste ga povezali, filtri, vezani na aplikacijo, pa bodo poskrbeli za celotno aplikacijo.

Uporaba vgrajenih izjem za pošiljanje napak

Nest.js ponuja vgrajene razrede izjem, ki jih lahko uporabite za pošiljanje napak.

Na primer, vržete lahko 404 napake statusne kode z NotFoundException razred:

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

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

Ta blok kode uporablja pogojna izjava da preveri, ali dani uporabnik obstaja. Če ne, vrže napako 404 z uporabo NotFoundException, ki posreduje sporočilo kot argument.

Skupni vgrajeni razredi izjem

Drugi vgrajeni razredi izjem vključujejo, vendar niso omejeni na naslednje.

  • BadRequestException: Vrže izjemo, ki označuje slabo zahtevo s statusno kodo 400. To izjemo lahko uporabite, ko je odjemalčeva zahteva neveljavna ali napačno oblikovana in je strežnik ne more obdelati zaradi odjemalčeve napake. Običajno pomeni, da mora odjemalec spremeniti zahtevo, da postane veljavna.
  • UnauthorizedException: Vrže izjemo, ki označuje nepooblaščen dostop s statusno kodo 401. To izjemo lahko uporabite, ko uporabnik ni overjen ali nima potrebnih dovoljenj za dostop do vira.
  • ForbiddenException: vrže izjemo, ki označuje prepovedan dostop s statusno kodo 403. To izjemo lahko uporabite, ko je uporabnik overjen, vendar ne avtoriziran za izvedbo določenega dejanja.
  • RequestTimeoutException: vrže izjemo, ki označuje, da je zahtevi potekla časovna omejitev s statusno kodo 408. To izjemo lahko uporabite, ko strežnik prekine zahtevo, ker je obdelava trajala predolgo.
  • ConflictException: vrže izjemo, ki označuje konflikt s statusno kodo 409. To izjemo lahko uporabite, kadar obstaja navzkrižje med odjemalčevo zahtevo in trenutnim stanjem vira, na primer pri poskusu ustvarjanja vira, ki že obstaja.
  • InternalServerErrorException: vrže izjemo, ki označuje notranjo napako strežnika s statusno kodo 500. To izjemo lahko uporabite, ko pride do nepričakovane napake na strani strežnika, ki nakazuje, da strežnik ne more izpolniti zahteve zaradi notranje težave.

Najboljše prakse za obravnavo napak v Nest.js

Pri obravnavanju napak v Nest.js se prepričajte, da uporabljate filtre izjem, da ujamete in obravnavate izjeme globalno ali za posamezen krmilnik. Ustvarite lahko tudi filtre po meri za določene vrste izjem.

Poleg tega se prepričajte, da uporabljate ustrezne vgrajene razrede izjem, da vržete pravilne in pomembne napake. Te prakse lahko znatno izboljšajo zanesljivost vaših aplikacij Nest.js.