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

