NestJs - Exception Filter

choko's avatar
Jun 29, 2024
NestJs - Exception Filter
 
 
  • NestJs는 별도 설치 없이 내장된 global exception filter가 존재한다.
{ "statusCode": 500, "message": "Internal server error" }
 
 

Custom Exception, Exception Filter

  • exception을 custom해서 사용할 수 있다.
  • Custom Exception을 사용하기 위해, httpExcetion 클래스를 상속받는다.
  • Exception Filter은 exception layer을 완전히 제어하고 싶을 때 사용한다.
    • Client에게 보내지는 응답의 내용이나 제어의 정확한 흐름을 제어할 수 있다.
    • @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, }); } }
    • @Catch(HttpException)
      • 이 filter가 httpException에 해당하는 예외만 찾고 있음을 nest에게 알린다.
    • catch(HttpException, ArgumentsHost)
      • HttpException : 현재 처리중인 exception object
      • ArgumentsHost → 모든 context에서 작동하기 때문에, filter에서 사용할 수 있다.
       

filter binding

  • @UseFilters()를 통해 바인딩한다.
    • 바인딩의 범위는 특정 핸들러, 클래스, app 전체 등 다양한 수준의 범위를 할당할 수 있다.
      • router handler 단위
      • @Post() @UseFilters(new HttpExceptionFilter()) async create(@Body() createCatDto: CreateCatDto) { throw new ForbiddenException(); }
      • class 단위
      • @UseFilters(new HttpExceptionFilter()) export class CatsController {}
      • app 전체 (global)
        • @useGlobalFilters()
        • 외부에서 생성 후 DI 주입
        async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalFilters(new HttpExceptionFilter()); await app.listen(3000); } bootstrap(); // app.module.ts import { Module } from '@nestjs/common'; import { APP_FILTER } from '@nestjs/core'; @Module({ providers: [ { provide: APP_FILTER, useClass: HttpExceptionFilter, }, ], }) export class AppModule {}
         
         

Catch everything

  • @Catch(EXCEPTION)에 걸리지 않은 다른 모든 예외들은, @Catch() 로 처리
    • @Catch() export class AllExceptionsFilter implements ExceptionFilter { ... }
 
 
Share article

Tom의 TIL 정리방