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

Node.js下Firebase不同集合用户角色对应不同页面视图的实现问题

实现步骤

  1. 先给两类用户做身份标记
    你可以选择两种方式识别用户身份:
  • 方式一(推荐):注册用户时通过Firebase Admin给用户添加自定义声明
    商家注册时执行:
    // 商家注册成功后,给对应uid加角色标记
    await admin.auth().setCustomUserClaims(restaurantUid, {
      role: 'restaurant'
    })
    
    消费者注册时执行:
    await admin.auth().setCustomUserClaims(customerUid, {
      role: 'customer'
    })
    
    加完之后,验证sessionCookie拿到的decodedClaims里就会自带role字段,可以直接判断。
  • 方式二(兼容存量用户):直接通过uid查询两个集合判断身份
    不需要修改注册逻辑,拿到uid后先查restaurants集合是否存在对应文档,存在就是商家,否则就是消费者。
  1. 编写消费者页面渲染函数
    新增和renderRestaurantPage逻辑类似的消费者渲染方法:
function renderCustomerPage(customerId, res) {
  // 从customers集合查询消费者信息,逻辑和商家查询对齐
  getCustomer(customerId).then(data => {
    // 这里按需加载消费者页面需要的其他数据
    res.render('customer', {
      // 传入消费者页面需要的变量
      customerName: data.name,
      // 其他自定义字段
    })
  })
}
  1. 修改/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')
    });
});
  1. 调整renderRestaurantPage的渲染目标
    把原来renderRestaurantPage里的res.render('index')改成res.render('restaurant'),匹配你要的商家模板。

这样调整后,两类用户登录后跳转到/profile路由时,服务端会自动根据身份渲染对应的hbs模板,同时携带对应用户的数据库数据,不需要修改前端的登录跳转逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:45:05