我一直在试图规则添加到我的火力地堡数据库几天,但一个错误不断坡平,我找不到什么是错的。火力地堡多路径更新 - 权限被拒绝
有错误:
火力警告:PERMISSION_DENIED
PERMISSION_DENIED:在/失败的更新权限被拒绝
我搜索的解决方案,并发现了一些相关的帖子(Permission denied error during multiple update on Firebase) 。看来显示的错误是不正确的。我虽然得到了这个,因为我没有权利设置在我的根路径('/'),但根据这篇文章,这不是一个问题。
我想我的3“写”的规则设置为“真”和它的作品,所以我想这个问题一定是在我的规则。
见下面我的代码。
角服务:
let event = {
"title": "Title"
"uid": "FZON4aEQgKNnRlHqMH7ZwynhTtp1"
}
let uid = this.authService.fbUser.uid;
let eventId = this.db.list('eventsData').push(undefined).key;
let updateObject = {};
updateObject[`eventData/${eventId}`] = event;
updateObject[`userEvents/${uid}/${eventId}`] = true;
updateObject[`eventGuests/${eventId}/${uid}`]= {
attendance: 2 // and some other data
};
return this.db.object('/').update(updateObject);
数据的层次结构:
{
"eventData" : {
"-KptoNEw3MKRfacLnqa6" : { //Some data equal to 'event' object in above Angular service }
},
"eventGuests" : {
"-KptoNEw3MKRfacLnqa6" : {
"FZON4aEQgKNnRlHqMH7ZwynhTtp1" : { // Some data }
}
},
"userEvents" : {
"FZON4aEQgKNnRlHqMH7ZwynhTtp1" : {
"-KptoNEw3MKRfacLnqa6" : true
}
},
"users" : {
"FZON4aEQgKNnRlHqMH7ZwynhTtp1" : { //Some data }
}
}
火力地堡规则:(我删除'.read的权利,以使代码更清洁,因为它们不问题的一部分)
{
"rules": {
"eventData": {
"$eventId": {
// Event owner can update data
// OLD > ".write": "auth.uid == data.child('uid').val()"
// NEW
".write": "(newData.child('uid').val() == auth.uid) && (!data.exists() || data.child('uid').val() == auth.uid)"
}
},
"eventGuests": {
"$eventId": {
"$uid": {
// Event owner can add someone to the event
// Actual user can modify his attendance
".write": "(auth.uid == root.child('eventData').child($eventId).child('uid').val()) || (auth.uid == $uid && data.exists() && newData.exists())"
}
}
},
"userEvents": {
"$uid": {
"$eventId": {
// Event owner can add his event to someone's list
".write": "auth.uid == root.child('eventData').child($eventId).child('uid').val()"
}
}
}
}
}
感谢您的参观!
UPDATE:
由于弗兰克的错误的纠正,我进行了一些新的考验。
我所做的更新并不多路径方式,但一个接一个,通过评论那些我不想跑。另外,我尝试了静态值。
let updateObject = {};
updateObject[`eventData/-Kpu9op4_s3jCetav6xn`]= {
"title": "Title"
"uid": "FZON4aEQgKNnRlHqMH7ZwynhTtp1"
};
return this.db.object('/').update(updateObject);
然后:
let updateObject = {};
updateObject[`userEvents/${uid}/-Kpu9op4_s3jCetav6xn`]= true;
return this.db.object('/').update(updateObject);
和:
let updateObject = {};
updateObject[`eventGuests/-Kpu9op4_s3jCetav6xn/${this.authService.fbUser.uid}`]= {
attendance: 2 // and some other data
};
return this.db.object('/').update(updateObject);
他们的工作3。
但是,当我使用(在同一时间3)多路运行的代码,我仍然得到许可被拒绝错误。
为什么你身边每个子阵列括号:''['EVENTDATA/$ {}键']''? –
另请注意,我们不知道“事件”是什么。请确保您的问题包含了[是需要重现该问题最小的,完整的代码(http://stackoverflow.com/help/mcve)。确保这一点的一个简单方法是对所有内容使用硬编码值。 –
关于支架,它是由当我用外部物体的残余(myUpdateObject ['EVENTDATA/$ {键}'] = MYDATA的)。让我更新所有的! –