Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.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 can';t推送给定规则集的数据_Javascript_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

Javascript Firebase can';t推送给定规则集的数据

Javascript Firebase can';t推送给定规则集的数据,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,我正在尝试创建一个受密码保护的聊天室,并发现了以下示例,请回答用户: 问题是,根据答案中的规则集,我不知道如何推送新数据。我的规则如下: { "rules": { "myApp":{ "chatRooms" : { "$roomID" : { "password": { ".read": "false",

我正在尝试创建一个受密码保护的聊天室,并发现了以下示例,请回答用户:

问题是,根据答案中的规则集,我不知道如何推送新数据。我的规则如下:

{
    "rules": {
        "myApp":{
            "chatRooms" : {
                "$roomID" :  {
                    "password": {
                        ".read": "false",
                        ".write": "root.child('myApp/chatRooms/' + $roomID + 'chatInfo').child('admin').val() == auth.uid"

                    },
                    "chatInfo" : {
                        ".read":true,
                        ".write": "data.child('admin').val() === auth.uid"
                    },
                    "members" : {
                        "$user_id" : {
                            ".validate": "$user_id == auth.uid && newData.val() == root.child('feeds/chatRooms/' + $roomID + '/password').val()"
                        }
                     },
                     "messages" : {
                         ".read" : "root.child('feeds/chatRooms/' + $roomID + '/members/' + auth.uid).exists()"
                     }
                }
            }
        }
    }
}
所以现在我需要能够推动一个新的聊天室。但如果我称之为:

var obj = {
    password: "test", 
    chatInfo : {admin: this.state.currentUser.uid, chatName: "foobar"}
};
firebase.database().ref(`myApp/chatRooms`).push(obj);
它失败了,因为我没有写入规则来推送到聊天室/$uid。如果我这样做


使用这样的规则推送新数据的正确方法是什么?

要使其工作,您必须写入规则所在的路径

为此,您必须将
push()
分为两部分:生成密钥和实际写入数据:

// Generate the key (this happens client side)
var key = firebase.database().ref(`myApp/chatRooms`).push().key;

// Use the key to write your data

firebase.database().ref(`myApp/chatRooms`).child(key).child('chatInfo').set({admin: this.state.currentUser.uid, chatName: "foobar"});
firebase.database().ref(`myApp/chatRooms`).child(key).child('password').set("test");

将规则上移1级或确保写入正确的位置(这可以使用push()生成密钥)@AndréKool但如果我将规则上移1级,则无法使用链接线程中显示的密码技术更正?更正。也许在这个问题上最好使用这些规则,并说明你到底有什么问题。我想我知道你的问题是什么,但我需要更多(具体的)信息。@AndréKool好的,我更新了它,更像是我在应用程序中如何使用它,我想这会使问题复杂化。基本上,我正在尝试将聊天室信息推送到聊天信息(管理员、姓名、创建日期等)中,并设置用于其他人加入的密码。我还没有真正考虑或关心成员或消息,因为我甚至无法启动聊天室。这很有效!我不认为你能推一个空的物体去拿钥匙。我不得不做一些小的调整,也许可以做我正在使用的反应型firebase。我必须这样获得密钥:
firebase.database().ref('myApp/chattrooms').push().key我还必须将“密码”设置移到“聊天信息”设置下,否则它将看不到“管理员”字段。@DasBeasto我对答案所做的更正是否正确?