저장을 습관화

에러 기록 - [object Object] 본문

공부/node.js

에러 기록 - [object Object]

ctrs 2023. 8. 8. 19:54

- 증상

node.js와 sequelize로

회원가입 API를 만들고 있던 중

전달인자 email, password, confirm을 받아

password와 confirm이 일치하는지 검사하는 부분이 있었음

// ...
createUser = async (email, password, confirm) => {
// ...
if (!confirm || password !== confirm) {
      throw new Error({
        errorMessage:
          '패스워드가 일치하지 않습니다. 패스워드 재입력은 confirm 입니다.',
      });
    }
// ...
}

 

에러를 발생시키기 위해 email과 password만 보냈더니

{
	"email":"test@gmail.com",
    "password":"1234"
}
"errorMessage": "[object Object]"

원하던 에러 메세지 '패스워드가 일치하지 않습니다.....' 가 아닌

[object Object]가 나옴

 

이는 객체를 문자열로 변환하지 않고 그대로 출력하려할 때 발생하는 에러라고 함

예시)

const obj = { key: 'value' };
console.log(obj); // [object Object]

 

- 원인

3계층 아키텍처 도입전 routes에서 로직을 전부 처리할때 사용하던 방법을

그대로 복사해서 services에서 넣고

return res.status().json 부분만 throw new Error로 고쳐썼기에 발생한 일

// 3계층 아키텍처 도입 전, routes에서 쓰던 방식
try{}
catch(error){
return res.status(403).json({
      errorMessage:
        "패스워드가 일치하지 않습니다. 패스워드 재입력은 confirm 입니다.",    });    }
        

// 3계층 아키텍쳐 도입 후, service에 작성했던 문장
if (!confirm || password !== confirm) {
      throw new Error({
        errorMessage:
          '패스워드가 일치하지 않습니다. 패스워드 재입력은 confirm 입니다.',
      });
    }

 

 

- 해결

로직 흐름 사이사이에 console.log("1"), console.log("2"), console.log("3")...을 넣고 로그가 남지 않는 지점을 찾고,

'errorMessage:'와 중괄호를 제거 

// before

if (!confirm || password !== confirm) {
      throw new Error({
        errorMessage:
          '패스워드가 일치하지 않습니다. 패스워드 재입력은 confirm 입니다.',
      });
    }
    
    
// after
if (!confirm || password !== confirm) {
      throw new Error(
        '패스워드가 일치하지 않습니다. 패스워드 재입력은 confirm 입니다.'
      );
    }