💎
PrismaClientInitializationError: Invalid prisma エラーの解決方法について
こんにちは、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つが考えられます。
- PrismaClient のインスタンスを使い回す。
- DB側の
max_connections
(最大接続数)を増加させる。
今回は、PrismaClient
の取り回しの問題だったので、PrismaClient
インスタンスをシングルトンにして、使いまわすことで、コネクションの増加を抑えることにしました。
シングルトンについての説明は、こちら📝
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内容📝
まとめ
冗長に、new PrismaClient()
を実行していたことを反省した内容でした📝
シングルトンパターンで使い回すべきものは、使い回していきたいとも思った次第です💪
Xやってます、フォローよろしくお願いします🙏
Discussion