当前位置: 首页 > 知识库问答 >
问题:

Firebase无法根据规则集推送数据

仲孙默
2023-03-14

我正在尝试创建一个受密码保护的聊天室,并以用户为例回答:

Firebase:存储房间密码的方法

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

{
    "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。如果我这么做。

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

共有1个答案

翟京
2023-03-14

要使其工作,您必须按照您的规则写入路径。

要做到这一点,您必须将您的ush()分成两部分:生成密钥和实际写入数据:

// 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");
 类似资料:
  • 我尝试用规则返回用户聊天列表。所以我不知道对话的id。我尝试了几种方法,但都不起作用,因为你必须知道聊天id。 数据库: 规则: 但当我从react本机应用程序访问时。通过身份验证的用户无法访问聊天记录(uid:3Oi1atf8l2P4Vgsb8tZOGxpUg7q2) *读取失败:错误:权限被拒绝/Chats:客户端没有访问所需数据的权限。 规则: 查询:

  • 我使用以下规则检查只有“管理员”才能写入陷阱部分。 这个很好用。但是如果我把规则改为, 然后我得到了一个权限错误。W/SyncTree:侦听/traps失败:数据库错误:权限被拒绝。 我之所以改变结构,是因为我试图使用validate函数,但由于我无法通过第一个问题,我无法达到验证的程度。 我肯定这是一个新手理解错误,但在尝试了许多排列后,我在这方面进展甚微。您的协助将不胜感激。 更新201606

  • 我开始构建一些非常简单的应用程序,我想我已经掌握了如何在android Studio中创建基础知识。我一辈子都搞不清楚的是为什么我不能把数据发送到我的firebase实时数据库。 这是一个非常简单的应用程序,我试图让它目前的工作(因为我不能在更丰富的一个)--只需要一个按钮,应该发送“你好,世界!”

  • 我有一个数据库: 当用户()在应用程序中注册时,他会填充另一个用户uid(该用户uid具有属性)并将自己的uid添加到他的个人资料中(

  • 更新2019-11-03:添加了错误的实时最小复制。在Chrome中加载链接后,点击ctrl shift i并选择控制台以查看输出。我已经尽力确保这正是我最初的项目代码所做的;我们看看情况是否如此,嗯?碎片的规则文件与下面的原始帖子相同。该源代码可在GitHub上获得。 原文: 这些规则在模拟器中工作,但在我真正的网络应用程序中不工作。模拟器路径和有效负载与下面数据库日志输出中显示的相同。 (将两

  • 如果我在公共模式下使用Firebase实时数据库发布我的Android应用程序会怎么样,因为我不需要任何身份验证。它说 公共访问使您的数据库对任何人开放,即使是不使用您的应用的人,因此请务必在设置身份验证时再次限制您的数据库。 我不清楚,如果他们的应用程序没有连接到我的数据库,而且他们也没有firebase帐户的登录密码,那么他们怎么能访问我的数据库。 提前发送Thx