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();