Error message에 객체 타입 전달하기
Error 타입
interface ErrorConstructor {
new(message?: string, options?: ErrorOptions): Error;
(message?: string, options?: ErrorOptions): Error;
}
JS에서 Error의 생성자는 string 타입의 message를 파라미터로 받는다.
그래서 기본적으로 다음과 같이 사용해볼 수 있다.
throw new Error('Something went wrong')
그런데 zod라는 schema validation 라이브러리를 쓰다가 Error message에 간접적으로 객체를 전달할 수 있는 방법을 알게 되었다.
zod에서 validation에 실패하면 ZodError를 throw 한다.
try {
mySchema.parse(query) // throw new ZodError()
} catch (error) {
console.log(error.message)
}
/*
[
{
"received": "register2",
"code": "invalid_enum_value",
"options": [
"login",
"register"
],
"path": [],
"message": "Invalid enum value. Expected 'login' | 'register', received 'register2'"
}
]
*/
error.message를 로그로 보니 object 타입으로 보인다. 사실 로그로 보는 이 message는 string이다. message를 인자로 줄 때, JSON.stringify()
를 이용하여 객체를 string으로 바꿔 전달하면 Error을 받을 때 string타입이지만 객체 모습으로 message를 받을 수 있다.
throw new Error(
JSON.stringify({
message: 'Bad request',
code: 400,
})
)
// 이런 식으로 throw하고
const errorObj = JSON.parse(error.message)
// 이런 식으로 접근해서 사용한다.