유동

[Express] 비동기함수에 반복되는 try-catch 없애기 본문

node.js/ExpressJS

[Express] 비동기함수에 반복되는 try-catch 없애기

동 선 2024. 1. 5. 15:20

 

express 라우트 핸들러에서 아래와같이 error를 던지면

우리가 미리 global error handler를 정의해놨다면 middleware 안에서 에러를 던지면 자동으로 저기로 쏙 들어가서 에러 핸들러에서 정의해놓은 내용에 따라 에러를 클라이언트에 전달해준다.

하지만 비동기함수 내에서 error를 던진다면 어떻게될까?

Error: 비동기함수 안에서 error 던집니다잇
    at /Users/yoodongseon/Desktop/티스토리/index.ts:10:9
    at Generator.next (<anonymous>)
    at /Users/yoodongseon/Desktop/티스토리/index.ts:8:71
    at new Promise (<anonymous>)
    at __awaiter (/Users/yoodongseon/Desktop/티스토리/index.ts:4:12)
    at /Users/yoodongseon/Desktop/티스토리/index.ts:9:53
    at Layer.handle [as handle_request] (/Users/yoodongseon/Desktop/티스토리/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/yoodongseon/Desktop/티스토리/node_modules/express/lib/router/route.js:144:13)
    at Route.dispatch (/Users/yoodongseon/Desktop/티스토리/node_modules/express/lib/router/route.js:114:3)
    at Layer.handle [as handle_request] (/Users/yoodongseon/Desktop/티스토리/node_modules/express/lib/router/layer.js:95:5)

서버가 픽하고 죽어버린다

이유는?

모든 비동기 함수는(async 함수) return 키워드를 붙여주든 말든 Promise객체로 감싸서 리턴을 시켜주는데,
위와같이 async함수 내부에서 error를 던진다면, 혹은 에러가 던져진다면(예상치못한) Promise이렇게 던져준다

만약 promise로 감싼 값을 던진다면 express에서 에러 핸들러로 던져주지를 않는다.

해결법


우리가 try-catch 문으로 감싸줘서 catch에서 받은 error를 next의 매개변수로 수동으로 넘겨줘야한다.

하지만 node로 백엔드 개발을 하다보면 거의 모든 로직이 비동기로 이루어진다.

모든 비동기 함수에 try-catch를 감싸주면 굉장히 거슬리고 불편해진다. 일단 block-scope이기 때문에 변수 선언도 생각해줘야할게 많고 그냥 귀찮다.

저의 옛날 프로젝트에 가보시면 모든 비동기함수에 try-catch 반복됩니다...
흑흑

async함수를 감싸주는 asyncWrap함수를 만들어봅시다

try-catch가 불필요하게 반복되는 코드를 줄이고자 async함수를 wrapping하는 함수를 만들었읍니다

Promise형태로 사용하고싶다면 다음과 같이 사용하면 된다

이 wrapping함수를 미리 정의해놓고 try-catch가 필요한 비동기함수에 사용해주면 된다

이로써 비동기함수 내에서 불필요하게 반복되는 try-catch문을 줄여줄 수 있다

(실제 적용한 코드)(https://github.com/DongSeonYoo/express-prisma-template/blob/main/src/routes/test.routes.ts)