Mikroxizmatlar2 min read

Exception filterlar

HTTP exception filter qatlamidan microservices qatlamiga yagona farq shundaki, HttpException tashlash o'rniga RpcExceptiondan foydalanishingiz kerak.

HTTP exception filter qatlamidan microservices qatlamiga yagona farq shundaki, HttpException tashlash o'rniga RpcExceptiondan foydalanishingiz kerak.

TypeScript
1throw new RpcException('Invalid credentials.');
Hint

RpcException klassi @nestjs/microservices paketidan import qilinadi.

Yuqoridagi namunada Nest tashlangan exceptionni qayta ishlaydi va quyidagi struktura bilan error obyektini qaytaradi:

JSON
1{
2  "status": "error",
3  "message": "Invalid credentials."
4}

Filterlar

Microservice exception filterlari HTTP exception filterlariga o'xshash ishlaydi, bitta kichik farq bilan. catch() metodi Observable qaytarishi kerak.

TypeScript
rpc-exception.filter
1import { Catch, RpcExceptionFilter, ArgumentsHost } from '@nestjs/common';
2import { Observable, throwError } from 'rxjs';
3import { RpcException } from '@nestjs/microservices';
4
5@Catch(RpcException)
6export class ExceptionFilter implements RpcExceptionFilter<RpcException> {
7  catch(exception: RpcException, host: ArgumentsHost): Observable<any> {
8    return throwError(() => exception.getError());
9  }
10}
Warning

hybrid application ishlatilganda global microservice exception filterlari default bo'yicha yoqilmaydi.

Quyidagi misolda qo'lda instansiyalangan method-scoped filter ishlatiladi. HTTP asosidagi ilovalar kabi, controller-scoped filterlardan ham foydalanishingiz mumkin (ya'ni, controller klassiga @UseFilters() dekoratorini qo'shing).

TypeScript
1@UseFilters(new ExceptionFilter())
2@MessagePattern({ cmd: 'sum' })
3accumulate(data: number[]): number {
4  return (data || []).reduce((a, b) => a + b);
5}

Meros olish

Odatda, ilovangiz talablariga moslashtirilgan to'liq custom exception filterlar yaratasiz. Biroq, ayrim hollarda shunchaki core exception filterni kengaytirib, ayrim omillarga qarab xatti-harakatni override qilishni xohlashingiz mumkin.

Exceptionni bazaviy filterga delegatsiya qilish uchun BaseExceptionFilterni kengaytirib, meros bo'lib kelgan catch() metodini chaqirishingiz kerak.

TypeScript
1import { Catch, ArgumentsHost } from '@nestjs/common';
2import { BaseRpcExceptionFilter } from '@nestjs/microservices';
3
4@Catch()
5export class AllExceptionsFilter extends BaseRpcExceptionFilter {
6  catch(exception: any, host: ArgumentsHost) {
7    return super.catch(exception, host);
8  }
9}

Yuqoridagi implementatsiya yondashuvni ko'rsatadigan soddalashtirilgan skelet xolos. Kengaytirilgan exception filteringiz implementatsiyasida sizning moslashtirilgan biznes mantiqingiz (masalan, turli shartlarni qayta ishlash) bo'ladi.