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

Was this helpful?