Nest.js 탐험 2 - Filter를 등록해보자.

2021. 1. 16. 22:52개발/Node & Javascript

728x90
반응형

개요

Nest.js에 대한 글을 한동안 올리지 못했는데, 이번에는 Filter에 대해서 다뤄보도록 한다.

Filter란?

목적

  • Exception을 handling할 때 주로 사용한다.
  • Handler 별로 또는 global로 셋팅이 가능하다.

예제

1. Error 정의

  • 다음과 같이 에러를 개략적으로 정의해본다.
// malgogiException.ts

export class MalgogiException extends Error {
  status: number;

  constructor(status: number, message?: string) {
    super(message);
    this.status = status;
  }
}

2. Filter 정의

  • 주어진 Exception을 handling할 Filter를 정의한다.
  • 참고로 Response가 잘못잡혀서 webStorm에서 사용시 status를 못찾는 경우가 있다. 이 때는 기본적으로 express를 사용하고 있기 때문에 express의 Response를 넣어주면 된다.

// testExceptionFilter.ts

import { ArgumentsHost, Catch, ExceptionFilter, HttpException } from '@nestjs/common';
import { Response } from 'express';
import { MalgogiException } from '../errors/malgogiException';

@Catch(MalgogiException)
export class MalgogiExceptionFilter implements ExceptionFilter {
  catch(exception: MalgogiException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status = exception.status;

    console.log('This catch excetpion with status:', status);

    response
      .status(status)
      .json({
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: request.url,
      });
  }
}

3. Filter 등록

  • 필터 등록은 크게 세가지 방식이 있다.
3.1. Router handler

@UseFilters(new HttpExceptionFilter())를 핸들러에 등록

3.2. bootstrap시 useGlobalFilters

app.useGlobalFilters(new HttpExceptionFilter());를 통해서 전역 필터로 등록

3.3 provider

아래와 같은 형태로도 전역 필터로 등록이 가능하다.

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

4. Exception을 code에서 발생시키자!!

// app.controller.ts
// 아래는 handler에 filter를 등록하였다.
@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }

  @UseFilters(new MalgogiExceptionFilter())
  @Get("/exception")
  test(): string {
    throw new MalgogiException(400, "malgogi exception");
  }
}

5. test

curl --location --request GET 'localhost:3000/exception'

해당 curl을 실행하면, 등록한대로 아래와 같은 응답을 확인할 수 있다.

{"statusCode": 400,"timestamp":"2021-01-16T13:49:21.672Z","path":"/exception"}

출처

728x90
반응형