Käsitlemata erandid võivad tekitada segadust ja pettumust. Puhastage neid erandifiltritega.

Nest.js-i erandite filtrid pakuvad võimalust erandite pealtkuulamiseks ja käsitlemiseks globaalselt või kontrolleripõhiselt.

Need võimaldavad teil tsentraliseerida veakäsitluse loogikat, vormindada veavastuseid ja pakkuda järjepidevat veakäsitlust kogu teie rakenduses. Lugege lisateavet erandifiltrite ja nende kasutamise kohta rakendusvigade nõuetekohaseks käsitlemiseks.

Vaikimisi veakäsitlus Nest.js-is

Vaikimisi on Nest.js-il erandite kiht, mis käsitleb kõiki erandeid, mida teie rakenduse kood ei käsitle.

Kui teie rakenduses ilmneb töötlemata tõrge, tabab Nest.js selle ja tagastab kliendile 500 sisemise serveri vea. JSON, mille Nest.js sel juhul tagastab, näeb välja järgmine:

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

Kui teie koodi visatud veaobjekt sisaldab a olekukood ja a sõnum, tagastab Nest.js need väärtused vaikevastuse asemel.

Sellise üldise käitumise vältimiseks ja kliendile sisukama veavastuse saatmiseks peate hoolikalt käsitlema kõiki teie rakenduses esineda võivaid vigu. Seda saate saavutada Nest.js-i sisseehitatud või kohandatud erandifiltrite abil.

instagram viewer

Kohandatud erandite filtri loomine

Kohandatud erandite filtri loomise protsessi demonstreerimiseks proovige luua filtrit, mis käsitleb kõiki HTTP erandeid.

Alustage failist nimega http.exception.ts ja lisage sellele järgmised impordid:

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

import { Request, Response } from'express';

Sellel impordil on järgmised eesmärgid.

  • Erandifilter: see on liides, mis kirjeldab erandifiltri rakendamist.
  • Saagi: see on dekoraator, mis märgib klassi Nesti erandifiltrina.
  • ArgumendidHost: see liides pakub meetodeid töötlejale edastatud argumentide toomiseks. See võimaldab teil valida argumentide toomiseks sobiva täitmiskonteksti (nt HTTP, RPC või WebSockets).
  • HttpErand: see on klass, mis määratleb Nesti HTTP baaserandi.
  • Taotlus & Vastus: need on vastavalt Express.js päringu ja vastuse objekti liidesed.

Järgmisena looge klass, HttpExceptionFilter, mis rakendab Erandifilter. Märkige see nupuga Saagi dekoraator, et näidata, et ta käsitleb HttpExceptions:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

Järgmisena sisestage klass selle koodiga:

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

See koodiplokk hangib päringu- ja vastuseobjektid objektist ArgumentsHost ning eraldab erandist asjakohase teabe. See tagastab kliendile struktureeritud JSON-objekti vastuse koos vea üksikasjadega.

Erandifiltrite sidumine

Sõltuvalt oma vajadustest saate siduda erandifiltri kontrolleriga või kogu rakendusega.

Erandifiltri globaalseks sidumiseks importige esmalt erandifilter oma seadmesse main.ts faili. Seejärel edastage oma erandifiltri eksemplar rakendusele app.useGlobalFilters meetod:

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

Erandi sidumiseks kontrolleriga importige fail Kasutage filtreid dekoraator ja teie erandite filter. Märkige oma kontrolleri klass nupuga @Kasutage filtreid sisekujundaja ja edastage dekoraatorile argumendina oma erandifiltri eksemplar:

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

Filtri sidumise koht määrab teie vigade käsitlemise ulatuse. Kontrolleriga seotud filtrid teenindavad ainult seda kontrollerit, millega olete selle sidunud, ja rakendusega seotud filtrid kogu rakendust.

Sisseehitatud erandite kasutamine vigade kõrvaldamiseks

Nest.js pakub sisseehitatud erandiklasse, mida saate vigade tekitamiseks kasutada.

Näiteks võite visata 404 olekukoodi vead koos NotFoundException klass:

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

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

See koodiplokk kasutab tingimuslik väide et kontrollida, kas antud kasutaja on olemas. Kui ei, siis annab see tõrke 404 kasutades NotFoundException, edastades argumendina sõnumi.

Tavalised sisseehitatud erandklassid

Muud sisseehitatud erandiklassid hõlmavad, kuid ei ole nendega piiratud, järgmist.

  • BadRequestException: loob erandi, mis viitab halvale taotlusele olekukoodiga 400. Seda erandit saate kasutada siis, kui kliendi taotlus on kehtetu või valesti vormindatud ja server ei saa seda kliendi vea tõttu töödelda. Tavaliselt tähendab see, et klient peab taotlust muutma, et see kehtiks.
  • Volitamata erand: loob erandi, mis näitab volitamata juurdepääsu olekukoodiga 401. Seda erandit saate kasutada siis, kui kasutaja ei ole autentitud või tal puuduvad ressursile juurdepääsuks vajalikud õigused.
  • Keelatud Erand: loob erandi, mis näitab keelatud juurdepääsu olekukoodiga 403. Saate seda erandit kasutada, kui kasutaja on autentitud, kuid mitte volitatud konkreetse toimingu sooritamiseks.
  • RequestTimeoutException: loob erandi, mis näitab, et päring on aegunud olekukoodiga 408. Seda erandit saate kasutada siis, kui server lõpetab päringu, kuna selle töötlemine võttis liiga kaua aega.
  • KonfliktErand: loob erandi, mis näitab konflikti olekukoodiga 409. Seda erandit saate kasutada siis, kui kliendi taotluse ja ressursi praeguse oleku vahel on konflikt, näiteks kui proovite luua juba olemasolevat ressurssi.
  • InternalServerErrorException: loob erandi, mis näitab serveri sisemist viga olekukoodiga 500. Seda erandit saate kasutada siis, kui serveri poolel ilmneb ootamatu tõrge, mis näitab, et server ei saa sisemise probleemi tõttu päringut täita.

Nest.js-i vigade käsitlemise parimad tavad

Nest.js-i vigade käsitlemisel kasutage kindlasti erandite filtreid, et püüda ja käsitleda erandeid globaalselt või kontrolleripõhiselt. Saate luua ka kohandatud filtreid konkreetsete erandite tüüpide jaoks.

Lisaks veenduge, et kasutate õigete ja tähenduslike vigade loomiseks sobivaid sisseehitatud erandiklasse. Need tavad võivad oluliselt parandada teie Nest.js-i rakenduste töökindlust.