Express集成Passport登录报错TypeError: this._verify is not a function
错误根因
- 错误栈显示运行时调用的是
node_modules/passport-local下的默认Strategy,你编写的自定义Strategy未被实际引入使用,相关调试逻辑不生效 - Strategy实例缺少
_verify、_usernameField等核心属性,说明构造函数未正确初始化,大概率是User.createStrategy()返回值不是合法函数 - 登录路由内存在非法调用:
passport.authenticate中间件验证通过后会自动执行登录逻辑,手动调用无参数的req.login()会触发额外异常
修复步骤
- 确认LocalStrategy引入路径是否正确,要使用自定义Strategy需替换为你本地的文件路径:
// 替换默认引入 const LocalStrategy = require('./你存放自定义Strategy的文件相对路径')
- 验证
User.createStrategy()返回值类型,确认是合法函数:
// 实例化前添加打印 console.log(typeof User.createStrategy())
如果输出不是function,说明passport-local-mongoose版本不兼容,退回到v6.x稳定版即可,也可以手动编写验证回调替换User.createStrategy():
passport.use(new LocalStrategy({ usernameField: 'email', }, async (email, password, done) => { try { const user = await User.findOne({ email: email }) if (!user) return done(null, false, { message: '用户名不存在' }) const pwdMatch = await user.verifyPassword(password) return pwdMatch ? done(null, user) : done(null, false, { message: '密码错误' }) } catch (err) { return done(err) } }))
- 修正登录路由冗余代码,删除无效的
req.login()和多余的err参数:
router.post('/login', passport.authenticate('local', { failureFlash: 'invalid username or password', failureRedirect: '/login' }), (req, res) => { req.flash('success', 'Welcome Back!') res.redirect('/') })
- 若上述步骤仍未解决问题,清空依赖重新安装,避免依赖文件损坏:
rm -rf node_modules package-lock.json yarn.lock npm install
内容的提问来源于stack exchange,提问作者Josh_Oleary
相关产品推荐
相关产品推荐

