MongoDB保存用户信息后,passport.authenticate()始终执行failureRedirect问题
问题分析与解决办法
你遇到的核心问题有两个:
- passport.authenticate参数语法错误:你写的跳转选项没包裹在对象大括号里,导致语法不规范。
- 字段不匹配导致验证失败:passport-local默认会从
req.body读取username和password字段,但你的表单传的是mailbox和passwordbox,authenticate找不到正确验证字段,自然触发失败跳转。
另外原代码的错误分支只打印日志、没处理响应,会导致请求挂起,这点也需要补上。
下面给你两种可行的解决方式:
方式一:修改LocalStrategy配置,适配表单字段
在配置passport-local策略的地方,指定对应表单字段名:
const LocalStrategy = require('passport-local').Strategy; // 配置LocalStrategy,匹配你的表单字段 passport.use(new LocalStrategy({ usernameField: 'mailbox', passwordField: 'passwordbox' }, User.authenticate()));
同时修复post接口里的authenticate语法:
app.post("/register", function(req, res){ const username = req.body.mailbox; User.register({username: username}, req.body.passwordbox, function(err, user){ if(err){ console.log(err); return res.redirect("/register"); // 出错后跳转回注册页 } // 用大括号包裹跳转选项,修正语法 passport.authenticate("local", { successRedirect: "/secrets", failureRedirect: "/register" })(req, res); }); });
方式二:注册成功后直接登录用户(更推荐)
User.register已经完成了用户创建与密码哈希,没必要再走一遍authenticate流程,直接用req.login()登录更简单,还能避免字段匹配问题:
app.post("/register", function(req, res){ const username = req.body.mailbox; User.register({username: username}, req.body.passwordbox, function(err, user){ if(err){ console.log(err); return res.redirect("/register"); } // 直接登录已创建的用户 req.login(user, function(loginErr) { if(loginErr){ console.log(loginErr); return res.redirect("/register"); } return res.redirect("/secrets"); }); }); });
最后要确认你已经正确初始化passport会话支持,比如在app中添加了:
app.use(passport.initialize()); app.use(passport.session());
内容的提问来源于stack exchange,提问作者Bhavya S
相关产品推荐
相关产品推荐

