공부/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 입니다.'
);
}