使用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
相关产品推荐
相关产品推荐

