使用Express框架的passport.js时如何获取已登录用户的ID信息?
问题解决方法
passport.js 登录验证成功后,会将反序列化后的用户数据默认挂载到 req.user 对象上,你遇到的报错本质是获取_id时,其所属的父对象为undefined导致的,可按以下步骤排查修复:
- 修正
_id的取值来源:你代码第10行应该是直接取了未定义的_id变量,正确的取值路径为req.user._id,如果你的passport序列化逻辑存储的是id而非_id,则改为req.user.id。 - 检查passport序列化、反序列化逻辑是否配置正确,参考示例如下:
// 序列化:登录成功时将用户唯一标识存入session passport.serializeUser((user, done) => { done(null, user._id); }); // 反序列化:每次请求时根据session存储的标识查询用户,挂载到req.user passport.deserializeUser(async (id, done) => { try { const user = await User.findById(id); done(null, user); } catch (err) { done(err); } });
- 确认中间件注册顺序正确:你自定义的登录状态检测中间件必须注册在
passport.session()之后,否则req.user还未被passport挂载,会导致取值为undefined,参考注册顺序:
// 先注册session、passport相关中间件 app.use(session({ // 你的session配置项 secret: "your_secret_key", resave: false, saveUninitialized: false })); app.use(passport.initialize()); app.use(passport.session()); // 再注册自定义的登录状态检测中间件 app.use((req, res, next) => { res.locals.user = req.user || null; next(); });
- 增加取值前的非空判断,避免异常报错:
if (req.user) { const targetUser = await User.findById(req.user._id); // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者thitbachi
相关产品推荐
相关产品推荐

