Nest 프레임워크는 기본적으로 예외 레이어를 제공한다. 이를 통해 기본 예외처리기가 예외를 처리해 준다.
@Get()
async findAll() {
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
}
// 매개변수
constructor(response: string | Record<string, any>, status: number, options?: HttpExceptionOptions);
- response: 응답의 본문
- status: 에러의 상태를 나타내는 HTTP 상태코드
예외 필터는 ExceptionFilter 인터페이스를 구현하는 class로 만들 수 있다.
import { ExceptionFilter, Catch, ArgumentsHost, HttpException, Logger } from '@nestjs/common';
import { Request, Response } from 'express';
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
private logger = new Logger();
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const res = ctx.getResponse<Response>();
const req = ctx.getRequest<Request>();
const status = exception.getStatus();
const error = exception.getResponse() as
| string
| { error: string; statusCode: number; message: string | string[] };
this.logger.error(`${req.ip} ${req.originalUrl} ${req.method} ${exception}`)
res
.status(status)
.json({
statusCode: status,
timestamp: new Date().toISOString(),
path: req.url,
error
});
}
}
@Post()
@UseFilters(HttpExceptionFilter)
async create(@Body() createCatDto: CreateCatDto) {
throw new ForbiddenException();
}
@Controller('cats')
@UseFilters(HttpExceptionFilter)
export class CatsController {}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(HttpExceptionFilter);
await app.listen(3000);
}
bootstrap();
Nest 프레임 워크에서 자체적으로 제공하는 예외 레이어로 인해 사용자의 잘못된 요청을 받거나 서버 문제가 생겼을 때 등 에러가 발생했을 때 에러를 캐치해서 서버가 정상 적으로 돌아가게 한다. 그 이후 미들웨어가 응답으로 날아가는 에러 문자와 에러 코드를 단순히 info형식으로 로그를 보여주고 후 처리 작업을 한다. 이러한 부분을 확실하게 error 로그와 후 처리를 하기위해 커스텀 예외 필터를 추가하여 처리한다.