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

Next.js+MongoDB+auth.js客户端会话ID返回undefined问题求助

解决方案:客户端获取Auth.js会话中的用户ID

1. 检查Auth.js的会话回调配置

Auth.js默认不会自动将MongoDB用户的_id(或自定义id)暴露给客户端会话,你需要在jwt和session回调中手动传递这个字段:

在你的Auth.js配置文件(通常是app/api/auth/[...nextauth]/route.js)中添加以下回调:

export const authOptions = {
  // 其他配置(providers、session策略等)
  session: {
    strategy: "jwt", // 若使用数据库会话策略,需调整逻辑
  },
  callbacks: {
    async jwt({ token, user }) {
      // 登录时将用户ID存入JWT token
      if (user) {
        // 注意:MongoDB默认用`_id`作为主键,若你自定义了`id`字段则替换为`user.id`
        token.id = user._id.toString();
      }
      return token;
    },
    async session({ session, token }) {
      // 将token中的ID传递给客户端会话的user对象
      if (session.user) {
        session.user.id = token.id;
      }
      return session;
    },
  },
};

2. 统一MongoDB用户模型的ID字段(可选)

如果希望用户对象直接返回id而非_id,可以在Mongoose模型中配置JSON转换:

import mongoose from "mongoose";

const UserSchema = new mongoose.Schema({
  name: String,
  email: String,
  image: String,
});

// 将`_id`转换为`id`,并移除不必要的字段
UserSchema.set("toJSON", {
  transform: (doc, ret) => {
    ret.id = ret._id.toString();
    delete ret._id;
    delete ret.__v;
  },
});

export default mongoose.models.User || mongoose.model("User", UserSchema);

这样在authorize回调中返回的用户对象就会直接包含id字段,无需手动转换_id。

3. 正确在客户端获取会话

必须使用Auth.js官方提供的useSession Hook获取会话,不要手动解析Cookie:

"use client";
import { useSession } from "next-auth/react";

export default function UserPage() {
  const { data: session } = useSession();

  if (!session) {
    return <div>请先登录</div>;
  }

  // 此时session.user.id应该能正常获取到
  return (
    <div>
      <p>用户ID: {session.user.id}</p>
      <a href={`/profile/${session.user.id}`}>访问个人主页</a>
    </div>
  );
}

4. 排查缓存与配置生效问题

  • 清除浏览器缓存或使用隐身模式测试,避免旧会话缓存干扰
  • 重启Next.js开发服务器,确保Auth.js的新配置生效
  • 可以在服务器端用getServerSession验证ID是否存在:
    import { getServerSession } from "next-auth/next";
    import { authOptions } from "@/app/api/auth/[...nextauth]/route";
    
    export default async function ServerComponent() {
      const session = await getServerSession(authOptions);
      console.log("服务器端会话ID:", session?.user?.id); // 检查控制台输出
      return <div>服务器端ID: {session?.user?.id}</div>;
    }
    

如果服务器端能获取到ID但客户端不行,说明session回调的配置有误,需重新检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:00:21