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我对答案所做的更正是否正确?