我正在寻找后端和firebase的解决方案同样有趣,但在开始使用它之前我有一些问题。
我的问题将基于例如https://www.firebase.com/docs/security/guide/securing-data.html 在“验证数据”部分。
在这个例子中,他们创建了一个小部件,小部件必须具有颜色和大小。他们用这一行验证了这一点:“”。validate“:”newData.hasChildren(['color','size'])“,”
在这一行之后,这将会发生
// 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 :(得分:0)
我想你回答了自己的问题:
您发布的规则:
" .validate":newData.hasChildren([' color',' size'])"
只接受将数据写入设置颜色和大小的节点。添加!data.exists()以验证它是否已经存在。
通过:
ref.set({ size: 21, color: 'blue'});
这失败了:
ref.set({ size: 21 });
这里的关键是newData,确保新数据符合规则。然后添加!data.exists()以确保数据不存在。
还有一些其他方法可以强制执行此操作。