ref.once()未被调用

时间:2016-02-09 09:44:12

标签: javascript firebase

我试图通过访问来获取用户名 数据值保存为uid中的子项(作为父项):

var ref = new Firebase("https://mintio.firebaseio.com");

var authData = ref.getAuth();
var username = null;
ref.on("value" , function(snapshot){
    console.log("reading initiaized");
    var usernameSnap = snapshot.child(authData.uid).child("name");
    username = usernameSnap.val();
    console.log("username read");
});

但是用户名保持为空并且消息永远不会记录到控制台中...好像永远不会调用once()函数。
authData对象包含正确的uid(" google:107739486693148575362") 数据看起来像这样:
enter image description here

编辑: 这些是我的安全规则:

{
    "rules": {
      "users": {
        "$uid": {
            ".read": "auth.uid == $uid",
            ".write": "auth !== null && auth.uid == $uid" 
        }
      }
    }
}

如果这还没有足够的信息,可以在此处找到回购:https://Minzkraut@bitbucket.org/Minzkraut/mintio.git

我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

当我尝试访问您的数据库时,我得到:

  

错误:permission_denied:客户无权访问所需数据。

所以看起来你有安全规则阻止读取成功。

最有可能的是,您有一个安全措施,可确保每个用户只能访问自己的用户数据:

{ 
  "rules": {
    "$uid": {
      ".read": "auth.uid == $uid"
    }
  }
}

如果您具有与上述类似的安全规则,则在执行此查询时:

var ref = new Firebase("https://mintio.firebaseio.com");
ref.on("value" , function(snapshot){ ...

您正尝试从数据库的根目录进行读取。 Firebase服务器会根据您的安全规则对此进行检查,并指出您不具有对数据库根目录的读取权限。所以它拒绝了这项行动。

您想要的是直接访问用户的数据:

var ref = new Firebase("https://mintio.firebaseio.com");
ref.child(ref.getAuth().uid).on("value" , function(snapshot){ ...

使用最后一个片段,读取操作将从用户自己的数据开始。 Firebase服务器会检查规则,并会看到"auth.uid == $uid"为真。

这是使用Firebase安全规则的两个最常见的陷阱之一: