如果更新的一部分具有取决于更新的另一部分的规则,则更新和事务将失败。
用户创建示例
规则
{
"rules": {
// Private user data
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
// Public user data
"profiles": {
".read": true,
"$uid": {
// The authed user can write only if they exist in /users.
".write": "$uid === auth.uid && root.child('users/' + $uid).exists()"
}
}
}
}
更新功能
function createUser(uid, user, profile) {
var updates = [];
updates['/users/' + uid] = user;
updates['/profiles/' + uid] = profile;
// This will fail
firebase.app().database().ref().update(updates, onComplete);
}
function onComplete(error) {
if (error) console.log('error:', error);
else console.log('success');
}
答案 0 :(得分:1)
您正在检查root
,它指的是更新前存在的数据。
要检查新数据,请从newData
变量开始。如果您需要引用根目录下的数据,则意味着您需要使用多个parent()
来回到顶部。
{
"rules": {
"profiles": {
".read": true,
"$uid": {
".write": "$uid === auth.uid &&
newData.parent().parent().child('users/' + $uid).exists()"
}
},
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}