2017-05-10 7 views
0

私の研究の一部として、firebaseリアルタイムデータベースで作業するweb-app(javasript言語)を開発する必要があります。はfirebaseのリアルタイムデータベースと正確に同期します

現在データベースには、システムに登録したすべてのユーザーを表すユーザーオブジェクトのツリーがあります。私がやろうとしているのは、単純なユーザログイン機能です。

ユーザーがユーザー名とパスワードを入力した後、データベースからユーザーツリー全体を入力するための配列を作成しました。問題は、Firebaseから関数を呼び出すと、終了するには不十分で、配列が空のままで、ユーザーがシステムに登録されていることを確認できないということです。 今私はsetTimeout関数を使っているImという一時的な解決法を使っていますが、これはプログラミングが間違っていることを理解していますし、システムにログインするたびに2秒待つ必要もありません。

誰かお手伝いできますか?どのようにsetTimeout関数なしでそれを行うには? Firebaseの機能が終了するようにしたいのですが、認証プロセスから始めるだけです。ここで

は、私がこれまでに書いたコードであり、

 var correntUser; 
     var userlist = []; 
     var usersRef = database.ref('users'); 

     // Query that inserts all users keys and names to an array. 

     usersRef.orderByChild("username").on("child_added", function(snapshot) 
     { 
      userlist.push({userKey:snapshot.key,username:snapshot.val().username,password:snapshot.val().password}); 
     }); 

     setTimeout(function() 
     { 
      //check if user exist in userlist. 
      for(var i=0; i<userlist.length;i++)   
       if (userlist[i].username == usernameArg && userlist[i].password == passwordArg) 
        correntUser = userlist[i].userKey; 

      if(correntUser == undefined)    
      { 
       //check if undefined 
       alert("wrong username or password"); 
       document.getElementById("username").value = ""; 
       document.getElementById("password").value = ""; 
       return; 
      } 
      mainPage.addHeader(); 
     },2000); 

はあなたのすべてに感謝します。

答えて

1

Firebaseがbuilt-in authenticationを提供しているときに、手動ですべてのユーザーをチェックして、ログイン資格情報の試行と一致するかどうかを確認する必要はありません。パスワードベースのアカウントには電子メールアドレスが必要ですが、ユーザ名と任意のドメイン名を組み合わせて、その要件を満たすことができますas suggested here

あなたのデータベース構造がusersパスの下にどのように見えるかを説明していませんでしたが、それを処理するための一つの方法は、createUserWithEmailAndPasswordパスワードの一部として返されたuser's unique idを組み込むことである。

function createAccount(email, password) { 
    firebase.auth().createUserWithEmailAndPassword(email, password) 
    .then(function(userData) { 
     // account created successfully 
     usersRef.child(userData.uid).set({ 
      email: email, 
      creation_date: new Date(), 
      ... 
     }) 
    } 
    .catch(function(error) { 
     ... 
    }) 
} 

次にログインのため試行回数:

function login(email, password) { 
    firebase.auth().signInWithEmailAndPassword(email, password) 
    .then(function(userData) { 
     // login successful 
     mainPage.addHeader(); 
    }) 
    .catch(function(error) { 
     alert("wrong username or password"); 
     document.getElementById("username").value = ""; 
     document.getElementById("password").value = ""; 
    }) 
} 
関連する問題