1. Exception filter
Postman에서 존재하지않는 주소로 접속해보면
위와같이
message,error,statuscode 형식으로 nestJS에서 제공하는 형식으로 에러를 반환하는것을 확인할 수 있다
나중에 내 서비스를 제작할때 에러시 추가적으로 항목을 보여주고싶을수 있다
CatsController를 예시로 보자
import { CatsService } from './cats.service';
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Get()
getAllCat() {
return 'aaa';
}
@Get(':id')
getMyCat() {
return 'aba';
}
}
이상태에서 에러를 일부러 내보겠다
보통 Nodejs에서 에러를 처리할때
throw new Error("") 이런식으로 처리하는데
NestJS에서는
throw new HttpException이라고 NestJS에서 제공해주는 인터페이스가 있다
에러메시지와 status를 파라미터로 넣어주면된다.
import { CatsService } from './cats.service';
import { Controller, Get, HttpException } from '@nestjs/common';
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Get()
getAllCat() {
throw new HttpException('api is broken', 401);
return 'aaa';
}
@Get(':id')
getMyCat() {
return 'aba';
}
}
그런다음 POSTMAN으로 접속해보자
위와 같이 설정해놓은 에러항목들이 반환 되는것을 확인할 수 있다.
또한 자신의 서비스 형태에 맞게 에러를 완전 커스텀할수도 있는데
HttpException에 첫번째 파라미터에 json형태로 넣어주면된다
import { CatsService } from './cats.service';
import { Controller, Get, HttpException } from '@nestjs/common';
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Get()
getAllCat() {
throw new HttpException(
{ success: false, message: 'you can not see me' },
401,
);
return 'aaa';
}
@Get(':id')
getMyCat() {
return 'aba';
}
}
만약 success: false는 그대로 쓰고
message만 상황에따라서 바꿔서 쓰고싶은데
항상 사용할때마다 아래처럼 쓰고 메시지만 바꿔서 써야할까?
throw new HttpException(
{ success: false, message: 'hello again' },
401,
);
그러면 되게 비효율적이다
재사용성을 위해 한곳에 모아놓을 수 있다
'필터'를 통해 response로 반환해줄수 있는데
src아래에 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,
});
}
}
이후 이 필터를 적용해야하는데
필터를 적용하는 방법에는 두가지가 있다
각각에서 적용하는 방법과
전역에서 적용하는 방법이 있다
1. 각각 적용하는 방법
아래와 같이 메소드 위에 UseFilters와같은 데코레이터를 사용해서 해당하는 필터를 인자로 넘겨주고
만약 함수 안에서 Exception이 날경우 그 Exception에 대한 내용이 필터로 넘어가게된다
@Post()
@UseFilters(HttpExceptionFilter)
async create(@Body() createCatDto: CreateCatDto) {
throw new ForbiddenException();
}
2. 전역으로 적용하는 방법
main에다가 전역으로 아래와같이 적용할 수 도 있다
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter());
await app.listen(3000);
}
bootstrap();
2.Pipes
Get으로 파라미터를 보낼때 보통 숫자를 보낼일이 많은데
파라미터특성상 보내면 문자열로 받아진다
그래서 숫자로 작성한 매개변수를 숫자타입으로 변환하고
또한 매개변수가 숫자로 보내왔는지 유효성 체크까지 해주는 것이 바로 파이프이다
@Get(:id)
async findOne(@param('id', ParseIntPipe) id: number) {
return this.catsService.findOne(id);
}
다양한 파이프들을 배치해서 최초로 들어온 매개변수가 각각의 태스크들을 순차적으로 거치고 나면
최종적으로 id 로 매개변수가 들어가게 된다
ParseIntPipe 같은 것들을 task라고 한다
'웹 개발 > 🟩 Node.js' 카테고리의 다른 글
NestJS | Interceptors & AOP 패턴 (0) | 2024.02.29 |
---|---|
NestJS | 미들웨어 (0) | 2024.02.21 |
NestJS | Modules & 캡슐화 (0) | 2024.02.14 |
NestJS | Providers & 의존성 주입(DI) (0) | 2024.02.13 |
NestJS | 구조 & Controller 패턴 (0) | 2024.02.13 |