-
Nest.js 개요 및 객체 지향 디자인 패턴 3 (Exception filter & Pipes)FrameWork/Nest.js 2022. 6. 20. 14:37
Exception filter
매칭 url이 되지 않은 아무 404 entrypoint로 들어갈 경우 Nest.js 만의 규칙으로 자동으로 "statusCode","message","error"내용을 요소로 가지는 객체를 반환한다. 실제로 서비스에 사용할 때 추가 적인 정보를 넣어서 응답받고 싶다면 어떻게 해야할까?
HttpException
Nest.js에서 Http에 대한 error는 제공하는 interface인 HttpException으로 처리를 한다.
괄호 안에 error message와 status를 넣으면 된다.
Exception 처리가 있다면 exception 처리가 하나로 모여서, 재사용성 고려 => 필터링 => response로 반환
Exception filter를 적용하는 2가지 방법
1. 각각 url에 적용하는 방법
@Post() @UseFilters(HttpExceptionFilter) async create(@Body() createCatDto: CreateCatDto) { throw new ForbiddenException(); }
@UseFilters 데코레이터를 사용해서, 해당하는 filter를 인자로 넘겨주고, 해당 함수 안에서 Exception이 발생하게 되면 그 Exceptio에 대한 내용이 @UseFilters 안에 인자로 들어온 filter로 넘어가게 되서, 반환이 되는 것이다.
위 와 같이 코드를 작성하면, getAllCat에서 발생한 Exception이 필터링되서, Response에 전달이 된다.
해당 url로 Request를 보내면, 위 그림과 같은 object가 Response된 것을 확인할 수 있다. 위와 같은 object가 Response된 것은 HttpExceptionFilter를 겉쳤기 때문이다.
HttpExceptionFilter class를 보면, response로 위와 같은 object를 반환하도록 되어 있기 때문이다.
'api is borken'이라는 Exception 발생 시 message를 담고 싶다면, HttpException 객체 생성시 전달된 해당 메시지를 catch함수 안에서. exception 객체가 가지는 getResponse() 매서드로 불러와서 url을 요청한 곳에 반환할 response object에 error 속성에 담는다.
요청 url => Get http://localhost:3000/cats
HttpExcepttionFilter에 정의된 대로 object가 반환되는 것을 확인 할 수 있다.
2.전역에 적용하는 방법
@Controller('') @UseFilters(new HttpExceptionFilter()) export class CatsController {}
404같이 Nest.js에서 자체적으로 처리하는 Error에 filter 처리하기
main.ts
async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalFilters(new HttpExceptionFilter()); await app.listen(3000); } bootstrap();
위 와 같이 global로 등록을 해서 처리할 수 있다.
요청 url => Get http://localhost:3000/agsd
위 와 같이 HttpExceptionFilter()에 정의 된대로 error object가 반환되고 Nest.js 자체에서 생성한 error 메세지는 "error" 속성에 들어가서 출력 되고 있는 것을 확인 할 수있다.
Pipes
파이프에는 두 가지 일반적인 사용 사례가 있다.
- 변환 : 입력 데이터를 원하는 형식으로 변환(예: 문자열에서 정수로)
- 유효성 검사 : 입력 데이터를 평가하고 유효하면 변경하지 않고 전달한다. 그렇지 않으면 데이터가 올바르지 않을때 발생하는 예외를 발생시킨다.
바인딩 파이프
@Get(':id') async findOne(@Param('id', ParseIntPipe) id: number) { return this.catsService.findOne(id); }
위 와 같은 경우에 id가 string으로 넘어 오는데 id를 number로 형 변환 해주는 것을 ParseIntPipe가 해준다.
요청 url => Get http://localhost:3000/cats/123
url로 전달된 param 123의 type이 log에 number로 잘찍히는 것을 확인할 수 있다.
요청 url => Get http://localhost:3000/cats/abc
param을 number type으로 변환하는 url에 abc를 param 으로 보내면 validation오류를 Response하는 것 까지 확인할 수 있다.
'FrameWork > Nest.js' 카테고리의 다른 글
Nest.js-TypeOrm 관계 (0) 2022.07.07 JWT와 로그인 서비스& 순환 참조 모듈 (0) 2022.07.03 Nest.js 개요 빛 객체지향 디자인 패턴 2 (Modules, 캡슐화) (0) 2022.06.19 Nest.js 개요 및 객체 지향 디자인 패턴 1(DI, Provider) (0) 2022.06.19 Nest.js Api만들기 3 (@Query ) (0) 2022.06.17