💎

PrismaClientInitializationError: Invalid prisma エラーの解決方法について

2025/02/11に公開

こんにちは、Webエンジニアのまさぴょんです!
今回は、PrismaClientInitializationError: Invalid prisma エラーの解決方法について解説していきます🐱

エラー内容

Hono ServerとSupabase(PostgreSQL)のORMとしてPrismaを使用していたところ、次のようなエラーが発生しました📝

PrismaClientInitializationError: 
Invalid prisma.xxxxx.findUnique() invocation in  [ファイルPath]

原因

実装したAPIたちの処理の中で、それぞれnew PrismaClient()していたことが原因でした。

// 特定のユーザーをemailで検索する。
userRouter.post("/email/", async (context) => {
    const { DATABASE_URL } = env<{ DATABASE_URL: string }>(context);
      try {
        // PrismaClientの初期化 & DBとのコネクション作成
        const prisma = new PrismaClient({
          datasources: {
            db: {
              url: DATABASE_URL,
            },
          },
        });
・・・省略・・・

解決策📝

解決策としては、次の2つが考えられます。

  1. PrismaClient のインスタンスを使い回す。
  2. DB側のmax_connections(最大接続数)を増加させる。

今回は、PrismaClientの取り回しの問題だったので、PrismaClientインスタンスをシングルトンにして、使いまわすことで、コネクションの増加を抑えることにしました。

シングルトンについての説明は、こちら📝
https://zenn.dev/manase/scraps/6a23d6f45146b3

PrismaClientインスタンスをシングルトンにする📝

import { PrismaClient } from "@prisma/client";

// グローバル空間に型を定義する。
declare global {
  // eslint-disable-next-line no-var
  var prisma: PrismaClient | undefined;
}

// PrismaClient のインスタンスを生成または再利用
export const getPrisma = (): PrismaClient => {
  // グローバル空間にPrismaClientのインスタンスがない場合は、新規生成する。
  if (!global.prisma) {
    global.prisma = new PrismaClient();
  }
  return global.prisma;
};

// シングルトンなGlobal PrismaClient
export const globalPrisma = getPrisma();

呼び出す側は、このようにすればいい。

const user = await globalPrisma.user.findUnique({
      where: { email },
    });

実際にエラーを解決した際のPR内容📝

https://github.com/yukimura-manase/ai-employment-agent/commit/dc718c1a6bf2cbb73b6d894c6b888dfc4b1afd30

まとめ

冗長に、new PrismaClient()を実行していたことを反省した内容でした📝
シングルトンパターンで使い回すべきものは、使い回していきたいとも思った次第です💪

Xやってます、フォローよろしくお願いします🙏
https://twitter.com/masanyon1212

Discussion