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

Passport.js中successRedirect传递用户名作为路由参数报错如何解决

问题原因

  1. 你第一次修改后的代码仅调用passport.authenticate生成了认证中间件,但没有手动传入req、res、next执行该中间件,请求没有后续处理逻辑,所以页面一直处于加载状态。
  2. req.user是Passport完成身份校验、执行登录逻辑后才会挂载到请求对象上的属性,你在给passport.authenticate传配置参数时,配置对象的计算发生在认证流程启动前,此时req.user还未生成,所以读取username会报错。
  3. 直接给successRedirect赋值的方式只能传入静态路径,不支持动态从请求中获取参数拼接路径。

正确实现方案

使用Passport的自定义认证回调,手动处理登录逻辑和重定向即可:

router.post("/login", checkNotAuthenticated, (req, res, next) => {
  // 自定义认证回调
  passport.authenticate("local", (err, user, info) => {
    // 处理认证报错
    if (err) return next(err);
    // 认证失败跳回登录页
    if (!user) {
      req.flash('error', info.message); // 如需携带flash错误信息可保留该行
      return res.redirect("/login");
    }
    // 手动执行用户登录操作,执行完成后req.user才会被挂载
    req.logIn(user, (err) => {
      if (err) return next(err);
      // 动态拼接重定向路径
      return res.redirect(`/dashboard/${user.username}`);
    });
  })(req, res, next); // 必须手动传入请求、响应、next函数执行认证逻辑
});

你原有的dashboard路由不需要修改,保持原有逻辑即可正常工作。

内容的提问来源于stack exchange,提问作者Jake Jackson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:45:02