我正在尝试使用Google和Facebook在我的网络应用程序中创建登录,想法是使用谷歌或Facebook登录用户,检查用户的uid是否在实时数据库上并重定向用户 .
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已经在实时数据库中更改为 true
register
变量并重定向,我的问题是,如果用户存在,第一次给我假,只有当我第二次尝试给予真实时 .
1 回答
由于Firebase的异步特性,我在iOS上遇到了类似的问题 . 不是100%,但尝试一下:
逻辑 - 此功能
是异步的,所以我们不要执行,直到返回此调用 . 但是,请检查
if(!register)
,这可能在查询返回结果之前发生 . 因此,由于寄存器的值尚未更新,因此将执行该块 .其次,循环遍历所有用户以检查它们是否在数据库中是不高效的,当然也很难扩展 . 我建议您更改将用户存储为此类的方式,以便立即检查数据库中是否存在这些用户 .
此结构将允许您使用
if snapshot.exists()
. 这将立即告诉您用户是否在数据库中,并允许您相应地执行所需的操作 .使用上面的结构,您的查询将如下所示 .
您可以阅读有关检查Firebase here中是否存在值的详细信息 .