我想在Firebase中增加一个计数,但不会将当前计数暴露给客户端。
我已经阅读了许多有关使用事务来增加Firebase中的计数器的有用答案,但所有这些都假设客户端已经"读取"访问计数器元素。 如果客户端不具有对计数的读取权限,但我想根据用户的操作增加值,该怎么办?
示例:
假设我想跟踪特定内容的观看次数或展示次数(或其他一些用户操作)。这些数据仅供内部人员参与,可能与广告商和合作伙伴私下共享 - 但不会向用户自己显示,我们也不希望通过将其暴露给浏览器来与竞争对手分享这些数据。 / p>
对于这样的情况,我可以通过服务器进程路由事物,服务器进程在其中获取计数并递增计数,但这有点辜负了首先使用Firebase的目的。还有其他任何选项来增加"私人"来自浏览器的计数器?
答案 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
}
}
}