【问题标题】:Is there a way to increment a count in Firebase without exposing current count to the client?有没有办法在不将当前计数暴露给客户端的情况下增加 Firebase 中的计数?
【发布时间】:2016-08-23 13:44:29
【问题描述】:
我想在 Firebase 中增加一个计数,但不向客户端公开当前计数。
我已经阅读了许多关于在 Firebase 中使用事务来增加计数器的有用答案,但所有这些都假设客户端对计数器元素具有“读取”权限。 如果客户端不应该对计数具有读取权限,但我想根据用户的操作增加值怎么办?
例子:
假设我想跟踪对特定内容的查看或展示(或其他一些用户操作)。这些计数仅供内部查看,可能会与广告商和合作伙伴私下共享 - 但不会向用户本人显示,我们不希望通过将这些数据暴露给浏览器来与竞争对手共享。
对于这样的情况,我可以通过一个服务器进程来路由,在该服务器进程中获取计数并增加它,但这有点违背了使用 Firebase 的初衷。是否有任何其他选项可以从浏览器中增加“私有”计数器?
【问题讨论】:
-
Firebase 最近发布了 Cloud Functions。看看这个answer了解更多详情
-
标签:
firebase
firebase-realtime-database
【解决方案1】:
我不确定你为什么会被否决,因为这对我来说似乎是一个有效的问题。
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
}
}
}