filter

유석현(SeokHyun Yu)·2022년 12월 23일
0

Nest.js

목록 보기
7/9
post-thumbnail
post-custom-banner

http-exception.filter.ts

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();
    const message = exception.message;

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

nest g filter {필터명}으로 필터 생성 후 위 코드를 작성한다.


app.controller.ts

@UseFilters 데코레이터를 통해 생성한 필터를 사용할 수 있다.

사용하는 방법에는 3가지가 있다.

1번째 방법 은 함수 자체에만 필터를 걸어놓는 것이다.

그 클래스 안의 다른 함수에서 에러가 발생해도 필터링 되지 않고 오직 @UseFilters 데코레이터가 적용된 함수만 필터링 된다.

import { Controller, Get, HttpException, UseFilters } from '@nestjs/common';
import { AppService } from './app.service';
import { HttpExceptionFilter } from './http-exception/http-exception.filter';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  // 필터
  @UseFilters(HttpExceptionFilter)
  getHello(): string {
    throw new HttpException('HTTP EXCEPTION', 500);

    return this.appService.getHello();
  }
}


2번째 방법 은 클래스 전체에 필터를 걸어놓는 것이다.

그 클래스 안의 모든 함수에 대해 HttpExceptionFilter가 적용된다.

import { Controller, Get, HttpException, UseFilters } from '@nestjs/common';
import { AppService } from './app.service';
import { HttpExceptionFilter } from './http-exception/http-exception.filter';

@Controller()
// 필터
@UseFilters(HttpExceptionFilter)
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    throw new HttpException('HTTP EXCEPTION', 500);

    return this.appService.getHello();
  }
}


3번째 방법 은 필터를 글로벌로 등록하는 것이다.

main.ts에서 app.useGlobalFilters()로 필터를 서버의 모든 함수에 대해 적용할 수 있다.

인자로는 해당 필터의 인스턴스를 받는다.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './http-exception/http-exception.filter';

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

profile
Backend Engineer
post-custom-banner

0개의 댓글