有没有办法在不向客户端公开当前计数的情况下增加 Firebase 中的计数?

Mar*_*rey 5 firebase firebase-realtime-database

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

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

例子:

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

对于这样的情况,我可以通过服务器进程路由事物,其中服务器进程获取计数并增加它,但这首先违背了使用 Firebase 的目的。是否还有其他选项可以从浏览器增加“私有”计数器?

Fra*_*len 4

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

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

解决您的问题的常见方法是引入计数服务器。每个客户端都可以将其“我已查看此内容”记录写入数据库,然后您就有一个服务器来侦听此队列并更新计数。

viewQueue
    $pushId
      uid: <uid>
      itemId: <itemId>
viewCounts
    $itemId: <totalViewCount>
Run Code Online (Sandbox Code Playgroud)

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

{
  "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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)