在 firebase 实时数据库中进行更复杂验证的最佳方法是什么?

What's the best way to do more complex validation in firebase realtime database?

tldr: 由于 firebase RTDB 安全规则仅支持单语句条件并且允许的变量非常有限,因此我无法检查是否允许用户提交。我该怎么办?

我正在制作一个简单的游戏,用户可以在其中进行天气预报(“猜测”)。目前,可以对明天和后天进行猜测(我可能还会添加对接下来几个小时进行短期预测的功能)。下面是我的数据库中的猜测。例如,显示的猜测意味着已经提前一天 ('d1') 预测了 2021 年 1 月 26 日 (30,-20) 的龙卷风。长字符串是用户ID。

我想阻止用户发送对当天或已经发生的一天的猜测(如果我添加该功能,则同样适用于几个小时)。验证已经在客户端实现,但显然我需要在服务器上进行检查。 但是,我无法使用 RTDB 安全规则执行此操作,因为唯一的时间变量是 now,即自纪元以来的毫秒数。我能想到的选项是:

  1. 以某种方式重构数据库,以便我可以使用 now 变量进行比较。这可能是 complicated/impossible.
  2. 为每个可以验证它的猜测调用 Firebase 云函数。我担心这可能会导致很多函数调用。

有没有 'right' 方法可以解决我的问题?有没有我没有想到的选择?一般有什么建议吗?

确定今天的开始时间(以毫秒为单位,因为纪元应该是可能的):

Math.floor(now / (24*60*60*1000)) * (24*60*60*1000)

我实际上不确定 Math 在安全规则中是否可用。如果没有,您也许可以通过类型转换或正则表达式获得类似的结果。

如果您想在实时数据库中重复使用它,请考虑使用 Firebase 的 Bolt preprocessor, which has support for functions