【问题标题】:How do I use Firebase to handle automatic server-side calculations?如何使用 Firebase 处理自动服务器端计算?
【发布时间】:2017-03-11 08:01:42
【问题描述】:

也许我的问题应该重新表述为:如何将这些行为重构为 CRUD,而这正是 Firebase 擅长的?

我知道 CRUD 运行良好。我还看到了 Firebase 声明式安全模型如何让我确保适当的安全服务器端,它应该存在。

假设我有订阅服务。每次有人注册服务时,他们都需要自动将“到期”行项目添加到他们的帐户中。简单来说:

/users/john
/services/goodstuff

所以john 可以注册goodstuff,我可能会让他在 30 天内不付费,但会在 30 天结束时提醒他,“嘿,你需要付费,否则你会失去订阅货。”

使用服务器后端,我将POST/services/goodstuff/members,例如,让POST 处理程序的一部分向john 的帐户添加一个“你欠”行项目,确保没有人可以加入goodstuff而不被标记为欠款。

在不存在这些服务器端逻辑的 Firebase BaaS 应用中,我将如何重构应用以获得相同的有效行为?

【问题讨论】:

    标签: firebase


    【解决方案1】:

    更新(2017 年 3 月 10 日)虽然我在下面概述的架构仍然有效并且可用于将 Firebase 与任何现有基础架构结合使用,但 Firebase 刚刚发布了Cloud Functions for Firebase,它允许您在 Google 的服务器上运行 JavaScript 函数以响应 Firebase 事件(例如数据库更改、用户登录等等)。

    一种可能的解决方案(未经测试,抱歉;但这应该是正确的想法):

    {
      "rules": {
        "users": {
          "$user": {
            /* When they create their user record, they must write a 'due' that's
             * within the next 30 days. */
            ".write": "!data.exists() && newData.child('due').isNumber() && newData.child('due').val() < now + (30*24*60*60*1000)"
          }
        },
        "services":
          "$service": {
            /* Must be authenticated and due date must not be passed. */
            ".read": "auth != null && now < root.child('users/' + auth.id + '/due).val()" 
          }
        }
      }
    }
    

    这要求当有人第一次登录并初始化他们的用户/条目时,他们必须在接下来的 30 天内写下截止日期。然后在访问任何服务时,将验证该截止日期尚未过去。

    也就是说,另一种选择是启动一个小型后端服务来处理这种业务逻辑。 Firebase 擅长保护、存储和同步数据。但是,如果您有复杂的业务逻辑,您可能需要考虑启动一个小型后端流程。 Firebase 有 REST api 以及 Node.JSJVM 客户端,因此运行您自己的与 Firebase 集成的后端代码非常容易。

    【讨论】:

    • 哦,那很优雅。不是让服务器计算应该添加什么并添加它,而是说,“让客户端计算它,但强制它只能有一个答案。”这真的很优雅,我喜欢它。
    • 就我个人而言,我不会将数字30*24*60*60*1000 放在安全规则中,而是将其抽象为通过root 检索的数据的一部分,但这真的很好。
    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-09-30
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多