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

