開発環境で PrismaClient を単一インスタンスにする

ツイート
2021年08月26日
2021年08月27日

ドキュメント

エラー

NextAuthを開発環境で使用していると、下記のエラーが発生し、クラッシュしてしまうことが多かった。

jsx
FATAL: sorry, too many clients already ... too many connections

解決策

開発環境で、単一の PrismaClient インスタンスを使用すること

実装

@/lib/server/prismaClient.tsに作成しています。

jsx
import { PrismaClient } from '@prisma/client' // 型定義 declare global { var prisma: PrismaClient | undefined } export const prisma = global.prisma || new PrismaClient({ log: ['query', 'info'], // 👈 ログ出力。消してOK! }) if (process.env.NODE_ENV !== 'production') global.prisma = prisma

globalは、おそらくNode.jsのグローバルオブジェクト

Global objects | Node.js v16.8.0 Documentation

読み込み

[...nextauth].ts

jsx
import NextAuth from 'next-auth' import Providers from 'next-auth/providers' import { PrismaAdapter } from '@next-auth/prisma-adapter' import { prisma } from '@/lib/server/prismaClient' export default NextAuth({ providers: [ Providers.Google({ clientId: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, }), ], adapter: PrismaAdapter(prisma), callbacks: { session: async (session, user) => { return Promise.resolve({ ...session, user: { ...session.user, id: user.id } }) } } })

API Routes

jsx
import { prisma } from '@/lib/server/prismaClient' await prisma.user.findUnique({...})

getServerSideProps

jsx
const { prisma } = require('@/lib/server/prismaClient') await prisma.user.findUnique({...})