使用AngularFire $ firebaseArray $ keyAt(recordOrIndex)可以使用对象而不是引用来搜索Firebase数据库吗?

时间:2017-04-17 18:49:33

标签: firebase firebase-realtime-database angularfire

用户使用$firebaseAuth登录后,Google会发送用户的displayName,email和photoURL。然后,我想在Firebase数据库中查找用户的帐户。我无法使用$getRecord(key)因为Google没有告诉我用户的密钥。我似乎应该使用$keyAt(recordOrIndex),然后使用$getRecord(key)$keyAt(recordOrIndex)可以正常使用索引。 $keyAt(recordOrIndex)可以使用$getRecord(key)检索到的记录正常工作。我无法让$keyAt(recordOrIndex)使用我根据Google使用$firebaseAuth返回的用户数据制作的对象。

我尝试了完整的对象(displayName,email,photoURL)和仅包含电子邮件地址的对象。后者是我更喜欢使用的。两者都没有。

app.controller('LoginModalInstanceCtrl', ['$scope', '$location', '$uibModalInstance', '$firebaseArray', '$firebaseObject', '$firebaseAuth', function($scope, $location, $uibModalInstance, $firebaseArray, $firebaseObject, $firebaseAuth) {

  // Create Firebase3 reference
  var ref = firebase.database().ref();

  // Set up Firebase Auth
  $scope.authObj = $firebaseAuth();
  var authData = $scope.authObj.$getAuth();
  $scope.authData = authData;

  // Google OAuth login handler
  $scope.loginGoogle = function() {
    $scope.authData = null;
    $scope.error = null;
    $scope.authObj.$signInWithPopup("google")
    .then(function(authData) {
      $scope.authData = authData;
      console.log(authData);
      console.log("Your displayName is:", authData.user.displayName);
      console.log("Your email is:", authData.user.email);
      console.log("Your photoURL is:", authData.user.photoURL);

      var record = {
        displayName: authData.user.displayName,
        email: authData.user.email,
        photoURL: authData.user.photoURL
      };

      var emailObject = {
        email: authData.user.email
      };

      // look up account
      var users = $firebaseArray(ref.child('users'));
      users.$loaded()
      .then(function() {
        console.log("Array loaded!");
        var key1 = users.$keyAt(1);
        console.log(key1); // -Khi6OxAo339ye6xoG3i
        var record = users.$getRecord(key1);
        console.log(record); // Object with displayName, email, and photoURL
        var key1 = users.$keyAt(record);
        console.log(key1); // -Khi6OxAo339ye6xoG3i
        var objectKey = users.$keyAt(object);
        console.log(objectKey); // null
        var emailKey = users.$keyAt(emailObject);
        console.log(emailKey); // null
      });

      $uibModalInstance.close(); // close modal window
      $location.path('/languagetwo/'); // return to the homepage
    }).catch(function(error) {
      console.error("Authentication failed:", error);
    });
  };

我应该使用$firebaseObject代替$firebaseArray

var user = $firebaseObject(ref.child('users').child( SOMETHING HERE? ));

1 个答案:

答案 0 :(得分:0)

答案似乎是否定,您无法使用AngularFire搜索Firebase数据库。 (也许AngularFire 2有搜索,我没看。)我做的是使用“普通香草”Firebase:

var users = firebase.database().ref('users');
users.orderByChild('email').equalTo(authData.user.email).once('value').then(function(snapshot) {
            console.log(snapshot.val());
});

第一行设置了Firebase ref并且与以前类似,只是我直接转到users数组,而不是使用$FirebaseArray来到users数组。

第二行是完全不同的语法。首先,您必须指定希望返回的对象所在的顺序。是的,它返回一个对象,而不是一个数组。我试过snapshot.val().length()并发现它不是一个数组。 orderByChild('email')做的是访问'email'数组中对象的'users'属性。

接下来我们进行查询。 equalTo(authData.user.email)仅返回$FirebaseAuth中电子邮件地址等于'users'数组中电子邮件地址的对象。

接下来,once('value')创建一个承诺并等待异步数据。我尝试使用on()但无法使用它,太多的论点或其他东西。 once()需要一个参数,可以是valuechild_addedchild_changedchild_removedchild_movedvalue参数用于从位置获取数据而不更改子节点。

然后我们可以设置then承诺履行。您可以调用返回的数据。这里称为snapshot

最后,snapshot.val()提供数据库中的数据,就像在Firebase控制台中一样。