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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:45:15