You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:18:27