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
반응형
'개발 > Node & Javascript' 카테고리의 다른 글
Nest.js 탐험기3 (부록) - cache를 커스텀 해보자 (1) | 2021.01.22 |
---|---|
Nest.js 탐험기3 - cache를 써보자 (3) | 2021.01.20 |
Node.js event loop 정리해보기 (2) | 2021.01.03 |
ECMA 2020 Changes (3) | 2020.12.17 |
Nest.js 탐험 2 - API 작성해보기 (4) | 2020.12.13 |