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

使用NextJS、Prisma、NextAuth时GET请求返回500错误排查

问题:NextAuth + Prisma 获取用户信息时出现500内部服务器错误

我用Prisma、NextJS和NextAuth实现认证功能,写了一个API路由用来在用户登录后获取信息,方便在首页显示姓名和用户名。

API路由代码(pages/api/auth/getUser.ts)

import prisma from '../../../lib/prisma'
import { NextApiRequest, NextApiResponse } from 'next'
import { unstable_getServerSession } from "next-auth/next";

export default async function handler(
    res: NextApiResponse,
    req: NextApiRequest
) {
    const session = await unstable_getServerSession(res, req);
    const email = session.user?.email
    const user = await prisma.user.findUnique({
        where: {
            email,
        },
    })
    res.status(200).json(user)
}

首页获取用户的函数

async function getUser() {
    const response = await fetch('/api/auth/getUser', {
        method: 'GET',
        headers: {
            'Content-Type': 'application/json',
        },
    })
    const data = await response.json()
    setUser(data)
    console.log(data)
}
getUser()

页面加载时浏览器控制台报错:

Failed to load resource: the server responded with a status of 500 (Internal Server Error)

没有更多报错信息,想排查代码里的低级错误。


问题排查与修复

1. API路由参数顺序错误

你的API路由handler函数参数顺序搞反了!Next.js的API路由要求第一个参数是req,第二个是res,你写反成res在前,req在后,这会导致unstable_getServerSession无法正确获取请求对象,直接触发500错误。

2. 缺少NextAuth配置传入

unstable_getServerSession(建议改用稳定版getServerSession)需要传入NextAuth的配置项authOptions,否则无法正确验证会话,这也是常见的500错误诱因。

修正后的API路由代码:

import prisma from '../../../lib/prisma'
import { NextApiRequest, NextApiResponse } from 'next'
// 建议使用稳定版getServerSession
import { getServerSession } from "next-auth/next";
// 导入同目录下的NextAuth配置
import { authOptions } from "./[...nextauth]";

export default async function handler(
    req: NextApiRequest, // 修正顺序:先req后res
    res: NextApiResponse
) {
    const session = await getServerSession(req, res, authOptions);
    
    // 增加会话校验,避免后续代码报错
    if (!session || !session.user?.email) {
        return res.status(401).json({ error: '未授权' });
    }

    const email = session.user.email
    const user = await prisma.user.findUnique({
        where: {
            email,
        },
    })
    res.status(200).json(user)
}

3. 前端请求的冗余优化

GET请求不需要设置Content-Type: application/json,可以移除该Header,同时增加错误处理避免前端崩溃:

async function getUser() {
    const response = await fetch('/api/auth/getUser')
    if (!response.ok) {
        console.error('获取用户信息失败', response.status)
        return
    }
    const data = await response.json()
    setUser(data)
    console.log(data)
}
// 建议在组件挂载时调用,避免重复执行
useEffect(() => {
    getUser()
}, [])

4. 查看服务器端日志

500错误的详细信息不会返回给浏览器,你需要查看Next.js的服务器控制台日志,里面会打印具体错误原因(比如Prisma连接失败、数据库字段不存在等)。


内容的提问来源于stack exchange,提问作者PiWizard3852

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:20:36