반응형
Notice
Recent Posts
Recent Comments
Link
코딩일상
[nest.js] 예외 처리, 예외 필터를 만들어 보자 본문
반응형
Exception 적용전 기본 nest 자체 에러처리 값
HttpException을 적용한경우
HttpException('메세지', HTTPstatusCode)를 넣어서 사용을 할수가 있다.
//cats.controller.ts
@Controller('cats')
export class CatsController {
//dependency injection 의존성 주입
constructor(private readonly catsService: CatsService) {}
// cats/
@Get()
getAllcat() {
throw new HttpException('message', 401);
return 'get all cat api';
}
HttpException을 커스터마이징 한경우
//cats.controller.ts
@Get()
getAllcat() {
throw new HttpException(
{
status: HttpStatus.FORBIDDEN,
error: 'This is a custom message',
},
HttpStatus.FORBIDDEN,
);
return 'get all cat api';
}
HttpStatus.FORBIDDEN의 값은 403이다.
요청 별 에러 처리를 하나하나 하지않는 방법
Handler-level
1) htttp-exception.filter.ts파일을 만들어서 적용을시킨다.
//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();
//res.status(400).send({}) ----express
response.status(status).json({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}
위 HttpExceptionFilter 를 cats.controller GET요청에 적용한 모습
//cats.controller.ts
@Get()
@UseFilters(HttpExceptionFilter)
getAllcat() {
throw new HttpException('api error', 401);
return 'get all cat api';
}
throw new HttpException('api error', 401);의 에러메시지와 StatusCode를('api error', 401)반영하기위해
http-exception.filter.ts에 추가한 사항들
//http-exception.filter.ts
@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();
const errorMessage = exception.getResponse(); //예외 응답값을 받기위해 추가
//res.status(400).send({}) ----express
//HttpExceptionFilter
response.status(status).json({
statusCode: status, //응답 statusCode
success: false,
timestamp: new Date().toISOString(),
path: request.url,
errorMessage, //예외 응답값 추가
});
}
}
Global-level 예외 에러 처리 를 하나하나 하지않는 방법
//main.ts
import { HttpExceptionFilter } from './http-exception.filter';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter());//코드 추가
await app.listen(8000);
}
bootstrap();
main.ts에서 9번째 줄을 추가 하여 진행하면 프로젝트 전체 예외처리가 된다 다만 아래같은 상황와 같은 응답값이 발생할경우
(아래의 상황이란 우리가 예외처리를 해놓지 않은곳에서 발생하는 에러)
조건문을 이용하여 error 메시지의 타입과 형태에 따라 응답방식을 적용해준다.
//http-exception.filter.ts
@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();
const error = exception.getResponse() as
| string
| { error: string; statusCode: number; message: string | string[] };
if (typeof error === 'string') {
response.status(status).json({
success: false,
timestamp: new Date().toISOString(),
path: request.url,
error,
});
} else {
response.status(status).json({
success: false,
timestamp: new Date().toISOString(),
...error,
});
}
}
}
위와같이 우리가 원하는 형태로 예외에러처리를 할 수있다.
레퍼런스
반응형
'개발 공부 > nest.js' 카테고리의 다른 글
[nest.js] interceptor사용법 적용예제 함께 (0) | 2022.12.05 |
---|---|
[nest.js] Pipes란?? Pipes 예제 (0) | 2022.12.05 |
[nest.js] middleware 적용 (0) | 2022.12.05 |
[nest.js] CLI 이용하여 파일 및 폴더 생성방법 (0) | 2022.12.05 |
[nest.js] nest.js 규칙 관련 기본 플러그인들 설명 (0) | 2022.12.03 |
Comments