Exception filters

Exception filters

HTTP 예외 필터 계층과 해당 마이크로 서비스 계층의 유일한 차이점은 HttpException을 발생시키는 대신RpcException을 사용해야 한다는 것입니다.

throw new RpcException('Invalid credentials.');

info 힌트 RpcException 클래스는@nestjs/microservices 패키지에서 가져옵니다.

Nest는 발생된 예외를 처리하고 결과적으로 다음 구조의 error 객체를 반환합니다.

{
  "status": "error",
  "message": "Invalid credentials."
}

Filters

예외 필터는 기본 필터와 동일한 방식으로 작동하지만 작은 차이가 있습니다. catch()메소드는 Observable을 리턴해야 합니다.

@@filename(rpc-exception.filter)
import { Catch, RpcExceptionFilter, ArgumentsHost } from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { RpcException } from '@nestjs/microservices';

@Catch(RpcException)
export class ExceptionFilter implements RpcExceptionFilter<RpcException> {
  catch(exception: RpcException, host: ArgumentsHost): Observable<any> {
    return throwError(exception.getError());
  }
}

경고 하이브리드 애플리케이션 기능을 사용중인 경우 마이크로 서비스 예외 필터를 전체적으로 설정할 수 없습니다.

다음은 수동으로 인스턴스화 된 메소드 범위 필터를 사용하는 예입니다 (클래스 범위도 작동 함).

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

Inheritance

일반적으로 응용 프로그램 요구 사항을 충족하도록 제작된 완전히 사용자 지정된 예외 필터를 만듭니다. 이미 구현 된 핵심 예외 필터를 재사용하고 특정 요인에 따라 동작을 재정의하려는 경우 사용 사례가 있을 수 있습니다.

예외 처리를 기본 필터에 위임하려면 BaseExceptionFilter를 확장하고 상속 된 catch() 메소드를 호출해야합니다. 게다가 HttpServer 참조가 주입되어 super() 호출로 전달되어야 합니다.

@@filename()
import { Catch, ArgumentsHost } from '@nestjs/common';
import { BaseRpcExceptionFilter } from '@nestjs/microservices';

@Catch()
export class AllExceptionsFilter extends BaseRpcExceptionFilter {
  catch(exception: any, host: ArgumentsHost) {
    return super.catch(exception, host);
  }
}

분명히, 당신은 맞춤형 비즈니스 논리로 다양한 구현을 강화해야합니다 (예: 다양한 조건 추가).

Last updated