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

MongoDB保存用户信息后,passport.authenticate()始终执行failureRedirect问题

问题分析与解决办法

你遇到的核心问题有两个:

  1. passport.authenticate参数语法错误:你写的跳转选项没包裹在对象大括号里,导致语法不规范。
  2. 字段不匹配导致验证失败: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:25:42