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

NextAuth登录时从MongoDB获取_id赋值给会话用户报错

问题:NextAuth会话中无法获取MongoDB用户_id,报错"_id is undefined"

使用NextAuth结合Google与MongoDB实现博客注册登录功能,未登录状态下可通过Google注册并在MongoDB中创建用户(数据库中可见包含_id、email等字段的用户记录),但登录后尝试将MongoDB中的_id赋值给会话用户时失败,报错提示_id is undefined,出错代码行:session.user.id = sessionUser._id.toString();

解决方案

  • 在session回调中初始化数据库连接:原代码的session回调未调用connectToDB(),导致MongoDB连接未建立,User.findOne()无法查询到用户,返回null,进而访问sessionUser._id时报错。
  • 添加空值校验逻辑:即使数据库连接正常,也要处理查询结果为null的情况,避免直接访问属性引发错误。
  • 确认User模型的_id字段映射:确保Mongoose的User Schema正确处理_id字段(默认Mongoose会自动生成_id,无需手动定义,但如果自定义Schema,需保证该字段存在或允许自动生成)。

修正后的完整代码

import NextAuth from 'next-auth';
import GoogleProvider from 'next-auth/providers/google';

import User from '@models/user';
import { connectToDB } from '@utils/database';

const handler = NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    })
  ],
  callbacks: {
    async session({ session }) {
      try {
        // 先连接数据库
        await connectToDB();
        // 查询数据库中的用户
        const sessionUser = await User.findOne({ email: session.user.email });
        
        // 校验sessionUser是否存在
        if (sessionUser) {
          session.user.id = sessionUser._id.toString();
        }
        
        return session;
      } catch (error) {
        console.error('Session callback error:', error);
        return session;
      }
    },
    async signIn({ account, profile, user, credentials }) {
      try {
        await connectToDB();

        // 检查用户是否已存在
        const userExists = await User.findOne({ email: profile.email });

        // 不存在则创建新用户
        if (!userExists) {
          await User.create({
            email: profile.email,
            username: profile.name.replace(" ", "").toLowerCase(),
            image: profile.picture,
          });
        }

        return true;
      } catch (error) {
        console.log("Error checking if user exists: ", error.message);
        return false;
      }
    },
  }
})

export { handler as GET, handler as POST }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:33:15