반응형
1. 개요
- 앞선 여번째 포스팅에서 아래와 같이 Middleware를 활용한 로그설정을 하였다.
- https://arckwon.tistory.com/entry/nestjs-typeorm-backend-Middleware-%EB%A1%9C%EA%B7%B8%EC%84%A4%EC%A0%95-6
- 이번포스팅에서는 Exception filters를 통한 예외처리를 해보겠다.
- 아래는 최종완성된 폴더경로이다.
2. Exception filters (예외필터) 개념
- Nest에는 애플리케이션 전체에서 처리되지 않은 모든 예외 처리를 담당하는 예외 계층이 포함되어 있습니다.
- 응용 프로그램코드에 의해 예외가 처리되지 않으면 이 계층에 의해 예외가 포착되어 자동으로 사용자에게 친숙한 응답이 전송됩니다.
3. Exception filters 적용
- src > common > exception > http-exception.filter.ts 파일을 생성한다.
- 오류가 발생시 해당 필터가 catch하여 json 형태로 오류메시지를 클라이언트에게 제공한다.
# http-exception.filter.ts
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
HttpStatus,
} 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 instanceof HttpException
? exception.getStatus()
: HttpStatus.INTERNAL_SERVER_ERROR;
const res: any = exception.getResponse();
response.status(status).json({
success: false,
message: res.message,
});
}
}
- 위코드를 적용후 강제로 오류발생시 아래와 같이 클라이언트는 오류메시지를 응답받는다.
- main.ts에 아래코드를 추가한다.
- 일일이 컨트롤러 메서드에 추가하지않고 전역으로 사용할수 있다.
# main.ts
import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import { AppModule } from './app.module';
import { Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { ValidationPipe } from '@nestjs/common';
import { LoggingInterceptor } from './common/interceptors/logging.interceptor';
import { HttpExceptionFilter } from './common/exception/http-exception.filter';
async function bootstrap() {
// Logger Level
const app: NestExpressApplication = await NestFactory.create(AppModule, {
logger:
process.env.NODE_ENV === 'prod'
? ['error', 'warn', 'log']
: ['error', 'warn', 'log', 'verbose', 'debug'],
});
// CORS
app.enableCors({
origin: '*',
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS',
optionsSuccessStatus: 200,
});
// Interceptor
app.useGlobalInterceptors(new LoggingInterceptor());
// Exception Filter
app.useGlobalFilters(new HttpExceptionFilter());
const yamlConfig: ConfigService = app.get(ConfigService);
const port: number = yamlConfig.get<number>('server.port');
await app.listen(port, () => {
Logger.log(`Application listening on port ${port}`);
});
}
bootstrap();
반응형
'개발 > nest.js' 카테고리의 다른 글
nestjs + typeorm backend 회원가입 / 소스포함 (10) (0) | 2023.03.29 |
---|---|
nestjs + typeorm backend helmet사용 (9) (0) | 2023.03.28 |
nestjs + typeorm backend csrf처리 (8) (0) | 2023.03.27 |
nestjs + typeorm backend 인터셉터,CORS (5) (0) | 2023.03.23 |
nestjs + typeorm backend 서버 만들기 CRUD (4) (0) | 2023.03.20 |