Next.js集成Authjs v5:服务端无法获取用户信息及响应问题
问题:Auth.js v5 API路由实现中的两个问题
我按照Auth.js v5官方指南中「Authenticating Server-Side」的API Route部分实现路由,代码如下:
import { auth } from "../../../auth" import { NextApiRequest, NextApiResponse } from "next" import { NextResponse } from 'next/server'; export async function GET(req: NextApiRequest, res: NextApiResponse) { try { const session = await auth(req, res) if (session) { console.log(session.user) return NextResponse.json({status: "OK"}) } } catch (error) { console.error(error) } console.log("No session") return NextResponse.json({status: "ERR"}) }
遇到两个问题:
- 登录状态下调用
auth()后,session存在但session.user为空,无法获取用户信息 - 使用
NextApiResponse的res.json()或res.status()时,触发错误:TypeError: res.status is not a function
问题1:session.user为空的解决方法
- 检查Auth.js配置文件(
auth.ts/auth.js)的callbacks配置,确保jwt和session回调正确同步用户信息:callbacks: { async jwt({ token, user }) { // 登录时将用户信息存入token if (user) { token.id = user.id; token.name = user.name; token.email = user.email; } return token; }, async session({ session, token }) { // 将token中的用户信息同步到session.user if (session.user) { session.user.id = token.id; session.user.name = token.name; session.user.email = token.email; } return session; } } - 确认登录提供商的权限范围(scope)包含
email、profile等必要字段,确保能获取到用户基础信息 - 清除浏览器缓存和现有会话,重新登录测试
问题2:res.status is not a function的解决方法
你的代码混用了Next.js两种API路由模式:NextApiRequest/NextApiResponse属于Pages Router,NextResponse属于App Router,二者不能混用,需二选一:
方案1:Pages Router模式
移除NextResponse导入,直接使用res对象返回响应:
import { auth } from "../../../auth" import { NextApiRequest, NextApiResponse } from "next" export async function GET(req: NextApiRequest, res: NextApiResponse) { try { const session = await auth(req, res) if (session) { console.log(session.user) return res.status(200).json({status: "OK"}) } } catch (error) { console.error(error) } console.log("No session") return res.status(401).json({status: "ERR"}) }
方案2:App Router模式
改用App Router的Request类型,无需NextApiRequest/NextApiResponse:
import { auth } from "../../../auth" import { NextResponse } from 'next/server'; export async function GET(req: Request) { try { const session = await auth() if (session) { console.log(session.user) return NextResponse.json({status: "OK"}) } } catch (error) { console.error(error) } console.log("No session") return NextResponse.json({status: "ERR"}, {status: 401}) }
内容的提问来源于stack exchange,提问作者David Knell
相关产品推荐
相关产品推荐

