기본적으로 NestJS에서 Controller단에서 데이터를 응답하면 이를 JSON 형식으로 알아서 변환해줘서 응답해준다. 그러나 각자의 데이터가 다르기에 다양한 형식으로 응답이 되기도 하며, 오류일때 또한 응답이 형태가 달라지기 때문에 이를 일관된 응답으로 보내고 싶기에 응답을 custom하기로 해보았다.
Nest에서는 처음 해보는 작업이였기에 여러 코드를 참고했다.
Nest Js에서 내 마음대로 에러를 응답해주고 싶어요
기본적으로는 위 포스팅을 참조했다.
export class CustomException extends HttpException {
customCode: CustomCode;
data?: any;
constructor(customException: ECustomException, data?: any) {
super(customException.message, customException.statusCode);
this.customCode = customException.customCode;
this.data = data;
}
}
@Catch()
export class GlobalExceptionFilter implements ExceptionFilter {
catch(exception: any, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response: Response = ctx.getResponse<Response>();
let customCode: CustomCode;
let statusCode: HttpStatus;
if (exception instanceof CustomException) {
customCode = exception.customCode;
statusCode = exception.getStatus();
} else if (exception instanceof HttpException) {
customCode = CustomCode.NEST_OFFER;
statusCode = exception.getStatus();
} else {
customCode = CustomCode.INTERNAL_SERVER_ERROR;
statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
}
response.status(statusCode).json({
customCode: customCode,
message: exception.message,
statusCode: statusCode,
data: exception.data,
});
}
}
우선 HttpException을 상속하는 CustomException을 선언해주고 내가 원하는 필드인 customCode와 data 부분을 추가해줬다. data부분은 optional로, 필요한 경우에만 사용한다.
그 다음엔 커스텀한 예외를 잡아줄 필터를 작성한다. @Catch()
데코레이터를 사용하면 어떤 Exception을 잡을지 설정할 수 있다. 비워두면 모든 Exception을 잡아둔다.
그리고 안에서 분기를 해준다. 예외가 터지는 경우는 크게 3가지로 나뉠 수 있는데 내가 선언한 CustomException이거나, 아니면 그 상위의 HttpException, 아니면 더 위의 Error 일 것이다. 3개의 상황에 따라 원하는 값을 설정해주면 된다.
마지막으로 main.ts에 해당 필터를 적용시켜주면 된다.
app.useGlobalFilters(new GlobalExceptionFilter());