아래의 예시를 살펴보자
import { HttpException, HttpStatus } from '@nestjs/common';
@Get()
async findAll() {
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
}
위 예시는 Get요청에서 임의로 예외를 발생 시킨 상황이다.
위 작업에 대한 응답은 다음과 같다.
{
"statusCode": 403,
"message": "Forbidden"
}
JSON 응답은 statusCode(HTTP 상태 코드, 생성자의 status 인자로 전달된 HTTP 상태코드)와 message(status 인자에 기반한 HTTP 에러의 설명 문자열)라는 두 가지 프로퍼티를 갖는다.
// http-exception.filter.ts
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
const status = exception.getStatus();
response
.status(status)
.json({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}
위 예제는 HttpException 예외 발생 시에 적용되는 커스텀 응답 로직을 구현한다고 하는데 아직은 공부와 실전연습이 좀 필요해 보인다.
핸들러 메서드 수준
@Post()
@UseFilters(new HttpExceptionFilter())
async create(@Body() createCatDto: CreateCatDto) {
throw new ForbiddenException();
}
컨트롤러 수준
@UseFilters(new HttpExceptionFilter())
export class CatsController {}
전역으로
// main.ts
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter());
await app.listen(3000);
}
bootstrap();
참고: 네스트 공식문서