Nestjs 튜토리얼 따라하기 6편

Nestjs 튜토리얼 따라하기 6편

Exception filters

Exception filters

  • Nest의 모든 예외를 처리하는 Exception filters가 존재

Nest는 기본적으로 HttpException이 내장되어 있으며 이는 @nestjs/common 패키지에서 불러올 수 있다.

@Get()
async findAll() {
  throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
}


HttpException은 2개의 인수로 구성된다.

  • response : response를 정의한다. 이는 object일 수 있으며 string일 수도 있다.
  • status : HTTP 상태 코드를 정의한다.

response의 JSON object는 2가지 속성이 필요하다.

  • statusCode : 기본값은 status 값에 작성된 값
  • message : HTTP 오류에 대한 설명
@Get()
async findAll() {
  throw new HttpException({
    status: HttpStatus.FORBIDDEN,
    error: 'This is a custom message',
  }, HttpStatus.FORBIDDEN);
}
{
  "status": 403,
  "error": "This is a custom message"
}

Exception filters

import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';

@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,
      });
  }
}


모든 Exception filters는 implements ExceptionFilter를 포함하여야 한다.

위에서 구현한 HttpExceptionFilter를 적용하는 방법은 아래와 같다.

@Post()
@UseFilters(new HttpExceptionFilter())
async create(@Body() createCatDto: CreateCatDto) {
  throw new ForbiddenException();
}

여기서 @UseFilters()@nestjs/common 패키지에서 제공된다.


또한 필터를 전역으로 적용하기 위하여 아래와 같이 코드를 작성한다.

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new HttpExceptionFilter());
  await app.listen(3000);
}
bootstrap();


혹은 모듈 단위로 필터를 적용할 수 있다.

import { Module } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';

@Module({
  providers: [
    {
      provide: APP_FILTER,
      useClass: HttpExceptionFilter,
    },
  ],
})
export class AppModule {}