2017-11-01 14 views
0

ウェブアプリケーションでGoogleとFacebookのログインを作成しようとしていますが、そのアイデアはグーグルやFacebookのユーザーでログインしているかどうか、ユーザーのuidがリアルタイムデータベースとリダイレクトユーザー。 iはユーザUIDがtrueにリアルタイムデータベース変化に既にある場合、ユーザは、UIDがリアルタイムデータベースに既に存在するかどうかを確認する機能をcheckRegisterUser()ループユーザのアレイオブジェクト送信GoogleやfacebookでFirebase Google Authの問題

ログイン後
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); 
     }); 

    }, 

register変数とリダイレクト、私の問題は、ユーザーが存在する場合は常に私が虚偽を与えると、最初の時間は本当に2番目の時間を試してみてください。

答えて

1

Firebaseの非同期性のため、私はiOSで同様の問題に直面しました。ない100本の%が、それを試してみる:

ロジック - この関数

app.references.user_ref.on('value', function(snapshot) { 
     register_user = snapshot.val(); 
     console.log(register_user); 
}); 

は、それが値を返すときに私たちは本当に知らないasyncronousです。したがって、この呼び出しが返されるまでループは実行できません。しかし、if(!register)をチェックすると、クエリが結果を返す前に発生する可能性があります。したがって、レジスタの値は更新されていないので、このブロックは実行されます。

第2に、すべてのユーザーがデータベースに含まれているかどうかを確認するためにルーピングを実行しても効率的ではなく、スケーリングが不十分です。私はこのようなものにあなたのユーザーをどのように格納するかを変更することをお勧めします。そうすれば、それらがデータベースに存在するかどうかすぐに確認できます。

users: { 
    uid: { 
     name: "Bart Simpson" 
     email: "[email protected]" 
    } 
    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に存在するかどうかを確認することができます。