예외 필터(Exception filter)
Nest 에서 제공하는 전역 예외 필터 이외에 직접 예외 필터 레이어를 두어 원하는 대로 예외를 핸들링할 수 있습니다.
예외 필터(Exception filter)는 예외가 일어났을 때 에러 로그를 남기거나 응답 객체를 원하는 대로 변경하고자 하는 등의 요구사항을 해결하고자 할 때 사용합니다.
예외가 발생했을 때 모든 예외(Error)를 잡아서 원하는 대로 핸들링할 수 있는 예외 필터를 만들어보고자 합니다.
import { ArgumentsHost, Catch, ExceptionFilter, HttpException, InternalServerErrorException } from '@nestjs/common';
import { Request, Response } from 'express';
@Catch()
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: Error, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const status = exception.getStatus();
const err = exception.getResponse() as
| { message: any; statusCode: number }
| { error: string; statusCode: 400; message: string[] };
// HttpException이 아닌 예외(알 수 없는 에러)거나 InternalServerErrorException인 예외인 경우
if (!(exception instanceof HttpException) || (exception instanceof InternalServerErrorException)) {
return response.status(500).json({
success: false,
code: 500,
data: '서버 내부에서 발생한 에러'
});
}
response.status(status).json({
success: false,
code: status,
data: err.message,
});
}
}
@Catch( ) 데코레이터는 처리되지 않은 모든 예외를 잡으려고 할 때 사용합니다.
어플리케이션에서 다루는 대부분의 예외는 HttpException을 상속받는 클래스들(NotFoundException, UnauthorizedException, ConflictException 등)로 처리합니다.
HttpException이 아닌 예외는 알 수 없는 에러로 InternalServerErrorException 으로 처리되도록 합니다.
예외 필터(Exception filter) 적용
특정 엔드포인트에 적용
@Controller('users')
export class UsersController {
// ...
@UseFilters(HttpExceptionFilter)
@Post()
join(@Body() joinRequestDto: JoinRequestDto) {
return this.userService.join(joinRequestDto);
}
// ...
}
특정 컨트롤러 전체에 적용
@Controller('users')
@UseFilters(HttpExceptionFilter)
export class UsersController {
// ...
}
애플리케이션 전체에 적용
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter()); // 전역 필터 적용
await app.listen(8080);
}
출처
'라이브러리 & 프레임워크 > NestJS' 카테고리의 다른 글
[Nest] WebSocket 서버 구성하기(feat. Socket.io) (0) | 2022.12.12 |
---|---|
[NestJS] Authentication (0) | 2022.11.29 |
Validation (0) | 2022.11.28 |
Mapped Types (0) | 2022.11.28 |
[TypeORM] 마이그레이션 (0) | 2022.11.27 |