초짜일 때 express vs koa2 과거 의문 사항.

반응형

express 와 async await 그리고 error 처리

<== 이글 참조 (의문 사항에 대한 충분한 답을 적은 글.)

 

 

https://www.reddit.com/r/node/comments/8imb7q/from_express_to_koa/

express vs koa2 관련하여 질문 드립니다.


=================================

https://www.reddit.com/r/node/comments/8imb7q/from_express_to_koa/

=================================

아래에서 express 도 async 자체는 동작을 하지만 가장 마지막 middleware 단에서 하나 사용하는 정도로 사용되는 것 같습니다. 

koa2 같은 경우는 middleware 자체가 코루틴을 반영하여 설계되었기 때문에 (next 함수가 promise) 각 미들웨어 간의 연결 관계가 async 방식입니다. 그래서 express 는 순차적으로 수행되는 반면 koa2 같은 경우는 미들웨어의 동작 순서가 마치 스택 처럼 거꾸로 입니다. 

하지만 각 미들웨어 상에서 try catch 로 감싸줄 수 있고 try 안에 await next() 를 해주는 방식으로 그 아래에 await 하는 식으로 코드를 작성하게 되면 해당 오류가 throw 되었을 시에 그것을 전체적으로 catch 할 수 있게 됩니다. 하지만 express 의 미들웨어에서 try catch 를 할 경우 이런 오류 처리가 불가능 해보입니다.

혹시 express 로 이러한 문제를 해결하여 사용하고 계신지 문의드립니다. express 가 워낙 유명하다 보니 참고 문서도 많고 사용도 널리 되고 있어 express 를 사용하고 싶지만 아래의 try catch 구문을 사용하지 못한다면 큰 문제 같아보입니다. 이 부분이 해결되지 않는 것이라면 express 의 경우 마지막 미들웨어 (즉, router 의 res 응답 로직이 존재하는 함수 부분) 에만 async 를 적용하여 try catch 를 그 안에서만 하고 계신지 그래서 catch 되는 것은 전역적인 로깅함수 같은 것으로 처리하시는지요?

=================================

[express]

app.use("/api", PostRouter.routes());

export class PostRouter {

  static routes(): Router {
    return Router()
      .get("/post", async (request: Request, response: Response) => {
        const posts = await Post.find({}).populate("author").exec();
        response.json(posts)
      });
  }

}



=================================

[koa2]

router.get('/api/v1/auth/intro', requireAuth, async (ctx, next) => {

  try {
    await next();
    const users = await dao.getUser(ctx.state.user_id);
    if (!users.length) {
      ResponseUtil.status(200).body({message: 'no_user', data: ''}).build().send(ctx);
      return;
    }
  } catch (err) {
    throw err;
  }
  
});

 

 

 

반응형

댓글

Designed by JB FACTORY