Passport认证后跳转路由时req.user为undefined的排查求助
Passport.js认证后req.user为undefined的解决方案
核心缺失:用户序列化/反序列化配置
Passport的passport.session()中间件依赖serializeUser和deserializeUser方法管理session中的用户信息,没有这两个配置,session无法正确存储和读取用户数据,直接导致跳转后req.user为undefined。
添加以下配置(通常放在Passport策略定义之后):
// 将用户ID序列化到session passport.serializeUser((user, done) => { done(null, user.id); }); // 从session中取出ID,查询完整用户信息并挂载到req.user passport.deserializeUser(async (id, done) => { try { // 替换为你的用户模型查询逻辑,比如从数据库获取用户 const user = await User.findById(id); done(null, user); } catch (err) { done(err); } });
其他排查点
- 确保session及时保存
在req.logIn的回调中手动触发session保存,避免异步操作导致session未持久化:
req.logIn(user, (error: Error) => { if (error) { return next('Error Auth'); } req.session.save((saveErr) => { if (saveErr) return next(saveErr); return next(); }); });
- 检查Redis连接状态
你的session存储使用了RedisStore,如果Redis连接失败,session无法持久化,跳转后会丢失用户信息。添加连接错误监听排查:
redisClient.on('error', (err) => { console.error('Redis连接异常:', err); });
- 确认路由挂载顺序
确保/home路由是在app.use(passport.session())之后定义的,中间件按顺序执行,路由定义在中间件之前的话,req.user不会被填充。
内容的提问来源于stack exchange,提问作者Napoleon Bonaparte
相关产品推荐
相关产品推荐

