throw new NotFoundException();
throw new HttpException('error!', HttpStatus.NOT_FOUND);
NestJS는 httpException 이라는 인터페이스를 제공해서 message 지정도 가능하다!
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter());
const serverConfig = config.get('server');
const port = serverConfig.port;
setupSwagger(app);
await app.listen(port);
}
애플리케이션 전역에 exception filter을 등록
exception 처리결과 응답 형태까지 커스터마이징한다
// 커스텀 exception에 어떤 정보를 담을지 정의
export class BasicException extends HttpException {
code: number;
//super로 부모가 가진 message, status 인자 값 할당, code에 값 할당
constructor(message: string, status: number, code: ErrorCode) {
super(message, status);
this.code = code;
}
}
@Catch()
로 하면 모든 에러를 잡는다..!@Catch()
export class GlobalExceptionFilter implements ExceptionFilter {
catch(exception: any, host: ArgumentsHost) {
//ctx를 실행환경에서 가져와서 http 상태 코드를 할당한다
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
let code;
let status;
if (exception instanceof BasicException) {
code = exception.code;
status = exception.getStatus();
} else if (exception instanceof HttpException) {
code = ErrorCode.NEST_OFFER;
status = exception.getStatus();
} else {
//서버 에러 (500 또는 nest 제공 에러 )
status = 500;
code = ErrorCode.INTERNAL_SERVER_ERROR;
}
response.status(status).json({
code,
message: (exception as any).message,
timestamp: new Date().toISOString(),
});
}
}
export enum ErrorCode {
//Server error
NEST_OFFER = 1,
INTERNAL_SERVER_ERROR = 2,
//Pet error
INVALID_PET_ID = 1000 + 1,
}
export class InvalidPetIdException extends BasicException {
constructor() {
super(
'존재하지 않는 petId 입니다.',
HttpStatus.NOT_FOUND,
ErrorCode.INVALID_PET_ID,
);
}
}
사용시에는 throw new InvalidPetIdException();
와 같이 사용한다!
결과