Node.js下Firebase不同集合用户角色对应不同页面视图的实现问题
实现步骤
- 先给两类用户做身份标记
你可以选择两种方式识别用户身份:
- 方式一(推荐):注册用户时通过Firebase Admin给用户添加自定义声明
商家注册时执行:
消费者注册时执行:// 商家注册成功后,给对应uid加角色标记 await admin.auth().setCustomUserClaims(restaurantUid, { role: 'restaurant' })
加完之后,验证sessionCookie拿到的decodedClaims里就会自带role字段,可以直接判断。await admin.auth().setCustomUserClaims(customerUid, { role: 'customer' }) - 方式二(兼容存量用户):直接通过uid查询两个集合判断身份
不需要修改注册逻辑,拿到uid后先查restaurants集合是否存在对应文档,存在就是商家,否则就是消费者。
- 编写消费者页面渲染函数
新增和renderRestaurantPage逻辑类似的消费者渲染方法:
function renderCustomerPage(customerId, res) { // 从customers集合查询消费者信息,逻辑和商家查询对齐 getCustomer(customerId).then(data => { // 这里按需加载消费者页面需要的其他数据 res.render('customer', { // 传入消费者页面需要的变量 customerName: data.name, // 其他自定义字段 }) }) }
- 修改/profile路由的判断逻辑
把原来直接调用renderRestaurantPage的逻辑改成按角色分发:
app.get("/profile", function (req, res) { const sessionCookie = req.cookies.session || ""; admin .auth() .verifySessionCookie(sessionCookie, true) .then((decodedClaims) => { const uid = decodedClaims.user_id // 用方式一的自定义声明判断 const role = decodedClaims.role if (role === 'restaurant') { // 注意原来这里你渲染的是index,要改成你的商家模板restaurant renderRestaurantPage(uid, res) } else if (role === 'customer') { renderCustomerPage(uid, res) } else { // 无角色标记的异常处理,比如跳回登录页 res.redirect('/login') } // 要是用方式二判断的话,替换成下面的逻辑就行 /* getRestaurant(uid).then(restaurantData => { if (restaurantData) { renderRestaurantPage(uid, res) } else { renderCustomerPage(uid, res) } }) */ }) .catch((error) => { console.log(error) // 验证失败跳回登录页 res.redirect('/login') }); });
- 调整renderRestaurantPage的渲染目标
把原来renderRestaurantPage里的res.render('index')改成res.render('restaurant'),匹配你要的商家模板。
这样调整后,两类用户登录后跳转到/profile路由时,服务端会自动根据身份渲染对应的hbs模板,同时携带对应用户的数据库数据,不需要修改前端的登录跳转逻辑。
内容的提问来源于stack exchange,提问作者Shaheryar Ajmal
相关产品推荐
相关产品推荐

