Необрађени изузеци могу изазвати конфузију и фрустрацију. Очистите их филтерима изузетака.

Нест.јс филтери изузетака обезбеђују начин за пресретање и руковање изузетцима на глобалном нивоу или на бази по контролеру.

Они вам омогућавају да централизујете логику руковања грешкама, форматирате одговоре на грешке и обезбедите доследно руковање грешкама у вашој апликацији. Сазнајте више о филтерима изузетака и како да их користите за правилно руковање грешкама апликације.

Подразумевано руковање грешкама у Нест.јс

Подразумевано, Нест.јс има слој изузетака који се бави свим изузецима које ваш код апликације не обрађује.

Када се у вашој апликацији појави необрађена грешка, Нест.јс је хвата и враћа клијенту интерну грешку сервера од 500. ЈСОН који Нест.јс враћа у овом случају изгледа овако:

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

Ако објекат грешке који ваш код избацује садржи а статусЦоде и а порука, Нест.јс ће вратити те вредности уместо подразумеваног одговора.

Да бисте избегли ово опште понашање и послали значајнији одговор на грешку клијенту, морате пажљиво да рукујете свим грешкама које се могу појавити у вашој апликацији. То можете постићи помоћу уграђених или прилагођених филтера изузетака Нест.јс.

instagram viewer

Креирање прилагођеног филтера изузетака

Да бисте демонстрирали процес креирања прилагођеног филтера изузетака, покушајте да креирате филтер који ће обрађивати све ХТТП изузетке.

Почните са датотеком под називом хттп.екцептион.тс и додајте му следеће увозе:

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

import { Request, Response } from'express';

Овај увоз служи за следеће сврхе.

  • ЕкцептионФилтер: Ово је интерфејс који описује имплементацију филтера изузетака.
  • Улов: Ово је декоратор који означава класу као филтер изузетака Нест.
  • АргументсХост: Овај интерфејс пружа методе за преузимање аргумената прослеђених руковаоцу. Омогућава вам да изаберете одговарајући контекст извршавања (нпр. ХТТП, РПЦ или ВебСоцкетс) за преузимање аргумената.
  • ХттпЕкцептион: Ово је класа која дефинише основни Нест ХТТП изузетак.
  • Захтев & Одговор: Ово су интерфејси за Екпресс.јс објекат захтева и одговора.

Затим направите класу, ХттпЕкцептионФилтер, који имплементира ЕкцептионФилтер. Означите га са Улов декоратер да назначи да обрађује ХттпЕкцептионс:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

Затим попуните класу овим кодом:

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

Овај блок кода преузима објекте захтева и одговора из објекта АргументсХост и извлачи релевантне информације из изузетка. Клијенту враћа структурирани ЈСОН објектни одговор, са детаљима о грешци.

Обавезујући филтери изузетака

Можете да повежете филтер изузетака за контролер или целу апликацију, у зависности од ваших потреба.

Да бисте глобално повезали филтер изузетака, прво увезите филтер изузетака у свој маин.тс фајл. Затим проследите инстанцу вашег филтера изузетака у апп.усеГлобалФилтерс метод:

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

Да бисте повезали изузетак са контролером, увезите УсеФилтерс декоратер и ваш филтер изузетака. Означите своју класу контролера са @УсеФилтерс декоратер и проследите инстанцу вашег филтера изузетака као аргумент декоратору:

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

Где повежете свој филтер ће одредити обим вашег руковања грешкама. Филтери везани за контролер ће задовољити само контролер за који сте га повезали, а филтери везани за апликацију ће задовољити целу апликацију.

Коришћење уграђених изузетака за избацивање грешака

Нест.јс обезбеђује уграђене класе изузетака које можете да користите за избацивање грешака.

На пример, можете бацити 404 грешке код статуса са НотФоундЕкцептион класа:

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

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

Овај блок кода користи условни исказ да провери да ли дати корисник постоји. Ако не, испушта грешку 404 користећи НотФоундЕкцептион, прослеђујући поруку као аргумент.

Уобичајене уграђене класе изузетака

Друге уграђене класе изузетака укључују, али нису ограничене на, следеће.

  • БадРекуестЕкцептион: Избацује изузетак који указује на лош захтев са статусним кодом 400. Овај изузетак можете користити када је захтев клијента неважећи или погрешно обликован, а сервер не може да га обради због клијентове грешке. То обично подразумева да клијент треба да измени захтев да би био валидан.
  • УнаутхоризедЕкцептион: Избацује изузетак који указује на неовлашћен приступ са статусним кодом 401. Овај изузетак можете користити када корисник није аутентификован или му недостају потребне дозволе за приступ ресурсу.
  • ФорбидденЕкцептион: Избацује изузетак који указује на забрањен приступ са статусним кодом 403. Можете користити овај изузетак када је корисник оверен али неовлашћен да изврши одређену радњу.
  • РекуестТимеоутЕкцептион: Избацује изузетак који указује да је захтев истекао са статусним кодом од 408. Овај изузетак можете користити када сервер прекине захтев јер је обрада трајала предуго.
  • ЦонфлицтЕкцептион: Избацује изузетак који указује на сукоб са статусним кодом 409. Овај изузетак можете користити тамо где постоји сукоб између захтева клијента и тренутног стања ресурса, на пример када покушавате да креирате ресурс који већ постоји.
  • ИнтерналСерверЕррорЕкцептион: Избацује изузетак који указује на интерну грешку сервера са статусним кодом од 500. Овај изузетак можете користити када дође до неочекиване грешке на страни сервера, што указује да сервер не може да испуни захтев због интерног проблема.

Најбоље праксе за руковање грешкама у Нест.јс

Када рукујете грешкама у Нест.јс, обавезно користите филтере изузетака да бисте ухватили и обрадили изузетке глобално или по контролеру. Такође можете креирати прилагођене филтере за одређене типове изузетака.

Поред тога, уверите се да користите одговарајуће уграђене класе изузетака да бисте избацили исправне и значајне грешке. Ове праксе могу значајно да побољшају поузданост ваших Нест.јс апликација.