2017-04-13 148 views
1

还有一些关于此问题的老问题,但由于他们已经有几年了,所以我很好奇是否有关于此的更新。我想为彩票制作动画,用户可以购买门票。一切进展顺利,但我想确保从未售出超过一千张门票。它必须是服务器端,而这些是我的规则:设置Firebase的最大儿童人数

"Lottery": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
     "counter": { 
     ".validate": "newData.isNumber() && newData.val() > 0 && newData.val() <= 1000 && ((!data.exists() && newData.val() === 1) || (newData.val() === data.val()+1))" 
     }, 
     "tickets":{ 
      "root.child('Lottery/counter/').val() === someValueYouNeedItToEqual" 
     } 
    } 

我不知道该怎么在someValueYouNeedItToEqual写。我很担心这个系统的工作。我的目标是将用户的UID写入服务器,并且如果值(我可以搜索客户端的可用点,值可以是0到1000之间的Int)是免费的,那么它将被接受。当所有景点都被拍摄时,它应该被拒绝(节点中有1000个小孩)。我希望有人能帮我弄清楚所需的验证规则。谢谢。

回答

2

你得到的错误,因为

"root.child('Lottery/counter/').val()" 

表达不返回一个布尔值。它返回存储在该引用中的值。您可以尝试像

"root.child('Lottery/counter/').val() === someValueYouNeedItToEqual" 
+0

谢谢:)现在我需要它来确保它设置不超过1000个孩子。任何想法如何做到这一点? –

+1

不幸的是,从firebase的服务器端规则中获取儿童人数的方式并不存在。我能想到的最简单的方法是添加一个“numberOfTickets”引用,并在每次添加票证时增加它。然后,你只需要写一条规则,像''root.child('numberOfTickets')。val()<1000“' –

3

壁球的错误有了这个指导意见已经在这里上SO:Limit number of records that can be written to a path (reference other paths in security rules)

或者你可以使用Cloud Functions for Firebase实现database trigger两个:

  1. 增量/当孩子来来去去时,减少孩子数量(在一个交易中是安全的)。
  2. 检查该小孩的数量以确保新小孩有效用于添加,如果不是,则删除它(或某个其他小孩)。
+0

好吧,我想我会看看Firebase的函数,它在我看来是一个更安全一点。 –