Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase谷歌认证问题_Javascript_Firebase_Firebase Authentication - Fatal编程技术网

Javascript Firebase谷歌认证问题

Javascript Firebase谷歌认证问题,javascript,firebase,firebase-authentication,Javascript,Firebase,Firebase Authentication,我正在尝试在我的web应用程序中使用Google和facebook创建一个登录,其想法是使用Google或facebook登录用户,检查用户的uid是否在实时数据库中,并重定向用户 checkRegisterUser: function(user){ var register_user, register = false; app.references.user_ref.on('value', function(snapshot) { re

我正在尝试在我的web应用程序中使用Google和facebook创建一个登录,其想法是使用Google或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登录后,我发送user object函数checkRegisterUser循环用户数组,查看uid是否已在实时数据库中,如果用户uid已在实时数据库中,请将register变量更改为true并重定向,我的问题是,如果用户存在,第一次总是给我false,只有在我尝试第二次时才给我true。

由于Firebase的异步特性,我在iOS上遇到了类似的问题。这不是100%,但请尝试一下:

逻辑-此函数

app.references.user_ref.on('value', function(snapshot) {
        register_user = snapshot.val();
        console.log(register_user);
});
是异步的,所以我们不知道它何时返回值。因此,在返回此调用之前,循环无法执行。不过你要检查一下!在查询返回结果之前可能发生的寄存器。因此,由于寄存器的值尚未更新,将执行此块

其次,对所有用户进行循环以检查他们是否在数据库中是无效的,而且扩展性肯定很差。我建议您将用户的存储方式更改为这样,以便可以立即检查数据库中是否存在用户

users: {
    uid: {
        name: "Bart Simpson"
        email: "Bart@simpsons.com"
    }
    uid2: {
        ....
        ....
    }
}
此结构将允许您在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中是否存在值的更多信息