본문 바로가기

개발/개발의 ㄱ

[NestJs] Exception Error 처리

반응형

NestJs에서는 exception 에러 class를 제공한다.

https://nestjs-doc.exceptionfound.com/globals.html

 

@nestjs/common

Const longPayload longPayload: object[] = [{_id: '584f17147fce7ca0a8bacfd2',index: 0,guid: '1d127572-0369-45fb-aa2f-e3bb083ac2b2',isActive: true,balance: '$2,926.06',picture: 'http://placehold.it/32x32',age: 26,eyeColor: 'green',name:'Wçêtson Aguilar [s

nestjs-doc.exceptionfound.com

 

// controller

...

constructor(
	private service: TestService
){}

@Get("test")
testGet{
	this.service.throwMethod()
}
...





// test.service.ts

....
export class TestService{
	throwMethod(){
    	throw new InternalServerErrorException("error!!")
    }
}


...

위 구조는 controller에서 try-catch 처리를 하지 않아도 아래 내용이 client에 출력된다.

{"message":"error!!","error":"Internal Server Error","statusCode":500}

 

 

그러나 종종 client 출력이 아닌 throw를 통해 nest서버가 깨지는데, 그 이유는 async 단어 하나 때문이다.

// test.service.ts

....
export class TestService{
	async throwMethod(){
    	throw new InternalServerErrorException("error!!")
    }
}


...

위와 같이 서비스 메소드 앞에 async를 넣으면 try-catch없이는 그냥 throw를 뱉어버린다.

 

 

아래에서 상위 클래스(여기선 testGet)에서 케이스별 코드를 확인할수 있다.

// controller

...

constructor(
	private service: TestService
){}

// async-await
@Get("test")
async testGet{
	await this.service.throwMethod()
}


// Promise
@Get("test")
testGet{
	 return new Promise((resolve, reject) => {
      this.service.throwMethod().catch((err) => reject(err));
    });
}
...





// test.service.ts

....
export class TestService{
	async throwMethod(){
    	throw new InternalServerErrorException("error!!")
    }
}


...

 

 

이상입니다.

 

 

 

*코드가 깨지면 아래를 참조해주세요

https://medium.com/%EB%8F%84%EA%B9%A8%EB%B9%84-%EC%9D%B4%EC%95%BC%EA%B8%B0/nestjs-throw-new-internalservererrorexception-3f40e615779