본문 바로가기

개인공부 기록/node.js

[Error] TypeError: Cannot convert undefined or null to object 해결하기(Feat. 게시글 업데이트)

기술스택 추가(22.08.27)

JavaScript, Node.js , Express 기반하였고 Layered Pattern을 적용하여 작업하는 상황이였습니다.

-------------------------------------------------------------------------------------

게시글 업데이트 API를 작성하던중 제목과 같은 에러에 마주하였다.

원래 의도는 게시글이 존재하는지 확인하고, 게시글이 존재하는경우 업데이트를 진행하고 게시글이 없는경우(undefined인 경우) 에러를 던져 에러 메세지를 출력하는게 계획이였다.

 

게시글 확인 코드

SELECT * FROM posts WHERE EXISTS
(SELECT no.posts , title.posts FROM posts
WHERE posts.no = ${no});

위 코드를 실행하면 posts테이블의 no값에 해당하는 컬럼명과, 컬럼 값을 뽑아낼 수 있다. 없는경우 Empty set 이라는 문구가 나온다. console을 찍어보면 값이 있는경우는 게시물 번호를, Empty set인경우 undefined가 출력된다.

콘솔은 console.log(Number(Object.values(checkPostDao[0])[0])) 를 찍으시면 되는데 Dao부분 본인 파일이름으로 수정하시면 됩니다. 

컬럼 전체정보 뽑기

물론, True면 1을 False면 0을 반환하는 간단한하지만 정석적인 코드가 당연히 존재한다.

SELECT EXISTS
(SELECT no.posts , title.posts FROM posts
WHERE posts.no = ${no});

T/F로 게시글 유무 판별하기

그래서 일반적으로 게시글이 있으면 True, 없으면 False로 참거짓을 판단해 게시글 업데이트를 진행하는데 왠지모르겠지만 게시글이 있는 경우(게시글 번호를 반환)와 undefined를 반환하는 경우 이렇게 해서 업데이트를 진행하고 싶어졌다.(굉장히 비효율적인 발상이다 내 5시간..)

 

0과 1을 반환하는 코드의 경우 다음과 같은 방식으로 검증이 진행됩니다.(예시코드입니다.) 

const checkPostDao = await checkDao.checkPost(no)
let a = Number(Object.values(checkPostDao[0])[0])

if( a !== 1 ) {
 const err = new Error('POSTING_IS_NOT_EXISTED');
    err.status
    Code = 400;
    throw err;
 }

먼저 Dao(Data access object)에 값을 보내 T/F를 받아와서 객체에 넣고 Number형태로 변환하여(0 또는 1) if문을 통해 검증한뒤 에러를 던지는 방식입니다. undefined를 반환하는 값도 if문 안에 조건만 수정해주면 그냥 될줄 알았습니다. 그런데 안되더라고요..

 

위와 같은 방식으로 undefined를 처리하려고 하면 TypeError: Cannot convert undefined or null to object 에러가 발생하는데 구글링을 해본 결과 Object에 들어올 기대값이 있는데 undefined 또는 null 값이 들어와서 발생하는 Type 에러라고 결론을 내렸다. 

 

그래서 처음에 적은 것처럼 직관적으로 Dao가 T면 업데이트를하고 F면 에러를 던지기로 했다. 아이디어가 있지만 지식이 짧은 관계로 멘토님의 도움을 받아 아래와 같이 에러를 던지는 코드를 작성하였다.

const postUpdate = async ( no, title, post ) => {
  if (await checkDao.checkPost(no) == false) throw new Error('POSTING_IS_NOT_EXISTED')
  }

음..? 생각보다는 코드가 간결하다.(최소 6~7줄 나올줄알았다) 내가 생각한 것이 구현이 가능하고 생각보다 코드가 간결해서 기분은 좋았다. 하지만 오늘 게시글의 주제였던 게시글 업데이트시 참인경우 게시글번호를 반환 거짓인경우 undefined를 반환하는 코드는 사용을 지양하고 위에 작성한 0과 1을 반환하는 코드를 사용하도록 하자. 0과 1을 반환하는 코드를 사용하게 효율적이고 정석적인 방법이라고 알려주셨다.

Recent Posts
Popular Posts
Recent Comments