Neapdorotos išimtys gali sukelti painiavą ir nusivylimą. Išvalykite juos naudodami išskirtinius filtrus.
Nest.js išimčių filtrai suteikia galimybę perimti ir tvarkyti išimtis visame pasaulyje arba pagal valdiklį.
Jie leidžia centralizuoti klaidų valdymo logiką, formatuoti klaidų atsakymus ir užtikrinti nuoseklų klaidų tvarkymą visoje programoje. Sužinokite apie išimčių filtrus ir kaip juos naudoti norint tinkamai tvarkyti programos klaidas.
Numatytasis klaidų tvarkymas sistemoje Nest.js
Pagal numatytuosius nustatymus „Nest.js“ turi išimčių sluoksnį, kuris sprendžia visas išimtis, kurių jūsų programos kodas neapdoroja.
Kai jūsų programoje įvyksta neapdorota klaida, Nest.js ją užfiksuoja ir klientui pateikia 500 vidinės serverio klaidos. JSON, kurį Nest.js grąžina šiuo atveju, atrodo taip:
{
"statusCode": 500,
"message": "Internal server error"
}
Jei klaidos objekte, kurį meta jūsų kodas, yra a statusCode ir a žinutę, Nest.js pateiks tas vertes, o ne numatytąjį atsakymą.
Norėdami išvengti šios bendros elgsenos ir išsiųsti klientui reikšmingesnį atsakymą į klaidą, turite kruopščiai tvarkyti visas klaidas, kurios gali atsirasti jūsų programoje. Tai galite pasiekti naudodami Nest.js įtaisytuosius arba tinkintus išimčių filtrus.
Pasirinktinio išimčių filtro kūrimas
Norėdami parodyti tinkinto išimčių filtro kūrimo procesą, pabandykite sukurti tokį, kuris apdoros visas HTTP išimtis.
Pradėkite nuo failo, vadinamo http.exception.ts ir pridėkite prie jo šiuos importuotus elementus:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';
import { Request, Response } from'express';
Šis importas skirtas šiems tikslams.
- Išimčių filtras: Tai sąsaja, aprašanti išimčių filtro įgyvendinimą.
- Sugauti: tai dekoratorius, kuris pažymi klasę kaip „Nest“ išimties filtrą.
- ArgumentaiHost: Šioje sąsajoje pateikiami metodai, kaip gauti tvarkytojui perduodamus argumentus. Tai leidžia pasirinkti tinkamą vykdymo kontekstą (pvz., HTTP, RPC arba WebSockets), iš kurio norite gauti argumentus.
- HttpException: tai klasė, apibrėžianti bazinę Nest HTTP išimtį.
- Prašymas & Atsakymas: tai yra atitinkamai Express.js užklausos ir atsakymo objekto sąsajos.
Tada sukurkite klasę, HttpExceptionFilter, kuris įgyvendina Išimčių filtras. Komentuokite jį naudodami Sugauti dekoratorius, nurodydamas, kad jis tvarko HttpExceptions:
@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}
Tada užpildykite klasę šiuo 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 kodo blokas nuskaito užklausos ir atsakymo objektus iš ArgumentsHost objekto ir iš išimties ištraukia atitinkamą informaciją. Jis klientui grąžina struktūrinį JSON objekto atsakymą su išsamia informacija apie klaidą.
Įrišimo išimčių filtrai
Išimčių filtrą galite susieti su valdikliu arba visa programa, atsižvelgdami į savo poreikius.
Norėdami susieti išimčių filtrą visame pasaulyje, pirmiausia importuokite išimties filtrą į savo pagrindinis.ts failą. Tada perduokite išimties filtro egzempliorių į app.useGlobalFilters metodas:
// 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();
Norėdami susieti išimtį su valdikliu, importuokite Naudokite filtrus dekoratorius ir jūsų išimties filtras. Komentuokite savo valdiklio klasę naudodami @UseFilters dekoratoriui ir perduokite išimties filtro egzempliorių kaip argumentą dekoratoriui:
@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}
Kur susiesite filtrą, priklausys jūsų klaidų apdorojimo apimtis. Su valdikliu susieti filtrai bus pritaikyti tik valdikliui, su kuriuo jį susiejote, o su programa susieti filtrai – visai programai.
Integruotų išimčių naudojimas klaidoms pašalinti
Nest.js pateikia integruotas išimčių klases, kurias galite naudoti klaidoms išmesti.
Pavyzdžiui, galite mesti 404 būsenos kodo klaidos su NotFoundException klasė:
getUserById(id: number) {
const user = users.find((user) => user.id id);
if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}
Šis kodų blokas naudoja sąlyginis teiginys norėdami patikrinti, ar nurodytas vartotojas egzistuoja. Jei ne, jis pateikia 404 klaidą naudodamas NotFoundException, perduodamas žinutę kaip argumentą.
Įprastos įmontuotos išimties klasės
Kitos integruotos išimčių klasės apima toliau nurodytas, bet tuo neapsiribojant.
- BadRequestException: išmeta išimtį, nurodanti blogą užklausą su būsenos kodu 400. Šią išimtį galite naudoti, kai kliento užklausa neteisinga arba netinkamai suformuota, o serveris negali jos apdoroti dėl kliento klaidos. Paprastai tai reiškia, kad klientas turi pakeisti užklausą, kad ji būtų tinkama.
- Neteisėta išimtis: išmeta išimtį, nurodanti neteisėtą prieigą su būsenos kodu 401. Šią išimtį galite naudoti, kai vartotojas nėra autentifikuotas arba neturi reikiamų leidimų pasiekti išteklius.
- Uždrausta išimtis: išmeta išimtį, nurodantį uždraustą prieigą su būsenos kodu 403. Galite naudoti šią išimtį, kai vartotojas yra patvirtintas, bet ne įgaliotas atlikti konkretų veiksmą.
- RequestTimeoutException: išmeta išimtį, nurodanti, kad baigėsi užklausos skirtasis laikas su būsenos kodu 408. Šią išimtį galite naudoti, kai serveris nutraukia užklausą, nes jos apdorojimas užtruko per ilgai.
- Konflikto išimtis: išmeta išimtį, nurodantį konfliktą su būsenos kodu 409. Šią išimtį galite naudoti, kai prieštarauja kliento užklausa ir dabartinė išteklių būsena, pvz., bandant sukurti jau egzistuojantį išteklį.
- InternalServerErrorException: išmeta išimtį, nurodant vidinę serverio klaidą, kurios būsenos kodas yra 500. Šią išimtį galite naudoti, kai serverio pusėje įvyksta netikėta klaida, nurodanti, kad serveris negali įvykdyti užklausos dėl vidinės problemos.
Geriausia Nest.js klaidų valdymo praktika
Tvarkydami klaidas Nest.js, būtinai naudokite išimčių filtrus, kad gautumėte ir tvarkytumėte išimtis visame pasaulyje arba pagal valdiklį. Taip pat galite sukurti tinkintus filtrus tam tikriems išimčių tipams.
Be to, įsitikinkite, kad naudojate atitinkamas integruotas išimčių klases, kad padarytumėte tinkamas ir reikšmingas klaidas. Ši praktika gali žymiai pagerinti jūsų Nest.js programų patikimumą.