Mar*_*rey 5 firebase firebase-realtime-database
我想在 Firebase 中增加一个计数,但不将当前计数暴露给 client。
我已经阅读了许多关于使用事务在 Firebase 中增加计数器的有用答案,但所有这些都假设客户端具有对计数器元素的“读取”访问权限。如果客户端不应该拥有对计数的读取权限,但我想根据用户的操作增加值,该怎么办?
例子:
假设我想跟踪特定内容的观看次数或印象(或其他一些用户操作)。这些计数仅供内部查看,可能会与广告商和合作伙伴私下共享——但不会向用户自己显示,我们不想通过将这些数据暴露给浏览器来与竞争对手共享这些数据。
对于这样的情况,我可以通过服务器进程路由事物,其中服务器进程获取计数并增加它,但这首先违背了使用 Firebase 的目的。是否还有其他选项可以从浏览器增加“私有”计数器?
我不确定你为什么被否决,因为这对我来说似乎是一个有效的问题。
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)