문제 발생
게시글 및 댓글에 좋아요를 누르면 그 데이터를 저장하는 테이블,
post_likes와 comment_likes의 primary key의 데이터 타입을
BigInt로 설정했었다.
(게시글과 댓글 수) * (좋아요 누르는 사용자 수)를 곱한 만큼의 데이터가 쌓일 테니 Int로는 부족하지 않을까 하는 이유였다.
그런데 그렇게 하고 보니 에러가 발생했다.
error: do not know how to serialize a bigint
문제 원인 - BigInt의 특성
검색해보니, BigInt는 숫자가 너무 커서 데이터를 저장 및 처리할 때 숫자로 처리하지 않고 stringify 해서 처리한다고 한다. 그래서 따로 Number 타입을 따로 stringify 해주는 작업이 필요하다.
BigInt values represent numeric values which are too large
to be represented by the number primitive.
예시:
const previouslyMaxSafeInteger = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// 9007199254740991n
문제 원인 - JSON.stringify()의 특성
문제는 JSON.stringify()는 BigInt의 처리에 대한 부분을 지원해주지 않기 때문에 JSON으로 데이터를 넘겨줄 때 에러가 생겼던 것이다.
Use within JSON
Using JSON.stringify() with any BigInt value will raise a TypeError,
as BigInt values aren't serialized in JSON by default.
해결 방법
toString() 메소드를 이용해서 BigInt의 toJSON() 메소드를 수동으로 만들어서 이용하면 된다.
BigInt.prototype.toJSON = function () {
return this.toString();
};
이 코드를 app.js에 추가해주거나, utils 폴더에 파일을 만들어 넣어놓고 app.js에서 import해주면, 이제 JSON.stringify()를 통해 데이터를 JSON 형태로 넘겨줄 때 정상 작동하는 것을 볼 수 있다.
다만, stringified 되었으므로 비즈니스 로직에서 필요에 따라 다시 Number 타입으로 바꿔주는 작업이 추가적으로 필요하다.