2017-11-01 1 views
0

웹 응용 프로그램에서 Google 및 Facebook으로 로그인을 만들려고합니다. 사용자가 Google 또는 Facebook으로 로그인하는 것입니다. 사용자의 uid가 실시간 데이터베이스 및 리디렉션에 있는지 확인하십시오. 사용자. i는 UID가 실시간 데이터베이스에 이미있는 경우에 사용자의 UID true에 대한 실시간 데이터베이스 변경에 이미있는 경우, 참조하는 기능 checkRegisterUser() 루프 이용자들의 어레이 오브젝트 사용자에게 보내 Google 또는 북으로 로그인 이후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 변수 및 리디렉션, 내 문제는 사용자가 존재하는 경우 항상 처음이며, 거짓을 제공하고 두 번째 시도가 실제로 적용될 때만입니다.

답변

1

Firebase의 비동기 특성으로 인해 iOS에서 비슷한 문제가 발생했습니다. 아니 100이에 %,하지만 그것을 시도 줄 :

논리 -

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

는이 값을 반환 할 때 우리가 정말 모르는 asyncronous입니다이 기능을. 따라서이 호출이 반환 될 때까지 루프를 실행할 수 없습니다. 그러나 쿼리가 결과를 반환하기 전에 발생할 수있는 if(!register)을 확인합니다. 따라서 레지스터 값이 업데이트되지 않았으므로이 블록이 실행됩니다.

둘째, 사용자가 데이터베이스에 있는지 확인하기 위해 반복적으로 실행하면 효율성이 떨어지며 잘못 조정됩니다. 사용자를 데이터베이스에 저장하는 방법을 변경하여 데이터베이스에 있는지 즉시 확인할 수 있도록하는 것이 좋습니다.

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"); 
}); 

당신은 값이 중포 기지 here에 존재하는지 확인에 대한 자세한 내용을보실 수 있습니다.

관련 문제