개발/Node & Javascript
Nest.js 탐험 2 - Filter를 등록해보자.
말고기
2021. 1. 16. 22:52
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
반응형