Nest.js - Exception filters

김세겸·2023년 3월 2일
0

NestJS

목록 보기
10/18
post-thumbnail

1. 예외 필터란?

Nest 프레임워크는 기본적으로 예외 레이어를 제공한다. 이를 통해 기본 예외처리기가 예외를 처리해 준다.

2. Nest 제공 표준 예외

1. HttpException

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

// 매개변수
constructor(response: string | Record<string, any>, status: number, options?: HttpExceptionOptions);
  • response: 응답의 본문
  • status: 에러의 상태를 나타내는 HTTP 상태코드

2. HttpException을 상속받는 표준 예외

3. 예외 필터 만들기

예외 필터는 ExceptionFilter 인터페이스를 구현하는 class로 만들 수 있다.

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

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  private logger = new Logger();

  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const res = ctx.getResponse<Response>();
    const req = ctx.getRequest<Request>();
    const status = exception.getStatus();
    const error = exception.getResponse() as
      | string
      | { error: string; statusCode: number; message: string | string[] };

    this.logger.error(`${req.ip} ${req.originalUrl} ${req.method} ${exception}`)
    res
      .status(status)
      .json({
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: req.url,
        error
      });
  }
}

4. 예외 필터 적용

1. 특정 엔드포인트

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

2. 특정 컨트롤러

@Controller('cats')
@UseFilters(HttpExceptionFilter)
export class CatsController {}

3. 앱 전체 적용

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

5. 로그 미들웨어를 있는데 예외 필터에서 따로 로그를 확인하는이유.

Nest 프레임 워크에서 자체적으로 제공하는 예외 레이어로 인해 사용자의 잘못된 요청을 받거나 서버 문제가 생겼을 때 등 에러가 발생했을 때 에러를 캐치해서 서버가 정상 적으로 돌아가게 한다. 그 이후 미들웨어가 응답으로 날아가는 에러 문자와 에러 코드를 단순히 info형식으로 로그를 보여주고 후 처리 작업을 한다. 이러한 부분을 확실하게 error 로그와 후 처리를 하기위해 커스텀 예외 필터를 추가하여 처리한다.

0개의 댓글