强制同时设置多个孩子

时间:2016-02-12 16:42:16

标签: firebase

我正在寻找后端和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

由于

1 个答案:

答案 0 :(得分:0)

我想你回答了自己的问题:

您发布的规则:

  

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

只接受将数据写入设置颜色和大小的节点。添加!data.exists()以验证它是否已经存在。

通过:

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

这失败了:

ref.set({ size: 21 });

这里的关键是newData,确保新数据符合规则。然后添加!data.exists()以确保数据不存在。

还有一些其他方法可以强制执行此操作。