ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2022_10_07
    TIL WIL 2022. 10. 7. 14:44

    GET 게시글 전체목록조회

    내가 쓴 코드

    /** 배포환경 확인
     *GET 게시글목록 전체조회 
     *제목, 이름, 작성날짜
     *작성날짜 내림차순 정렬
     */
    
    router.get("/", async (req, res) => {
      const posts = await Posts.find()
      .select({
          "postsName" : 1, "postsTitle" :1, "createdAt" : 1, 
           })
        .sort({"createdAt" : "desc"})
        
        res.status(203).json({list : posts});
        
      });

     

    좋은 예시로서의 코드

    // 모든 게시글 데이터를 반환하는 함수
    router.get("/", async (req, res) => {
      try {
        let posts = await Post.find().sort({ createdAt: -1 });
        let resultList = [];
    
        for (const post of posts) {
          resultList.push({
            postId: post._id,
            user: post.user,
            title: post.title,
            createdAt: post.createdAt,
          });
        }
    
        res.status(200).json({ data: resultList });
      } catch (error) {
        const message = `${req.method} ${req.originalUrl} : ${error.message}`;
        console.log(message);
        res.status(400).json({ message });
      }
    });

    익숙하지 않은 mongoose의 쿼리 구문을 쓰기 위해 애썼던 한 주였지만,

    사후적으로 제공받은 예시가 훨씬 훌륭하다.

     

    비교점 1.예외처리

    내 경우, try catch를 이용한 예외처리를 기를 쓰고 해보려 했지만 결국 반영하지 못했다.

    돌이켜보면 나는 이런 짓들을 하려고 애썼었다.

     

    - if else 구문처럼 try catch를 쓰려고 삽질을 함 (예컨대 비밀번호 일치 불일치)
    -catch 구문을 '에러를 적당히 콘솔에 찍어주고 실행스택을 파괴시키지 않는 것' 정도로 이해함
    -그로인해 catch 안에서 다른 코드를 쓸 생각을 하지 못함. 예컨대 response.status(400).
    -또 그로인해 response가 나가는 분기를 제대로 잡지 못하고, 2개 이상의 response가 반환되도록 함.

     

    비교점 2. 예쁘게 담아서 정렬

    내 경우, mongoose와 mongoDB 공식문서를 뒤져가며 익숙하지 않은 쿼리 메서드를 쓰려고 노력했었다.

    데이터베이스 스키마에서 받아온 모델로부터 바로 find()를 돌려 주렁주렁 메서드를 달았다. 

    이후 바로 response를 보내버렸다.

     

    하지만 예시의 방식이 익숙하면서도 더욱 깔끔하다.

    정렬한 후 차곡차곡 for문을 돌려 배열에 수납해버렸다.

    무엇보다 한번 수납절차를 거치면서, 전달될 변수의 이름을 새롭게 부여했다.

     


    GET 게시글 상세조회

    내가 쓴 코드 ("아이디":"$_id", "_id":0 <--- 이 부분은 사후적으로 이리저리 실험한 흔적)

    /** 배포환경 확인
      *  GET 게시글 상세조회
      *  제목, 이름, 글내용, 날짜
      */
    router.get('/:postsId', async (req,res)=> { 
      const {postsId} = req.params;
      // const postsId = req.params.postsId 
      // 위와 같다. //걍 구조분해 할당으로 해본 것.
      
      const detail = await Posts.find({postsId:postsId}).select({
        "아이디":"$_id", "_id":0, "postsTitle":1, "postsName":1, "postsContent":1, "createdAt":1
      })
      
      res.status(203).json({detailPage:detail})
      })

     

    좋은 예시로서의 코드

    //게시글 상세 조회
    router.get("/:_postId", async (req, res) => {
      try {
        const _id = req.params._postId;
    
        if (!_id) { // TODO: Joi를 사용하지 않음
          res.status(400).json({ message: '데이터 형식이 올바르지 않습니다.' });
          return;
        }
    
        const post = await Post.findOne({ _id });
    
        const result = {
          postId: post._id,
          user: post.user,
          title: post.title,
          content: post.content,
          createdAt: post.createdAt,
        };
    
        res.status(200).json({ data: result });
      } catch (error) {
        const message = `${req.method} ${req.originalUrl} : ${error.message}`;
        console.log(message);
        res.status(400).json({ message });
      }
    });

    마찬가지로 두가지 큰 비교점이 있다.

    - try 문 안에서 for문을 쓰면서 따로 내용을 정렬한것. 

    - 그리고 catch문이 에러처리.

     

    또 try문 안에 if문으로 validation 기능을 포함시킨 것.

    나도 참 저걸 하고 싶었는데, 왜 기능을 하지 않았을까.

     

    왜겠어, 예외처리를 제대로 못했으니까.

     


    질의사항

     

    catch (error) {
        const message = `${req.method} ${req.originalUrl} : ${error.message}`;
        console.log(message);
        res.status(400).json({ message });
      }

     

    catch 문 에러핸들링에서 저 템플릿 리터럴은 무슨 뜻인가?

    request 안에 method, originalUrl이 어떻게 담겨있으며, error.message는 어디에서 먼저 정의되어 있는가?

    에러 로그의 형태에 대해 따로 알아보아야 할 듯.

    'TIL WIL' 카테고리의 다른 글

    2022_10_09  (0) 2022.10.09
    2022_10_07  (0) 2022.10.07
    2022_09_25  (1) 2022.09.25
    2022_09_23  (1) 2022.09.23
    항해99 9기 1주차 미니 프로젝트_3 (2022_09_23)  (1) 2022.09.23
Designed by Tistory.