插入记录时,我需要能够在服务器上运行一个或多个查询,如果找到任何结果,将拒绝该插入。 Firebase允许我这样做吗?它无法在客户端上指定,也可能很容易被破坏。
对于一个更具体的例子,我有一个Meteor应用程序,目前让我用一些非常简单的代码限制投票。我想在Firebase中实现它。 (请原谅CoffeeScript)
@VoteFrequency =
votesPer: (sinceDelta, sinceUnit) ->
Votes.find(
pollId: @pollId
ip: @ip
createdAt:
$gte: moment().add(-sinceDelta, sinceUnit).toDate()
).count()
withinLimits: (ip, pollId) ->
@ip = ip
@pollId = pollId
# Allow x votes per y seconds
@votesPer(10, 'seconds') < 1 &&
@votesPer(1, 'hours') < 15 &&
@votesPer(1, 'days') < 150
如您所见,它查询数据库以查找与IP地址匹配的先前投票,并且比时间戳更新(使用当前时间的增量 - 间隔计算)。如果它找到任何这些限制的任何结果,它将返回false,告诉调用者不要插入新的投票。
要明确的是,我并没有找到一个解决方案,我将自己的服务器添加到混合中。一旦我必须这样做,FireBase至少会对我失去吸引力。
从目前为止我所知道的情况来看,这似乎并不是我只能使用浏览器/本机客户端和firebase实现的。
答案 0 :(得分:1)
您无法在Firebase的服务器上运行自己的代码。因此,尝试将现有的三层解决方案映射到Firebase需要的不仅仅是评估如何移植每个脚本。
据我所知,有这些主要选项:
我认为#1是明确的,但肯定不是微不足道的。例如:Firebase的安全规则无法访问客户端的IP地址,因此您必须找到一种方法(安全地)将其插入到数据中。另外:rate-limiting is possible in Firebase security rules,但不容易。
#2可能也很清楚。但它会让您使用自定义中间件来保持当前的三层架构。您只需使用Firebase替换当前的数据存储。如果这正是您所寻找的,那么这绝对是最简单的迁移方法。
在this blog post的模式2中描述了#3。在这种情况下,您可以考虑让客户将其投票和IP地址写入“暂存”节点。然后,bot脚本从暂存区域读取它们,验证它们是否在规则范围内并写入官方节点(常规客户端无权访问)。