Neapstrādāti izņēmumi var izraisīt apjukumu un neapmierinātību. Notīriet tos ar izņēmuma filtriem.

Nest.js izņēmumu filtri nodrošina veidu, kā pārtvert un apstrādāt izņēmumus globāli vai katram kontrolierim.

Tie ļauj centralizēt kļūdu apstrādes loģiku, formatēt kļūdu atbildes un nodrošināt konsekventu kļūdu apstrādi visā lietojumprogrammā. Uzziniet par izņēmumu filtriem un to izmantošanu, lai pareizi apstrādātu lietojumprogrammu kļūdas.

Noklusējuma kļūdu apstrāde pakalpojumā Nest.js

Pēc noklusējuma vietnei Nest.js ir izņēmumu slānis, kas attiecas uz visiem izņēmumiem, kurus jūsu lietojumprogrammas kods neapstrādā.

Ja jūsu lietojumprogrammā rodas neapstrādāta kļūda, Nest.js to uztver un klientam atgriež iekšējo servera kļūdu 500. JSON, ko Nest.js atgriež šajā gadījumā, izskatās šādi:

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

Ja kļūdas objekts, ko jūsu kods izmet, satur a statusa kods un a ziņa, Nest.js atgriezīs šīs vērtības noklusējuma atbildes vietā.

Lai izvairītos no šīs vispārīgās darbības un nosūtītu klientam jēgpilnāku kļūdu atbildi, jums rūpīgi jāapstrādā visas kļūdas, kas var rasties jūsu lietojumprogrammā. To var panākt, izmantojot Nest.js iebūvētos vai pielāgotos izņēmumu filtrus.

instagram viewer

Pielāgota izņēmuma filtra izveide

Lai demonstrētu pielāgota izņēmuma filtra izveides procesu, mēģiniet izveidot filtru, kas apstrādās visus HTTP izņēmumus.

Sāciet ar failu ar nosaukumu http.exception.ts un pievienojiet tam šādus importētos datus:

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

import { Request, Response } from'express';

Šis imports kalpo šādiem mērķiem.

  • Izņēmumu filtrs: šī ir saskarne, kas apraksta izņēmuma filtra ieviešanu.
  • Noķert: šis ir dekorators, kas atzīmē klasi kā Nest izņēmuma filtru.
  • ArgumentsHost: šī saskarne nodrošina metodes apstrādātājam nodoto argumentu izgūšanai. Tas ļauj izvēlēties atbilstošo izpildes kontekstu (piemēram, HTTP, RPC vai WebSockets), no kura izgūt argumentus.
  • HttpIzņēmums: šī ir klase, kas nosaka pamata Nest HTTP izņēmumu.
  • Pieprasīt & Atbilde: šīs ir saskarnes attiecīgi Express.js pieprasījuma un atbildes objektam.

Pēc tam izveidojiet klasi, HttpExceptionFilter, kas īsteno Izņēmumu filtrs. Anotējiet to ar Noķert dekorators, lai norādītu, ka tas apstrādā HttpExceptions:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

Pēc tam aizpildiet klasi ar šo kodu:

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

Šis koda bloks izgūst pieprasījuma un atbildes objektus no objekta ArgumentsHost un izņem attiecīgo informāciju no izņēmuma. Tas klientam atgriež strukturētu JSON objekta atbildi ar informāciju par kļūdu.

Saistošie izņēmumu filtri

Atkarībā no jūsu vajadzībām varat piesaistīt izņēmuma filtru kontrollerim vai visai lietojumprogrammai.

Lai saistītu izņēmumu filtru globāli, vispirms importējiet izņēmuma filtru savā galvenais.ts failu. Pēc tam nosūtiet izņēmumu filtra gadījumu uz app.useGlobalFilters metode:

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

Lai saistītu izņēmumu ar kontrolieri, importējiet Izmantojiet filtrus dekorators un jūsu izņēmuma filtrs. Anotējiet savu kontroliera klasi ar @UseFilters dekorators un nododiet sava izņēmuma filtra gadījumu kā argumentu dekoratoram:

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

Filtra piesaistes vieta noteiks kļūdu apstrādes apjomu. Ar kontrolieri saistītie filtri būs piemēroti tikai tam kontrolierim, ar kuru to esat saistījis, un ar lietojumprogrammu saistītie filtri būs piemēroti visai lietojumprogrammai.

Iebūvēto izņēmumu izmantošana kļūdu novēršanai

Nest.js nodrošina iebūvētas izņēmumu klases, kuras varat izmantot kļūdu novēršanai.

Piemēram, jūs varat iemest 404 statusa koda kļūdas Ar NotFoundException klase:

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

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

Šis koda bloks izmanto nosacīts paziņojums lai pārbaudītu, vai konkrētais lietotājs pastāv. Ja nē, tas rada 404 kļūdu, izmantojot NotFoundException, nododot ziņu kā argumentu.

Kopējās iebūvētās izņēmuma klases

Citas iebūvētās izņēmumu klases ietver, bet ne tikai, tālāk norādītās.

  • BadRequestException: izmet izņēmumu, kas norāda uz sliktu pieprasījumu ar statusa kodu 400. Šo izņēmumu var izmantot, ja klienta pieprasījums ir nederīgs vai nepareizi veidots un serveris nevar to apstrādāt klienta kļūdas dēļ. Parasti tas nozīmē, ka klientam ir jāmaina pieprasījums, lai tas būtu derīgs.
  • Neatļauts izņēmums: izceļ izņēmumu, kas norāda uz nesankcionētu piekļuvi ar statusa kodu 401. Šo izņēmumu varat izmantot, ja lietotājs nav autentificēts vai viņam nav nepieciešamo atļauju, lai piekļūtu resursam.
  • AizliegtsIzņēmums: izmet izņēmumu, kas norāda uz aizliegtu piekļuvi ar statusa kodu 403. Šo izņēmumu varat izmantot, ja lietotājs ir autentificēts, bet nav autorizēts lai veiktu konkrētu darbību.
  • RequestTimeoutException: izmet izņēmumu, kas norāda, ka pieprasījumam ir iestājies noildze ar statusa kodu 408. Varat izmantot šo izņēmumu, ja serveris pārtrauc pieprasījumu, jo tā apstrāde prasīja pārāk ilgu laiku.
  • KonfliktsIzņēmums: izmet izņēmumu, kas norāda uz konfliktu ar statusa kodu 409. Varat izmantot šo izņēmumu, ja pastāv konflikts starp klienta pieprasījumu un pašreizējo resursa stāvokli, piemēram, mēģinot izveidot jau esošu resursu.
  • InternalServerErrorException: izmet izņēmumu, kas norāda uz iekšēju servera kļūdu ar statusa kodu 500. Šo izņēmumu varat izmantot, ja servera pusē rodas neparedzēta kļūda, kas norāda, ka serveris nevar izpildīt pieprasījumu iekšējas problēmas dēļ.

Paraugprakse kļūdu apstrādei pakalpojumā Nest.js

Apstrādājot kļūdas pakalpojumā Nest.js, noteikti izmantojiet izņēmumu filtrus, lai uztvertu un apstrādātu izņēmumus globāli vai katram kontrolierim. Varat arī izveidot pielāgotus filtrus konkrētiem izņēmumu veidiem.

Turklāt pārliecinieties, ka izmantojat atbilstošas ​​iebūvētās izņēmumu klases, lai radītu pareizas un nozīmīgas kļūdas. Šīs darbības var ievērojami uzlabot jūsu Nest.js lietotņu uzticamību.