使用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
相关产品推荐
相关产品推荐

