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

使用Passport.js登录成功后无法传递用户数据至Handlebars页面求解决方案

解决Passport.js登录后无法传递用户数据到仪表盘的问题

我来帮你排查下代码里的问题,你的实现里有几个关键细节没处理对,导致用户数据传不到index.handlebars页面:

问题分析

  • 拼写错误:你写的succesRedirect少了一个's',正确的应该是successRedirect,这个拼写错误会导致重定向逻辑失效。
  • 回调函数无效:当使用passport.authenticate的successRedirect选项时,Passport会直接完成重定向操作,后面的(req, res)回调函数根本不会被执行,所以你写的res.render代码等于白写。
  • 用户数据获取方式错误:登录成功后,Passport会把验证通过的用户对象挂载到req.user上,而不是从req.body.username获取——而且重定向到GET请求后,req.body本身就不存在了。

修正后的代码实现

1. 修正POST登录路由

先把拼写错误改过来,并且去掉多余的回调函数:

app.post("/login", passport.authenticate('local', { 
  successRedirect: "/", 
  failureRedirect: "/user/login" 
}));

2. 在GET首页路由传递用户数据

登录成功后,Passport会通过会话保持用户信息,所以在GET /的路由里,直接从req.user取用户数据传递给模板:

app.get("/", (req, res) => {
  // 把用户对象传递给handlebars模板,未登录时req.user为undefined
  res.render('index', { 
    currentUser: req.user
  });
});

3. 确保Passport会话配置正确

还要确认你的Passport已经正确启用了会话支持,序列化/反序列化函数正常工作:

// 会话配置(确保放在Passport初始化之前)
app.use(session({
  secret: 'your-custom-secret-key', // 替换成你的密钥
  resave: false,
  saveUninitialized: false
}));

// Passport初始化
app.use(passport.initialize());
app.use(passport.session());

// 用户序列化/反序列化
passport.serializeUser((user, done) => {
  done(null, user.id); // 将用户ID存入会话
});

passport.deserializeUser((id, done) => {
  // 根据ID从数据库查询用户信息,这里替换成你的实际查询逻辑
  User.findById(id, (err, user) => {
    done(err, user);
  });
});

模板中使用用户数据

在index.handlebars里,就可以直接调用传递的用户数据了:

{{#if currentUser}}
  <div class="welcome">欢迎回来,{{currentUser.username}}!</div>
{{else}}
  <p>请先<a href="/user/login">登录</a></p>
{{/if}}

这样修改后,登录成功重定向到首页时,就能正确显示用户数据了。

内容的提问来源于stack exchange,提问作者Abhishek Konnur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:33:19