Javascript firebase多路径更新和每个路径的规则
我正在实现一个用户和事件系统。一个限制是用户一次只能主持一个事件 我最初试图通过查询Javascript firebase多路径更新和每个路径的规则,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,我正在实现一个用户和事件系统。一个限制是用户一次只能主持一个事件 我最初试图通过查询事件规则中的事件节点来实现该限制,方法是查找用户ID已等于auth.uid的事件。但我不知道该怎么做,所以我决定创建一个新节点,hosts,作为一个查找表。它只存储当前承载事件的任何用户标识。如果用户试图创建事件,并且其用户ID已存在于主机中,则这是一个错误 规则: { "rules":{ "users":{ "$uid":{ ".rea
事件
规则中的事件
节点来实现该限制,方法是查找用户ID已等于auth.uid
的事件。但我不知道该怎么做,所以我决定创建一个新节点,hosts
,作为一个查找表。它只存储当前承载事件的任何用户标识。如果用户试图创建事件,并且其用户ID已存在于主机中,则这是一个错误
规则:
{
"rules":{
"users":{
"$uid":{
".read": "auth.uid == $uid",
".write": "auth.uid == $uid",
".validate": "newData.exists()"
}
},
"hosts":{
"$uid":{
".read": "true",
//to be a host, you must be a user
".write": "auth.uid == $uid && root.child('users').hasChild(auth.uid) && !root.child('hosts').hasChild(auth.uid)",
".validate": "newData.exists()"
}
},
"events":{
"$uid":{
".read": "true",
//to create an event, you must be a host
".write": "root.child('hosts').hasChild(auth.uid)",
".validate": "true"
}
}
}
}
Javascript:
createEvent(form){
var user = firebase.auth().currentUser
var db = firebase.database();
var newEventRef = db.ref('events').push();
var newEvent = {}
newEvent[uid] = form*/
var update = {
['hosts/'+user.uid]: true
update['events/'+newEventRef.key] = form
};
db.ref().update(update)
.then((...args)=>{
...
})
.catch(err=>{
...
})
},
update调用的问题是它总是失败。我正在尝试同时插入主机
和事件
。但是事件
写入
规则要求用户ID在写入之前在主机
中,所以我想这就是它失败的原因
我必须进行两次单独的更新吗?1要将用户ID插入到主机
,然后如果成功,再将另一个用户ID插入到事件
?在安全规则中,有三个变量引用数据:
数据
-规则更新前存在于规则位置的数据
newData
-更新后规则所在位置存在的数据
root
-数据在更新之前存在于thd数据库的根目录中
因此,当您在规则中引用root
时,您将从更新之前获取数据。要获取更新的数据,您必须参考newData
。由于不幸的是没有newRoot
,您必须通过多次调用parent()
从newData
导航到所需级别
举个例子:
"events":{
"$uid":{
".read": "true",
//to create an event, you must be a host
".write": "newData.parent().parent().child('hosts').hasChild(auth.uid)",
".validate": "true"
}
}
这帮助我解决了一个2小时的问题,不知道newData的相对路径情况,非常好且简单的解释,使用parent()修复:)