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

Express集成Passport登录报错TypeError: this._verify is not a function

错误根因

  1. 错误栈显示运行时调用的是node_modules/passport-local下的默认Strategy,你编写的自定义Strategy未被实际引入使用,相关调试逻辑不生效
  2. Strategy实例缺少_verify、_usernameField等核心属性,说明构造函数未正确初始化,大概率是User.createStrategy()返回值不是合法函数
  3. 登录路由内存在非法调用: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:18:02