Exception filters
Exception filters
Nest์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฒ๋ฆฌ๋์ง ์์ ๋ชจ๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ด์ฅ ์์ธ ๋ ์ด์ด๊ฐ ์ ๊ณต๋ฉ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ ์ฝ๋์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด์ด ๊ณ์ธต์์ ์์ธ๋ฅผ ํฌ์ฐฉํ์ฌ ์ ์ ํ ์ฌ์ฉ์ ์นํ์ ์ธ ์๋ต์ ์๋์ผ๋ก ๋ณด๋ ๋๋ค.

๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๋์์ ๋ด์ฅ ๋ ์ ์ญ ์์ธ ํํฐ์ ์ํด ์ํ๋๋๋ฐ, ์ด ์์ธ๋ HttpException ์ ํ (๋ฐ ๊ทธ ํ์ ํด๋์ค)์ ์์ธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์์ธ๊ฐ unrecognized ์ธ ๊ฒฝ์ฐ ( HttpException ๋๋ HttpException์์ ์์๋๋ ํด๋์ค๊ฐ ์๋) ํด๋ผ์ด์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ JSON ์๋ต์๋ฐ์ต๋๋ค.
{
"statusCode": 500,
"message": "Internal server error"
}Base exceptions
๋ด์ฅ ๋ HttpExceptionํด๋์ค๋ @nestjs/common ํจํค์ง์์ ๊ณต๊ฐ๋ฉ๋๋ค.
CatsController์๋ findAll() ๋ฉ์๋ (GET ๊ฒฝ๋ก ํธ๋ค๋ฌ)๊ฐ ์์ต๋๋ค. ์ด๋ค ์ด์ ๋ก ์ด ๋ผ์ฐํธ ํธ๋ค๋ฌ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ์ด๋ฅผ ์ค๋ช
ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ํ๋ ์ฝ๋ฉํฉ๋๋ค.
@@filename(cats.controller)
@Get()
async findAll() {
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
}info ํํธ ์ฌ๊ธฐ์๋
HttpStatus๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์ด๊ฒ์@nestjs/commonํจํค์ง์์ ๊ฐ์ ธ์จ ํฌํผ ์ด๊ฑฐํ์ ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ด ์๋ ํฌ์ธํธ๋ฅผ ํธ์ถํ๋ฉด ์๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{
"statusCode": 403,
"message": "Forbidden"
}HttpException ์์ฑ์๋ ์๋ต์ ๊ฒฐ์ ํ๋ ๋ ๊ฐ์ง ํ์ ์ธ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
response์ธ์๋ JSON ์๋ต ๋ณธ๋ฌธ์ ์ ์ํฉ๋๋ค. ์๋์ ์ค๋ช ๋๋๋ก๋ฌธ์์ด๋๋๊ฐ์ฒด์ผ ์ ์์ต๋๋ค.status์ธ์๋ HTTP ์ํ ์ฝ๋๋ฅผ ์ ์ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก JSON ์๋ต ๋ณธ๋ฌธ์๋ ๋ ๊ฐ์ง ์์ฑ์ด ์์ต๋๋ค.
statusCode:status์ธ์์ ์ ๊ณต๋ HTTP ์ํ ์ฝ๋๋ก ๊ธฐ๋ณธ ์ค์ message:์ํ์ ๊ธฐ๋ฐํ HTTP ์๋ฌ์ ๋ํ ๊ฐ๋จํ ์ค๋ช
JSON ์๋ต ๋ณธ๋ฌธ์ ๋ฉ์์ง ๋ถ๋ถ ๋ง ์ฌ์ ์ํ๋ ค๋ฉด response ์ธ์์ ๋ฌธ์์ด์ ์ ๊ณตํ์ญ์์ค.
์ ์ฒด JSON ์๋ต ๋ณธ๋ฌธ์ ์ฌ์ ์ํ๋ ค๋ฉด response ์ธ์์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ์ญ์์ค. Nest๋ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ์ฌ JSON ์๋ต ๋ณธ๋ฌธ์ผ๋ก ๋ฐํํฉ๋๋ค.
๋ ๋ฒ์งธ ์์ฑ์ ์ธ์ status๋ ์ ํจํ HTTP ์ํ ์ฝ๋ ์ฌ์ผํฉ๋๋ค. ๋ชจ๋ฒ ์ฌ๋ก๋@nestjs/common์์ ๊ฐ์ ธ์จ HttpStatus ์ด๊ฑฐ ํ์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๋ค์์ ์ ์ฒด ์๋ต ๋ณธ๋ฌธ์ ์ฌ์ ์ ํ๋ ์์ ๋๋ค.
@@filename(cats.controller)
@Get()
async findAll() {
throw new HttpException({
status: HttpStatus.FORBIDDEN,
error: 'This is a custom message',
}, 403);
}์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์๋ต์ด ๋ํ๋ฉ๋๋ค.
{
"status": 403,
"error": "This is a custom message"
}Exceptions hierarchy
์์ธ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ง์ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์ ์ ์ HTTP ์์ธ๊ฐ ๊ธฐ๋ณธ HttpException ํด๋์ค์์ ์์๋์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก Nest๋ ์์ธ๋ฅผ ์ธ์ํ๊ณ ์๋์ผ๋ก ์ค๋ฅ ์๋ต์ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฌํ ์ปค์คํ
์์ธ๋ฅผ ๊ตฌํํด ๋ด
์๋ค :
@@filename(forbidden.exception)
export class ForbiddenException extends HttpException {
constructor() {
super('Forbidden', HttpStatus.FORBIDDEN);
}
}ForbiddenException์ ๊ธฐ๋ณธ HttpException์ ํ์ฅํ๋ฏ๋ก ๋ด์ฅ ์์ธ ํธ๋ค๋ฌ์ ์๋ฒฝํ๊ฒ ์๋ํ๋ฏ๋ก findAll() ๋ฉ์๋ ๋ด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@@filename(cats.controller)
@Get()
async findAll() {
throw new ForbiddenException();
}HTTP exceptions
์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์์ฑํ ํ์์ฑ์ ์ค์ด๊ธฐ ์ํด Nest๋ ์ฝ์ด HttpException์์ ์์๋๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ธ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ค ๋ชจ๋๋ @nestjs/common ํจํค์ง์์ ๊ณต๊ฐ๋ฉ๋๋ค:
BadRequestExceptionUnauthorizedExceptionNotFoundExceptionForbiddenExceptionNotAcceptableExceptionRequestTimeoutExceptionConflictExceptionGoneExceptionPayloadTooLargeExceptionUnsupportedMediaTypeExceptionUnprocessableEntityExceptionInternalServerErrorExceptionNotImplementedExceptionBadGatewayExceptionServiceUnavailableExceptionGatewayTimeoutException
Exception filters
๊ธฐ๋ณธ (๋ด์ฅ) ์์ธ ํํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌ ํ ์ ์์ง๋ง ์์ธ ๋ ์ด์ด๋ฅผ ์์ ํ ์ ์ด ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ๋์ ์์ธ์ ๋ฐ๋ผ ๋ก๊น ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ค๋ฅธ JSON ์คํค๋ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ธ ํํฐ๋ ์ด ๋ชฉ์ ์ ์ํด ์ค๊ณ๋์์ต๋๋ค.
HttpExceptionํด๋์ค์ ์ธ์คํด์ค์ธ ์์ธ๋ฅผ ํฌ์ฐฉํ๊ณ ์ด์ ๋ํ ์ฌ์ฉ์ ์ ์ ์๋ต ๋ก์ง์ ๊ตฌํํ๋ ์์ธ ํํฐ๋ฅผ ์์ฑํด ๋ด
์๋ค.
@@filename(http-exception.filter)
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,
});
}
}
@@switch
import { Catch, HttpException } from '@nestjs/common';
@Catch(HttpException)
export class HttpExceptionFilter {
catch(exception, host) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const request = ctx.getRequest();
const status = exception.getStatus();
response
.status(status)
.json({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}info ํํธ ๋ชจ๋ ์์ธ ํํฐ๋ ์ผ๋ฐ
ExceptionFilter <T>์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด์๋catch (exception: T, host: ArgumentsHost)๋ฉ์๋์ ํ์๋ ์๋ช ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.T๋ ์์ธ ์ ํ์ ๋ํ๋ ๋๋ค.
@Catch (HttpException) ๋ฐ์ฝ๋ ์ดํฐ๋ ํ์ํ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์์ธ ํํฐ์ ๋ฐ์ธ๋ฉํ์ฌ ์ด ํน์ ํํฐ๊ฐ HttpException์ ํ์ ์์ธ๋ฅผ ์ฐพ๊ณ ์์์ Nest์๊ฒ ์๋ ค์ค๋๋ค. @Catch() ๋ฐ์ฝ๋ ์ดํฐ๋ ๋จ์ผ ๋งค๊ฐ ๋ณ์ ๋๋ ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ์ ํ์ ์์ธ์ ๋ํ ํํฐ๋ฅผ ํ ๋ฒ์ ์ค์ ํ ์ ์์ต๋๋ค.
Arguments host
catch() ๋ฉ์๋์ ๋งค๊ฐ ๋ณ์๋ฅผ ๋ณด์. exception ๋งค๊ฐ ๋ณ์๋ ํ์ฌ ์ฒ๋ฆฌ์ค์ธ ์์ธ ๊ฐ์ฒด์
๋๋ค. host ๋งค๊ฐ ๋ณ์๋ ArgumentsHost ๊ฐ์ฒด์
๋๋ค. ArgumentsHost๋ original ์์ฒญ ํธ๋ค๋ฌ (์์ธ๊ฐ ๋ฐ์ํ ๊ณณ)์ ์ ๋ฌ๋ ์ธ์๋ฅผ ๊ฐ์ธ๋ ๋ํผ์
๋๋ค. ์ฌ๊ธฐ์๋ ์์ฉ ํ๋ก๊ทธ๋จ ๋ฐ ์ฌ์ฉ์ค์ธ ํ๋ซํผ์ ์ ํ์ ๋ฐ๋ผ ํน์ ์ธ์ ๋ฐฐ์ด์ด ํฌํจ๋ฉ๋๋ค. ๋ค์์ ArgumentsHost์ ๋ชจ์ต์
๋๋ค :
export interface ArgumentsHost {
getArgs<T extends Array<any> = any[]>(): T;
getArgByIndex<T = any>(index: number): T;
switchToRpc(): RpcArgumentsHost;
switchToHttp(): HttpArgumentsHost;
switchToWs(): WsArgumentsHost;
}ArgumentsHost๋ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ์์ ๊ธฐ๋ณธ ๋ฐฐ์ด์์ ์ฌ๋ฐ๋ฅธ ์ธ์๋ฅผ ์ ํํ๋ ๋ฐ ๋์์ด ๋๋ ํธ๋ฆฌํ ๋ฉ์๋ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์ ๋งํด, ArgumentsHost๋ ์ธ์ ๋ฐฐ์ด์ ์ง๋์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, HTTP ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ ๋ด์์ ํํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ArgumentsHost์ [request, response]๋ฐฐ์ด์ด ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ ์ปจํ
์คํธ๊ฐ ์น ์์ผ ์ ํ๋ฆฌ์ผ์ด์
์ธ ๊ฒฝ์ฐ ํด๋น ์ปจํ
์คํธ์ ์ ํฉํ [client, data]๋ฐฐ์ด์ด ํฌํจ๋ฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ ์ catch()๋ฉ์๋์์ ์๋ ํธ๋ค๋ฌ๋ก ์ ๋ฌ๋๋ ์ธ์์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
Binding filters
์๋ก์ด HttpExceptionFilter๋ฅผ CatsController์ create()๋ฉ์๋์ ๋ฌถ์ด ๋ด
์๋ค.
@@filename(cats.controller)
@Post()
@UseFilters(new HttpExceptionFilter())
async create(@Body() createCatDto: CreateCatDto) {
throw new ForbiddenException();
}
@@switch
@Post()
@UseFilters(new HttpExceptionFilter())
@Bind(Body())
async create(createCatDto) {
throw new ForbiddenException();
}info ํํธ
@UseFilters()๋ฐ์ฝ๋ ์ดํฐ๋@nestjs/commonํจํค์ง์์ ๊ฐ์ ธ์ต๋๋ค.
์ฐ๋ฆฌ๋@UseFilters()๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. @Catch()๋ฐ์ฝ๋ ์ดํฐ์ ์ ์ฌํ๊ฒ ๋จ์ผ ํํฐ ์ธ์คํด์ค ๋๋ ์ผํ๋ก ๊ตฌ๋ถ๋ ํํฐ ์ธ์คํด์ค ๋ชฉ๋ก์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ HttpExceptionFilter์ธ์คํด์ค๋ฅผ ์์ฑํ์ต๋๋ค. ๋๋ ์ธ์คํด์ค ๋์ ํด๋์ค๋ฅผ ์ ๋ฌํ์ฌ ํ๋ ์ ์ํฌ์ ์ธ์คํด์คํ์ ๋ํ ์ฑ
์์ ๋จ๊ธฐ๊ณ ์ข
์ ์ฃผ์
์ ํ์ฑํ ํ ์ ์์ต๋๋ค.
@@filename(cats.controller)
@Post()
@UseFilters(HttpExceptionFilter)
async create(@Body() createCatDto: CreateCatDto) {
throw new ForbiddenException();
}
@@switch
@Post()
@UseFilters(HttpExceptionFilter)
@Bind(Body())
async create(createCatDto) {
throw new ForbiddenException();
}info ํํธ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ธ์คํด์ค ๋์ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ํํฐ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Nest๊ฐ ์ ์ฒด ๋ชจ๋์์ ๋์ผํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ค์ด ๋ญ๋๋ค.
์์ ์์์ HttpExceptionFilter๋ ๋จ์ผ create()๋ผ์ฐํธ ํธ๋ค๋ฌ์๋ง ์ ์ฉ๋์ด ๋ฉ์๋ ๋ฒ์๊ฐ ๋ฉ๋๋ค. ์์ธ ํํฐ๋ ๋ฉ์๋ ๋ฒ์, ์ปจํธ๋กค๋ฌ ๋ฒ์ ๋๋ ์ ์ญ ๋ฒ์์ ๋ค๋ฅธ ์์ค์ผ๋ก ๋ฒ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํํฐ๋ฅผ ์ปจํธ๋กค๋ฌ ๋ฒ์๋ก ์ค์ ํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
@@filename(cats.controller)
@UseFilters(new HttpExceptionFilter())
export class CatsController {}์ด ๊ตฌ์กฐ๋ CatsController ์์ ์ ์๋ ๋ชจ๋ ๊ฒฝ๋ก ํธ๋ค๋ฌ์ ๋ํด HttpExceptionFilter๋ฅผ ์ค์ ํฉ๋๋ค.
์ ์ญ ๋ฒ์ ํํฐ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
@@filename(main)
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter());
await app.listen(3000);
}
bootstrap();warning ๊ฒฝ๊ณ
useGlobalFilters ()๋ฉ์๋๋ ๊ฒ์ดํธ์จ์ด ๋๋ ํ์ด๋ธ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ํํฐ๋ฅผ ์ค์ ํ์ง ์์ต๋๋ค.
์ ์ญ ๋ฒ์ ํํฐ๋ ๋ชจ๋ ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ ๊ฒฝ๋ก ์ฒ๋ฆฌ๊ธฐ์ ๋ํด ์ ์ฒด ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์์กด์ฑ ์ฃผ์
์ ๊ด์ ์์, ๋ชจ๋ ์ธ๋ถ์์ ๋ฑ๋ก ๋ ์ ์ญ ํํฐ (์์ ์์์์ ๊ฐ์ดuseGlobalFilters()๋ก)๋ ๋ชจ๋์ ์ปจํ
์คํธ ์ธ๋ถ์์ ์ํ๋๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ ์ฃผ์
ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋ชจ๋์์ ์ง์ ์ ์ญ ํํฐ๋ฅผ ๋ฑ๋ก ํ ์ ์์ต๋๋ค.
@@filename(app.module)
import { Module } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
@Module({
providers: [
{
provide: APP_FILTER,
useClass: HttpExceptionFilter,
},
],
})
export class AppModule {}info ํํธ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ํํฐ์ ๋ํ ์์กด์ฑ ์ฃผ์ ์ ์ํํ ๋ ์ด ๊ตฌ์ฑ์ด ์ฌ์ฉ๋๋ ๋ชจ๋์ ๊ด๊ณ์์ด ํํฐ๋ ์ค์ ๋ก ์ ์ญ์ ์ ๋๋ค. ์ด๋์์ ํด์ผ ํฉ๋๊น? ํํฐ (์ ์์์
HttpExceptionFilter)๊ฐ ์ ์ ๋ ๋ชจ๋์ ์ ํํ์ญ์์ค. ๋ํ ์ปค์คํ ํ๋ก ๋ฐ์ด๋ ๋ฑ๋ก์ ๋ค๋ฃจ๋ ์ ์ผํ ๋ฐฉ๋ฒ์useClass๊ฐ ์๋๋๋ค. ์ฌ๊ธฐ์ ๋ํด ์์ธํ ์์๋ณด์ญ์์ค.
์ด ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ํ์ํ๋งํผ ํํฐ๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๋ค. ๊ฐ๋จํ ๊ณต๊ธ์ ๋ฐฐ์ด์ ๊ฐ๊ฐ์ ์ถ๊ฐํ์ญ์์ค.
Catch everything
์ฒ๋ฆฌ๋์ง ์์ ์์ธ (์์ธ ์ ํ์ ๊ด๊ณ์์ด)๋ฅผ ๋ชจ๋ ์ก์ผ๋ ค๋ฉด @Catch()๋ฐ์ฝ๋ ์ดํฐ์ ๋งค๊ฐ ๋ณ์ ๋ชฉ๋ก์ ๋น์ ๋์ญ์์ค (์: @Catch()).
import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus } from '@nestjs/common';
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
catch(exception: unknown, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const request = ctx.getRequest();
const status =
exception instanceof HttpException
? exception.getStatus()
: HttpStatus.INTERNAL_SERVER_ERROR;
response.status(status).json({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}์์ ์์์ ํํฐ๋ ์ ํ (ํด๋์ค)์ ๊ด๊ณ์์ด ๋ฐ์ ๋ ๊ฐ ์์ธ๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
Inheritance
์ผ๋ฐ์ ์ผ๋ก ์์ฉ ํ๋ก๊ทธ๋จ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋๋ก ์ ์๋ ์์ ํ ์ฌ์ฉ์ ์ง์ ๋ ์์ธ ํํฐ๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ ๋ด์ฅ๋ ๊ธฐ๋ณธ ์ ์ญ ์์ธ ํํฐ๋ฅผ ๋จ์ํ ํ์ฅํ๊ณ ํน์ ์์ธ์ ๋ฐ๋ผ ๋์์ ์ฌ ์ ์ํ๋ ค๋ ๊ฒฝ์ฐ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ ์ ์์ต๋๋ค.
์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ ํํฐ์ ์์ํ๋ ค๋ฉด BaseExceptionFilter๋ฅผ ํ์ฅํ๊ณ ์์ ๋ catch()๋ฉ์๋๋ฅผ ํธ์ถํด์ผํฉ๋๋ค.
@@filename(all-exceptions.filter)
import { Catch, ArgumentsHost } from '@nestjs/common';
import { BaseExceptionFilter } from '@nestjs/core';
@Catch()
export class AllExceptionsFilter extends BaseExceptionFilter {
catch(exception: unknown, host: ArgumentsHost) {
super.catch(exception, host);
}
}
@@switch
import { Catch } from '@nestjs/common';
import { BaseExceptionFilter } from '@nestjs/core';
@Catch()
export class AllExceptionsFilter extends BaseExceptionFilter {
catch(exception, host) {
super.catch(exception, host);
}
}warning ๊ฒฝ๊ณ
BaseExceptionFilter๋ฅผ ํ์ฅํ๋ ๋ฉ์๋ ๋ฒ์ ๋ฐ ์ปจํธ๋กค๋ฌ ๋ฒ์ ํํฐ๋new๋ก ์ธ์คํด์คํํ๋ฉด ์๋ฉ๋๋ค. ๋์ ํ๋ ์ ์ํฌ์์ ์๋์ผ๋ก ์ธ์คํด์คํํ์ญ์์ค.
์์ ๊ตฌํ์ ์ ๊ทผ ๋ฐฉ์์ ๋ณด์ฌ์ฃผ๋ ์์ผ๋ฟ์ ๋๋ค. ํ์ฅ ์์ธ ํํฐ ๊ตฌํ์๋ ๋ง์ถคํ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ (์: ๋ค์ํ ์กฐ๊ฑด ์ฒ๋ฆฌ)๊ฐ ํฌํจ๋ฉ๋๋ค.
์ ์ญ ํํฐ ๋ ๊ธฐ๋ณธ ํํฐ๋ฅผ ํ์ฅ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ก ์ํ ํ ์ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ปค์คํ
๊ธ๋ก๋ฒ ํํฐ๋ฅผ ์ธ์คํด์คํ ํ ๋ HttpServer ์ฐธ์กฐ๋ฅผ ์ฝ์
ํ๋ ๊ฒ์
๋๋ค.
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const { httpAdapter } = app.get(HttpAdapterHost);
app.useGlobalFilters(new AllExceptionsFilter(httpAdapter));
await app.listen(3000);
}
bootstrap();๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ์ ํ์๋ APP_FILTERํ ํฐ์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
Last updated
Was this helpful?