开发者问题收集

Firebase 无法从数据库获取价值

2016-12-06
116

我尝试使用 Firebase 和 Ionic 构建聊天应用程序。

如果我直接通过 URL 打开聊天页面,例如:

http://localhost:8100/#/home/messaging/jJ53KWgqnuWXSzksRYl1XNw20JJ2

Firebase 似乎无法正常工作。但是,如果我使用以下命令从上一页的菜单打开聊天页面:

ui-sref="home.messaging({id: p.friendId})"

一切正常。

这是我在 ChatController 上的代码:

$scope.data.friendId = $stateParams.id;

var refMessage = firebase.database().ref();

refMessage.child("user_profile").child($scope.data.friendId).once("value")
        .then(function (profile) {
            $scope.data.friendUserProfile = profile.val();
            //on debug this line is reached
        });

refMessage.child("profile_photo").child($scope.data.friendId).once("value")
        .then(function (profilePic) {
            $scope.data.friendUserPhotos = profilePic.val();
            //I can't get friend's photos firebase doesnt reach this line.

        });

refMessage.child("friends").child($localStorage.uid).child($scope.data.friendId).once("value")
        .then(function (friend) {
            if (friend.val() !== null) {
                $scope.data.isNewFriend = friend.val().isNew;
                //on debug this line is reached
            }
        });

var chatId = 'chat_' + ($scope.data.uid < $scope.data.friendId ? $scope.data.uid + '_' + $scope.data.friendId : $scope.data.friendId + '_' + $scope.data.uid);

问题只出在朋友的照片上。Firebase 不会从数据库调用照片。所有其他调用都可以异步正常工作,但永远不会在调试时获取照片行。

如果我刷新页面并且转到上一页并返回聊天页面,则会出现此问题,一切正常。

我想如果我的 $scope.data 有问题。它不适用于之前的调用 friendUserProfile ,但适用于它。

Firebase v3.6.1

谢谢

2个回答

由于 firebase 是异步的,因此您使用承诺来处理异步操作。这意味着您应该添加一个 catch 方法来查看 Firebase 是否返回错误。

如果不这样做,您将无法确定是否发生了错误。

refMessage.child("profile_photo").child($scope.data.friendId).once("value")
    .then(function (profilePic) {
        $scope.data.friendUserPhotos = profilePic.val();
        //I can't get friend's photos firebase doesnt reach this line.

    }).catch(function(error) {
        console.log(error);
    });
Gregg
2016-12-07

使用 firebase.database.enableLogging(true); 进行调试后,我发现了一些与监听器有关的问题。

RootController 上还有另一个对 refMessage.child("profile_photo") 的调用,如果我直接刷新聊天页面, .once 会关闭该路径上的所有监听器,我无法从 ChatController 的 firebase 调用中获取数据。

cgrgcn
2016-12-15