用户使用$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? ));
答案 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()
需要一个参数,可以是value
,child_added
,child_changed
,child_removed
或child_moved
。 value
参数用于从位置获取数据而不更改子节点。
然后我们可以设置then
承诺履行。您可以调用返回的数据。这里称为snapshot
。
最后,snapshot.val()
提供数据库中的数据,就像在Firebase控制台中一样。