我正在尝试使用Google和Facebook在我的网络应用程序中创建登录,想法是通过谷歌或Facebook登录用户,检查用户的uid是否在实时数据库上并重定向用户。 / p>
checkRegisterUser: function(user){
var register_user,
register = false;
app.references.user_ref.on('value', function(snapshot) {
register_user = snapshot.val();
console.log(register_user);
});
$.each(register_user, function(index, val){
if(user.uid === index){
register = true;
return;
}
})
console.log(register);
if(!register){
firebase.auth().signOut();
$('#login').modal('hide');
$('#modal_register').modal('show');
return false;
}
$(window).attr('location', app.urlGallery());
}
google_login: function(){
var provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(provider).then(function(result) {
// This gives you a Google Access Token. You can use it to access the Google API.
var token = result.credential.accessToken;
// The signed-in user info.
var user = result.user;
app.checkRegisterUser(user);
// firebase.auth().signInWithRedirect(provider);
}).catch(function(error) {
console.log(error);
});
},
使用google或facebook登录后我发送用户对象函数checkRegisterUser()
循环用户数组以查看uid是否已经在实时数据库中,如果用户uid已经在实时数据库中更改为{ {1}} true
变量和重定向,我的问题是,如果用户存在,第一次给我假,只有当我第二次尝试给出时才会给出。
答案 0 :(得分:1)
由于Firebase的异常特性,我在iOS上遇到了类似的问题。不是100%,但尝试一下:
逻辑 - 此功能
app.references.user_ref.on('value', function(snapshot) {
register_user = snapshot.val();
console.log(register_user);
});
是异步的,所以我们不知道什么时候会返回一个值。因此,在返回此调用之前,循环无法执行。但是,检查if(!register)
在查询返回结果之前可能发生的情况。因此,由于寄存器的值尚未更新,因此将执行该块。
其次,遍历所有用户以检查他们是否在数据库中并不是很有效,而且肯定会很差。我建议您更改将用户存储为此类的方式,以便立即检查它们是否存在于数据库中。
users: {
uid: {
name: "Bart Simpson"
email: "Bart@simpsons.com"
}
uid2: {
....
....
}
}
此结构允许您使用if snapshot.exists()
。这将立即告诉您用户是否在数据库中,并允许您相应地执行所需的操作。
使用上述结构,您的查询将如下所示。
var userUID = uid;
var ref = new Firebase('https://SampleChat.firebaseIO-demo.com/users/' + userUID);
ref.on('value', function(snapshot) {
if (snapshot.exists())
alert ("exist");
else
alert ("not exist");
});
您可以阅读有关检查Firebase here中是否存在值的详情。