TIL Layered architecture 구현

ESH'S VELOG·2023년 7월 14일
0

기존에 진행했던 회원가입, 게시판, 게시글의 댓글을 작성할 수 있는 서버를 만드는 API를 3 Layered Architecture방식으로 작성하려고 한다.

원래는 하나하나 짜면서 문제점을 발생시켜야하는데 나는 모두 짜놓고 문제점을 이제서야 발생시켰다.

모든 로직을 구현해놓고 node app.js를 실행시킨 결과 router에서부터 에러가 나기 시작했다.

<< 에러내용 >>

E:\Node\node_lv3\node_modules\express\lib\router\route.js:211
        throw new Error(msg);
        ^

Error: Route.post() requires a callback function but got a [object Undefined]
    at Route.<computed> [as post] (E:\Node\node_lv3\node_modules\express\lib\router\route.js:211:15)
    at proto.<computed> [as post] (E:\Node\node_lv3\node_modules\express\lib\router\index.js:521:19)
    at Object.<anonymous> (E:\Node\node_lv3\routes\posts.route.js:12:8)
    at Module._compile (node:internal/modules/cjs/loader:1254:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
    at Module.load (node:internal/modules/cjs/loader:1117:32)
    at Module._load (node:internal/modules/cjs/loader:958:12)
    at Module.require (node:internal/modules/cjs/loader:1141:19)
    at require (node:internal/modules/cjs/helpers:110:18)
    at Object.<anonymous> (E:\Node\node_lv3\routes\index.js:3:21)

에러가 표시하는 부분은 posts.route.js 12번째 줄 부분

// 게시글 작성
router.post(
  '/',
  isAuth.validateToken,
  defaultValidate.createPost,
  postController.createPosts
);

게시글 작성 부분이다.
1) 일단 오타부분이 없는지 확인한다.
=> 대부분 선언하면서 선언된 부분을 더블클릭하여 복붙하였기 때문에 없어보인다
2) Route.put() 은 콜백함수를 요구하는데 object가 undefined로 받아진다 라고 한다
=> 나는 12번째줄이 문제가 있다는줄 알았는데 보니까 route.put부분이 문제가 되는 것 같다.
put을 쓰는 것은 게시글과 좋아요부분

일단 like가 의심스러우니 like부터 본다
controller 부분

likePost = async (req, res, next) => {
    try {
      const { id } = req.params;
      const foundUser = req.user;
      await this.postsService.likePost(id, foundUser);
      res.status(200).json({ message: '좋아요 추가' });
    } catch (error) {
      console.error(error);
      res.status(400).json({ errorMessage: '좋아요 추가 중 오류 발생' });
    }
  };

service 부분

  // 게시글 좋아요
  likePost = async (postId, userId) => {
    return await this.postsRepository.like(postId, userId);
  };

엥? 잠깐 service에서는 postId로 받는데 controller에서는 id로 받는다.
postId로 통일 시켜주기로 하자.
수정 후 실행시켜주었더니 이번엔 다른 에러가 발생한다
Route.post()가 undefinde로 받아진댄다 ㅡㅡ

너무나 많은 에러가 발생하여 혹시 middleware쪽 부분이 아닐까 해서 middleware부분은 아예 지우고 controller만 넣어서 실행해봤다.
그럤더니 실행이 되는걸 확인했고 middleware쪽이 문제라는 것을 알았다.
middleware가 두개니까 isAuth와 defaultValidate를 확인해보면 될 것 같다.

에러 해결
이유는 클래스를 선언하고 인스턴스를 만들지 않은게 문제였다.
isAuth에서 class를 설정해놓고 각 controller에서 인스턴스를 만들지 않고 클래스를 그대로 가져다 접근하려니 안되는 것이였음
해결 코드

const isAuth = require('../middlewares/auth-middleware');
const isauth = new isAuth();
// 게시글 작성
router.post('/', isauth.verify, postController.createPost);
profile
Backend Developer - Typescript, Javascript 를 공부합니다.

0개의 댓글