我有以下对象:
const offer = {
offerInfo: {
price: '',
status: 'open',
message: '',
ownerUID: '',
ownerName: '',
ownerPhoto: '',
ownerAvgRating: '',
ownerReviewNumber: '',
},
offerMetaData: {
userHasSeenOffer: false,
userHasBeenNotified: false,
}
}
我正在尝试将其发布到以下节点:
updates['jobs/${activeJob.key}/offers/${currentUser.uid}] = offer;
然后firebase.database().ref().update(updates)
正如您所看到的,我正在使用用户uid作为要约本身的ID。
现在当我尝试使用以下规则发布它时,我收到了一个权限被拒绝的错误,我不知道为什么。
规则:
"jobs": {
"$job_uid": {
".read": "auth !== null",
"job": {
".write": "!data.exists() && root.child('allUsers/serviceUsers/' + auth.uid + '/paymentDetails').exists() || data.exists() && root.child('jobs/' + $job_uid + '/job/owner').val() === auth.uid",
},
"offers": {
"$offer_uid": {
"offerInfo": {
".write": "$offer_uid === auth.uid",
},
"offerMetaData": {
".write": "root.child('jobs/' + $job_uid + '/job/owner').val() === auth.uid || $offer_uid === auth.uid",
},
},
},
...
有什么想法吗?
答案 0 :(得分:2)
您正在尝试直接写入$offer_uid
但您在该节点上没有任何写入规则,因此它将使用默认的false。
对于你当前的写作成功,你可以改变你的规则:
"$offer_uid": {
".write": "$offer_uid === auth.uid",
"offerMetaData": {
".write": "root.child('jobs/' + $job_uid + '/job/owner').val() === auth.uid",
},
},
我直接在$offer_uid
中将写规则向上移动了一个节点,而不是在两个孩子中单独使用它。
另一个选择是保留你的规则并分割你的写,这样你就可以写入子节点了。