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

Passport.js如何区分卖家与买家的req.user以用于EJS模板

解决方案

1. 统一登录后的会话用户结构

不管是卖家还是买家登录,查询到数据库中的实体后,组装成统一格式的用户对象存入session,同时添加角色标识区分类型:

// 卖家登录示例
sellerModel.findOne({ email: req.body.email }, (err, seller) => {
  if (err) throw err;
  // 密码验证通过后
  req.session.user = {
    id: seller._id,
    name: seller.shopName, // 替换为卖家表中的名称字段
    role: 'seller', // 角色标识
    // 按需添加其他公共字段(如邮箱)
  };
  req.session.save();
  res.redirect('/');
});

// 买家登录示例
buyerModel.findOne({ email: req.body.email }, (err, buyer) => {
  if (err) throw err;
  // 密码验证通过后
  req.session.user = {
    id: buyer._id,
    name: buyer.fullName, // 替换为买家表中的名称字段
    role: 'buyer', // 角色标识
    // 按需添加其他公共字段
  };
  req.session.save();
  res.redirect('/');
});

2. 编写全局中间件挂载req.user及EJS全局变量

在路由注册前添加这个中间件,自动将会话中的用户挂载到req.user,同时存入res.locals让所有EJS模板直接访问:

app.use((req, res, next) => {
  // 挂载req.user
  req.user = req.session.user || null;
  // 全局传入EJS模板
  res.locals.user = req.user;
  next();
});

3. EJS模板中直接使用

无需在每个路由的render方法中单独传用户数据,直接在模板里判断登录状态和角色:

<% if (user) { %>
  <div>欢迎您,<%= user.name %></div>
  <% if (user.role === 'seller') { %>
    <a href="/seller/dashboard">卖家管理后台</a>
  <% } else { %>
    <a href="/buyer/cart">我的购物车</a>
  <% } %>
<% } else { %>
  <a href="/login">登录</a>
  <a href="/register">注册</a>
<% } %>

4. 路由中获取完整实体数据(可选)

如果需要在特定路由中获取卖家/买家的完整数据库信息,可通过req.user的role和id去对应表查询:

app.get('/seller/dashboard', (req, res) => {
  // 校验登录状态及角色
  if (!req.user || req.user.role !== 'seller') {
    return res.redirect('/login');
  }
  // 查询完整卖家数据
  sellerModel.findById(req.user.id, (err, seller) => {
    if (err) throw err;
    res.render('seller/dashboard', { seller });
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:10:30