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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:02