Како користити Нест.јс филтере изузетака за руковање грешкама

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

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

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

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

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

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

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

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

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

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

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

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

import { Request, Response } from 'express';

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

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

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

 @Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {}

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

 catch(exception: HttpException, host: ArgumentsHost) {
    
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();

    
    const request = ctx.getRequest<Request>();

    
    const status = exception.getStatus();

    
    response.status(status).json({
      statusCode: status,
      timestamp: new Date().toISOString(),
      path: request.url,
      message:
        exception.message
       || exception.getResponse()['message']
       || 'Internal Server Error',
    });
}

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

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

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

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

 
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './exception/http.exception';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  
  app.useGlobalFilters(new HttpExceptionFilter());

  await app.listen(4050);
}

bootstrap();

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

 @Controller()
@UseFilters(new HttpExceptionFilter())
export class AppController {}

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

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

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

  Како препознати да ли вас је неко оставио на Снапцхату или вам није био пријатељ

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

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

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

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

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

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

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

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

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

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