Passport.js中successRedirect传递用户名作为路由参数报错如何解决
问题原因
- 你第一次修改后的代码仅调用
passport.authenticate生成了认证中间件,但没有手动传入req、res、next执行该中间件,请求没有后续处理逻辑,所以页面一直处于加载状态。 req.user是Passport完成身份校验、执行登录逻辑后才会挂载到请求对象上的属性,你在给passport.authenticate传配置参数时,配置对象的计算发生在认证流程启动前,此时req.user还未生成,所以读取username会报错。- 直接给
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
相关产品推荐
相关产品推荐

