개발일지
[NestJS] 예외 처리와 exception filter 본문
HttpException
NestJS에서는 예외 처리를 위한 exception layer가 내장되어 있습니다. 이는 전역으로 설정 되어 있으며 HttpException 타입의 예외를 처리합니다. 내장된 HttpException class를 사용하여 예외를 처리할 경우 다음과 같은 응답형태를 띕니다.
{
"statusCode": 403,
"message": "Forbidden"
}
이를 그대로 사용할 수도 있지만, 원하는 응답 형태를 위해 exception을 커스텀해주었습니다.
// common/middleware/http-exception.filter.ts
export class CustomException extends HttpException {
constructor(exceptionObj: ExceptionObj) {
super(exceptionObj, HttpStatus.BAD_REQUEST);
}
}
Exception filter
NestJS에서의 exception layer은 HttpException를 제외한 에러는 모두 internal server error로 던지게 됩니다. exceptioin에 대한 옵션을 좀 더 세부화 하기 위해 ExceptionFilter를 재정의했습니다. 현재는 @Catch(HttpException)
처럼 HttpException에 대한 에러만 설정되어 있습니다. 후에 더 세부화할 계획입니다.
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const response = host.switchToHttp().getResponse<Response>();
const status = exception.getStatus();
const exceptionObj = exception.getResponse();
response.status(status).json({
error: {
code: exceptionObj['code'],
message: exceptionObj['message'],
},
});
}
}
재정의한 예외 필터를 전역 설정 및 의존성 주입합니다.
// main.ts
import { HttpExceptionFilter } from './common/middleware/http-exception.filter';
async function bootstrap() {
app.useGlobalFilters(new HttpExceptionFilter());
...
await app.listen(3000);
}
@Module({
...
providers: [
AppService,
{
provide: APP_FILTER,
useClass: HttpExceptionFilter,
},
],
})
Exception message 관리하기
common 폴더에 예외 코드와 메세지들만을 관리하기 위한 모듈을 생성했습니다.
// exception.message.ts
export type ExceptionObj = {
code: string;
message: string;
};
export class UsersException {
static USER_ALREADY_EXISTS: ExceptionObj = {
code: '00003',
message: '이미 가입된 이메일입니다.',
};
...
}
다음과 같이 사용합니다.
async signUp(...) {
const user: Users = await this.usersRepository.findUserByWhereOption(
whereOption,
);
if (user) {
throw new CustomException(UsersException.USER_ALREADY_EXISTS);
}
}
'NestJS, Node.js > #01 Project - 투표 커뮤니티' 카테고리의 다른 글
[NestJS] 로그인 구현 #1 - 유효성 검증 (0) | 2022.10.27 |
---|---|
[NestJS] 회원가입 구현 #2 - 유효성 검증 (0) | 2022.10.27 |
[NestJS] 회원가입 구현 #1 - Pipe 적용 (0) | 2022.10.27 |
[NestJS] Interceptor 적용하기 (0) | 2022.10.27 |
[NestJS] 프로젝트 세팅하기 (0) | 2022.10.27 |