2016-02-12 29 views
0

我在爲後端和firebase的解決方案提供同樣有趣的服務,但在開始使用它之前我有一些問題。強制同時設置多個孩子

我的問題將以「驗證數據」部分中的例https://www.firebase.com/docs/security/guide/securing-data.html 爲基礎。

在這個例子中,他們創建一個小部件,一個小部件必須具有顏色和大小。他們驗證這一點與這條線: 「」 .validate 「: 」newData.hasChildren([ '色', '大小'])「,」

這條線後,會出現這種情況

// PERMISSION_DENIED: does not have children color and size 
ref.set('foo'); 
// PERMISSION DENIED: does not have child color 
ref.set({size: 22}); 
// PERMISSION_DENIED: size is not a number 
ref.set({ size: 'foo', color: 'red' }); 
// SUCCESS (assuming 'blue' appears in our colors list) 
ref.set({ size: 21, color: 'blue'}); 

而且之後,如果客戶想更新一個孩子,這會成功

// If the record already exists and has a color, this will 
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size']) 
// will fail to validate 
ref.child('size').set(99); 

我的問題是:我們可以強迫客戶端始終更新在同一時間的大小和顏色。如果客戶嘗試這個「ref.child('size')。set(99);」。我想拒絕並且只接受像「ref.set({size:21,color:'blue'});」即使記錄已經存在。

然後,我希望這種情況發生在客戶端上:

ref.set({ size: 21, color: 'blue'}); //Sucess, now size and color exist 
ref.child('size').set(99); //Fail, you did not update color at the same time 
ref.set({ size: 22, color: 'red'}); //Success, you just change the size 
            //and the color. You didnt create a new 
            //value, you change value already there 

感謝

回答

0

我想你回答了你自己的問題:

您發佈的規則:

「 .validate「:newData.hasChildren(['color','size'])」

將只接受將數據寫入設置顏色和大小的節點。添加!data.exists()來驗證它不存在。

這傳遞:

ref.set({ size: 21, color: 'blue'}); 

這種失敗:

ref.set({ size: 21 }); 

這裏的關鍵是newData確保新數據符合規則。然後添加!data.exists()以確保數據不存在。

還有其他一些方法來強制執行此操作。

+0

謝謝,但是如果我理解你的anwser,你添加「!data.exists()來驗證它不存在」。然後,如果用戶嘗試更改值,則會因數據存在而失敗。但是,即使數據存在,我也希望允許客戶端更改值。 然後如果客戶端 ref.set({size:21,color:'blue'}); //成功,現在存在價值 我想要這個「ref.child('size')。set(99);」失敗,但「ref.set({size:21,color:'blue'});」將會成功。我的問題是否清楚?或者我只是不會打開催促者? – qqchose

+0

!data.exists僅適用於不想覆蓋現有數據的情況。如果您希望能夠更改數據(即使它存在),請將其保留。我提供的答案將允許您覆蓋現有數據,只要它包含兒童的大小和顏色即可。 – Jay

+0

然後,你的答案是「」.validate「:newData.hasChildren(['color','size'])」「但是從https://www.firebase.com/docs/security/guide/securing -data.html命令「/ /如果記錄已經存在,並有一個顏色,這將 //成功,否則它會失敗,因爲newData.hasChildren(['顏色','尺寸']) //將失敗驗證 ref.child('size')。set(99);「將會成功,那麼網站是錯誤的或者我錯過了什麼 – qqchose