오늘 뭐했냐/끄적끄적

23.07.01 LV2 과제 중

스스로에게 2023. 7. 1. 23:18

 LV1과제를 마치고 LV2 과제가 시작되었다. 요구 조건에 에러처리가 더 세분화되어서 전체 try catch문만 사용한다고 해결되진 않기에 문제가 많았었다.

 

//! 게시물 못 찾을 때 에러(24자리 고정) 
    const posts = await Posts.findById({ _id: _postId }).exec()

 게시글을 찾지 못한 경우에 대한 처리를 해야하는데 findById에서 맞는 값이 없다면 _id가 문자열이 아니기에 타입이 다르다고 서버가 꺼지는 문제가 발생했다. 이에 대하여 여러 시도를 해봤다.

  • 저 부분을 중첩 try catch로 처리 하자. 일단 해결은 되었다 하지만 보기에 불편하고 이렇게 처리하면 당장은 쉬울지 몰라도 계속된 에러 처리에서 실수가 발생하기 쉽다. 그래서 다른 방법을 찾아본다.
  • try 를 빼고 catch로만 처리해보자
    ⇒ Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 발생
    이는 응답이 두 번 전달되면 발생하는 문제라고 한다.  res가 전달된 이후에도 서버가 멈추진 않았지만 오히려 밑에 코드들이 실행되어 res가 두 번 전달된다.
  • ind 혹은 findOne으로 변경 ⇒ 같은 결과가 나와서 서버가 멈춘다.
  • DB에 저장될 때 생성되는 _id이기에 다시 살펴보니 자릿수가 고정인 것 같다 그래서 같은 길이에 다른 주소로 들어가니 null값을 반환하며 서버가 멈추거나 에러가 생기지 않는다. 그렇게 방법을 찾아내 이후 조건문으로 에러 처리를 하였다.
    //! acknowledged 정상적 처리 확인 
    if (updateComment.acknowledged) {
      return res.status(200).json({ message: "댓글을 수정하였습니다" });

 과제의 요구 조건 중에서 업데이트가 정상적으로 되지 않은 경우를 처리하란 조건이 있었다. 어디를 처리할지는 알겠는데 어떻게 해야하냐가 문제였다. try catch로 처리할 수 있지만 그렇게하면 위와 같은 이유로 다른 방법을 찾았다. 그래서 변수에 담아서 어떻게 나오는지 콘솔로 찍어보고  acknowledged 프로퍼티를 알게되었다. 이를 활용해서 조건문으로 에러처리를 할 수 있었다. 

const { nickname } = res.locals.user;
if (comments.nickname !== nickname) {

 댓글을 수정하거나 삭제시에 권한이 있는지 판단해서 이것도 에러처리를 해야하는데 어떻게 할까 고민을 하다가 혹시 로그인을 하면서 발급한 jwt 토큰에 기존에 하나의 값만을 보냈는데 여러개를 담아봤는데 문제가 없었기에 이것도 마찬가지로 토큰을 통해서 처리했다. 

 

이렇게 일단 해결은 했는데 그마나 같이 페어하는 분이 키워드나 힌트를 줘서 해결할 수 있었다. 그리고 모르면 그냥 다 콘솔 찍는 것 밖에 없다. 

'오늘 뭐했냐 > 끄적끄적' 카테고리의 다른 글

23.07.10 Lv4 완료  (0) 2023.07.11
23.07.02 LV2 API 테스트  (0) 2023.07.02
23.06.29 주특기 2주차 강의 보는 중  (0) 2023.06.30
23. 06.27 LV1 과제 완료  (0) 2023.06.27
23. 06.26 입문주차 과제 중  (0) 2023.06.26