使用passport-magic-login遇TypeError: user.get is not a function错误求助
解决TypeError: user.get is not a function(passport-magic-login + passport-local-mongoose)
问题根源
passport-local-mongoose内部逻辑依赖Mongoose文档实例的get()方法读取用户字段,但你的代码中传递给passport的user对象不是标准的Mongoose Document实例(比如是普通JS对象、lean()查询返回的无方法对象),导致调用user.get()时触发错误。
解决方案
1. 确保verify回调返回Mongoose文档实例
在passport-magic-login的verify回调中,查询或创建用户时禁止使用lean()方法(该方法会剥离Mongoose实例方法,返回纯JS对象),直接返回模型查询/创建的原生结果:
const MagicLoginStrategy = require('passport-magic-login').Strategy; passport.use(new MagicLoginStrategy({ secret: process.env.MAGIC_LOGIN_SECRET, callbackUrl: '/auth/magic/callback', sendMagicLink: async (destination, href) => { // 邮件发送逻辑 }, verify: async (payload, callback) => { // 查找用户:直接返回Mongoose文档 let user = await User.findOne({ email: payload.email }); if (!user) { // 创建用户:create方法返回的是Mongoose文档实例 user = await User.create({ email: payload.email }); } // 直接传递用户文档给callback callback(null, user); } }));
2. 检查User模型的正确配置
确保你的User模型正确集成passport-local-mongoose,且是通过mongoose.model()创建的合法模型:
const mongoose = require('mongoose'); const passportLocalMongoose = require('passport-local-mongoose'); const UserSchema = new mongoose.Schema({ email: { type: String, required: true, unique: true } }); // 必须在Schema上调用plugin,指定用户名字段为email(适配邮箱验证场景) UserSchema.plugin(passportLocalMongoose, { usernameField: 'email' }); // 生成并导出Mongoose模型 const User = mongoose.model('User', UserSchema); module.exports = User;
3. 禁止手动构造普通用户对象
不要在verify回调中手动创建纯JS对象作为user返回,例如:
// 错误示例:返回的是普通对象,无Mongoose的get()方法 callback(null, { id: '123', email: payload.email });
必须返回通过User.create()或User.findOne()获取的Mongoose文档实例。
4. 排查序列化/反序列化逻辑
检查passport的序列化/反序列化代码,确保没有将用户对象转换为普通JS对象:
// 正确的序列化/反序列化示例 passport.serializeUser((user, done) => { done(null, user.id); }); passport.deserializeUser(async (id, done) => { const user = await User.findById(id); done(null, user); // 必须返回Mongoose文档实例 });
内容的提问来源于stack exchange,提问作者Ritesh
相关产品推荐
相关产品推荐

