【问题标题】:Can't retrieve data from firebase无法从 Firebase 中检索数据
【发布时间】:2016-01-24 21:58:37
【问题描述】:

我正在尝试从 firebase 检索数据,其格式如下:

>Users
--->UID
------>email:
------>height:
------>etc...

由于某种原因,当我尝试获取 say email 的值时,UID 不断返回 undefined。这是尝试检索数据的代码:

.factory('Chats', function($rootScope) {
  // Might use a resource here that returns a JSON array
  var chats;

  return {
    all: function() {
      return chats;
    },
    initialize: function(isLoggedIn) {

      var data = $rootScope.ref.getAuth().uid;
      console.log("initialize: " + data);
      if(isLoggedIn == true) {
        $rootScope.ref.on("value", function(snapshot) {
          console.log("Value: " + snapshot.val());
          console.log("Users: " + snapshot.val().users);
          console.log("Data: " + snapshot.val().users.data.email);
        }, function (errorObject) {
          console.log("The read failed: " + errorObject.code);
        });
      }
}
};
})

当它获得第三个console.log('Data'一个)时它会中断,它会抛出一个异常:

Cannot read property 'email' of undefined

但是当我在 if 语句之前记录变量 data1 时,它以字符串的形式返回用户的正确 UID,所以我不明白为什么它告诉我它未定义。我要做的就是挖掘我的 firebase 树并根据用户的 UID 检索用户的值(电子邮件、身高等)——我通过调用 ref.getAuth().uid 检索这些值。

提前致谢!

【问题讨论】:

    标签: angularjs ionic-framework firebase


    【解决方案1】:

    您正在阅读 Firebase 的根目录,然后尝试访问:

    snapshot.val().users.data.email
    

    对应于:

    /users/data/email
    

    如果您检查 JSON 数据,您会发现 /users 没有名为 data 的子节点。要使用数据的,需要使用括号表示法:

    snapshot.val().users[data].email
    

    请注意,您加载的数据比您的方法要多得多。如果您只从数据库中下载他们的数据,您的用户可能会喜欢它,您可以这样做:

    $rootScope.ref.child("users").child(data).on("value", function(snapshot) {
      console.log("Data: " + snapshot.val().email);
    }, function (errorObject) {
      console.log("The read failed: " + errorObject.code);
    });
    

    最后一点:如果您将电子邮件地址绑定到$scope,您会发现 Angular 视图不会立即获取它。这是因为 on() 回调中的代码是异步调用的,到那时 AngularJS 已经不知道您的操作了。您可以了解如何让 AngularJS 了解此答案中的更改:Firebase callbacks and AngularJS。但也可以考虑使用AngularFire 来完全避免这个问题。

    【讨论】:

    • 嘿,弗兰克,感谢您的回答 - 成功了!一个快速的问题,在 Angular 中是否有办法等待 Firebase 在继续下一行代码之前检索数据?该代码在我的 service.js 中,并返回带有用户信息的对象 - 我的控制器调用该服务。然后我的控制器将服务的返回值设置为一个变量,但控制器似乎没有等待服务返回,因此它将变量设置为未定义。
    • (谢天谢地)没有办法让代码等待浏览器中异步加载的数据。阅读我的答案中的最后两个链接,了解解决此问题的方法。
    • 查看异步函数,使用 async/await 语法。它处于 ECMAScript 标准化过程的第 3 阶段。它允许您编写代码,就好像它是同步的,同时保持异步,所以@MatTaNg,您可以调用 Firebase,并且您的代码会在执行下一行之前“等待”,尽管实际上它并没有阻塞任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2020-11-08
    • 2019-02-28
    相关资源
    最近更新 更多