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.
1throw new RpcException('Invalid credentials.');RpcException klassi @nestjs/microservices paketidan import qilinadi.
Yuqoridagi namunada Nest tashlangan exceptionni qayta ishlaydi va quyidagi struktura bilan error obyektini qaytaradi:
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.
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}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).
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.
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.