有没有办法在Firebase中增加计数而不将当前计数暴露给客户端?

时间:2016-08-23 13:44:30

标签: firebase firebase-realtime-database

我想在Firebase中增加一个计数,但不会将当前计数暴露给客户端

我已经阅读了许多有关使用事务来增加Firebase中的计数器的有用答案,但所有这些都假设客户端已经"读取"访问计数器元素。 如果客户端不具有对计数的读取权限,但我想根据用户的操作增加值,该怎么办?

示例:

假设我想跟踪特定内容的观看次数或展示次数(或其他一些用户操作)。这些数据仅供内部人员参与,可能与广告商和合作伙伴私下共享 - 但不会向用户自己显示,我们也不希望通过将其暴露给浏览器来与竞争对手分享这些数据。 / p>

对于这样的情况,我可以通过服务器进程路由事物,服务器进程在其中获取计数并递增计数,但这有点辜负了首先使用Firebase的目的。还有其他任何选项来增加"私人"来自浏览器的计数器?

1 个答案:

答案 0 :(得分:4)

我不确定你为什么会被投票,因为这对我来说似乎是一个有效的问题。

在Firebase中没有增加计数器的服务器端方法。有了这些知识,当前递增计数器的唯一方法是让客户端执行增量。虽然您可以使用规则确保每个用户只能增加一次,每个增量只需一步,而且许多其他内容,客户端应用程序必须能够读取当前值

您的问题的常见解决方案是引入计数服务器。每个客户都可以写它"我已经查看了这个内容"记录到数据库中,然后你有一个服务器来监听这个队列并更新计数。

viewQueue
    $pushId
      uid: <uid>
      itemId: <itemId>
viewCounts
    $itemId: <totalViewCount>

您可以保护这一点,以便用户只能写入视图队列,只有服务器(可能在服务帐户下运行)才能访问视图计数:

{
  "rules": {
    "viewQueue": {
      ".read": false, // only the server can read this
      "$pushid": {
        ".write": "newData.exists() && !data.exists()"
      }
    },
    "viewCounts": {
      // only the server can access this
      ".read": false,
      ".write": false
    }
  }
}