2017-04-13 111 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的函數,它在我看來是一個更安全一點。 –