0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【NestJS × Docker】BigIntのシリアライズエラー、大目に見てくれよ - Do not know how to serialize a BigInt -

Last updated at Posted at 2025-02-23

僕は2025年の4月からエンジニアになる学生です。
最近は趣味でNestJSを書いています。

以下が簡単なプロフィールです。

  • サッカー好き
    • 国内サッカー:柏レイソルサポーター
    • 海外サッカー:プレミアリーグ、セリエA (Roma推し)
  • マンガ、アニメも好き
    • ジャンプ定期購読者
    • 来世はロシア語を話したい
    • 最近はガンダムにどハマり中
  • 大学は東洋大学文系
    • 恥ずかしい
  • エナドリ中毒
    • 最近は4日に1本で我慢
  • NestJSのロゴと色が好き
  • 雀魂で雀士2に上がった

開発環境

今現在はDockerで以下のコンテナを作成

  • バックエンド(NestJS)のコンテナ
  • フロントエンド(NextJS)のコンテナ
  • データベース(postgreSQL)のコンテナ
  • データベースをGUIで閲覧・管理できるpgadminコンテナ

docker-compose.ymlの記述は面倒なので省きます。以下の記事に少し載せているのでぜひ確認してみてください。
[Nestjs × Docker] prisma ORM で migration するときに躓いた話

ORMはPrisma ORMを使用しています。

API作成

まずは特に何も考えずに関数を作成してみます

async listUpAllTodos(){
    try {
        const todos = await this.prisma.todo.findMany();
        return todos;
    }
    catch(error) {
        console.error('Error fetching todos:', error);
        throw error;
    }
}

とりあえず、todosテーブルにあるデータをすべて取得する関数です。
エラーハンドリングの無意味さ、命名などは見逃してください。

さてこのままリクエストを送信すると、エラー500、Internal server error が出力されます。
最初は本当に意味が分かりませんでした。

ログを吐き出してみると、このように書いてありました。

Do not know how to serialize a BigInt

自分はidなどのカラムをbigInt型で指定していました。
どうやら標準のJSONパーサーがBigIntに対応していないためらしいです。

※JSONパーサーとは
ただの文字列をオブジェクトとして扱う際に変換してくれるプログラムのこと

なんて面倒なんだ。そのままJSONで吐き出してくれよ。
文句言っても仕方がないので、自分は以下のクラスを作成してみました。

export class SerializeBigInt {
    public static serialize(input: Object): Object {
        return JSON.parse(JSON.stringify(input, this.replacer));
    }

    private static replacer(key: string, value: any): any {
        if (typeof value === 'bigint') {
            return value.toString();
        }
        return value;
    }
}

パースする処理はさまざまな箇所で重複しそうなのでクラスにしています。
これをリターン時に呼び出します

async listUpAllTodos(){
    try {
        const todos = await this.prisma.todo.findMany();

        //以下が追加箇所
        return SerializeBigInt.serialize(todos);
    }
    catch(error) {
        console.error('Error fetching todos:', error);
        throw error;
    }
}

終わり

実はこれ、chatGPTのo3-mini-highモデルに助けてもらいました。
これ、めちゃめちゃ良い。
技術書買ったり、動画見たりよりも遥かに効率よく学習を進められていると感じます。
インフラなどのすぐには必要にならない領域の知識を学ぶ面白さも十分にわかるので、技術書は欲しいし、好きです。

でも、今自分が進めている個人開発しながら勉強する方法には、o3-mini-highモデルはうってつけです。

んー、openAI最高!頼むから買収されないで!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?