Next.js+next-auth/react下PrismaClient浏览器运行报错排查
问题:Next.js服务端使用PrismaClient仍报错“无法在浏览器运行”
我正在构建一个Next.js应用,使用next-auth/react包实现认证功能。编写了一个服务端函数,通过PrismaClient根据用户邮箱获取当前用户信息,但运行时遇到错误:PrismaClient is unable to be run in the browser。
已验证prismadb配置正确、数据库连接正常,代码运行在服务端,且相关包版本兼容,但仍出现该报错,想了解是否遗漏了配置细节,寻求解决建议。
相关代码
import { getSession, useSession } from "next-auth/react"; import prisma from '@/app/libs/prismadb'; const getCurrentUser = async () => { try { const session = await getSession(); if (!session?.user?.email) { return null; } const currentUser = await prisma.user.findUnique({ where: { email: session.user.email as string } }); console.log("Current User is found:", currentUser); if (!currentUser) { return null; } return currentUser; } catch (error) { console.log(error); return null; } } export default getCurrentUser;
已执行的排查步骤
- 确认prismadb配置正确,数据库连接已建立
- 确认代码通过服务端函数执行
- 检查Prisma、Next.js等包版本兼容性
解决建议
- 检查函数调用场景:确保
getCurrentUser仅在服务端组件、API路由或Server Actions中调用,禁止在客户端组件(标记'use client')中直接导入执行,否则Prisma会被打包到客户端环境。 - 替换
getSession为服务端认证方法:在Next.js App Router的服务端环境中,应使用next-auth/next提供的auth()方法替代getSession(),避免客户端环境的执行触发:import { auth } from "next-auth/next"; // ... const session = await auth(); - 校验Prismadb实例创建逻辑:确保
prismadb.ts采用服务端安全的单例模式创建,避免重复实例及客户端加载:import { PrismaClient } from '@prisma/client' const prisma = global.prisma || new PrismaClient() if (process.env.NODE_ENV !== 'production') global.prisma = prisma export default prisma - 确认组件渲染环境:若调用
getCurrentUser的组件为客户端组件,需将用户信息获取逻辑迁移到服务端组件,或通过Server Actions封装调用。 - 检查路由配置:确保API路由或服务端组件的配置未被错误标记为客户端代码,避免服务端逻辑被客户端打包工具处理。
内容的提问来源于stack exchange,提问作者Sami Ali
相关产品推荐
相关产品推荐

