Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript firebase多路径更新和每个路径的规则_Javascript_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

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()修复:)