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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:33:30