2013-05-28 52 views
0

下面是示例代碼,我與玩弄:firebase簡單認證authClient爲空?

var myRootRef = new Firebase('https://url.firebaseIO.com/'); 

var authClient = new FirebaseAuthClient(myRootRef, function(error, user) { 
    if (error) { 
     // an error occurred while attempting login 
     console.log(error); 
    } else if (user) { 
     // user authenticated with Firebase 
     console.log('User ID: ' + user.id + ', Provider: ' + user.provider); 
    } else { 
     // user is logged out 

     console.log('logged out!'); 
     login(); 
    } 
}); 


function login(){ 
    var email = "[email protected]"; 
    var password = "123"; 

    authClient.login('password', { 
     email: email, 
     password: password, 
     rememberMe: true 
    }); 
} 

我得到的回覆是錯誤:無法調用未定義

方法「登錄」

authClient似乎總是空?我究竟做錯了什麼?

+0

[工程師在火力地堡] @Kato是正確的,這是因爲第一個回調你獲取(針對註銷狀態)正在同步調用。我將改變這種行爲,以便異步調用,這應該解決您遇到的問題,儘管此處提出的所有其他解決方案都是正確的。 –

回答

2

這裏authClient看起來不錯。我認爲問題與登錄()function.Try範圍本

var myRootRef = new Firebase('https://url.firebaseIO.com/'); 
    var authClient = new FirebaseAuthClient(myRootRef, function(error, user) { 
     if (error) { 
      // an error occurred while attempting login 
      console.log(error); 
     } else if (user) { 
      // user authenticated with Firebase 
      console.log('User ID: ' + user.id + ', Provider: ' + user.provider); 
     } else { 
      // user is logged out 

      console.log('logged out!'); 

     var email = "[email protected]"; 
     var password = "123"; 

     this.login('password', { 
      email: email, 
      password: password, 
      rememberMe: true 
     }); 
     } 
    }); 
+0

爲什麼我需要這樣的範圍?我在這裏看到過其他一些認證答案,不會像這樣做的範圍?他們調用訪問auth客戶端並調用登錄函數的函數? – TriFu

+0

就像這個例子一樣,它顯示了我如何完成它的範圍,但它似乎適用於其他人? http://stackoverflow.com/questions/15167981/how-do-i-use-firebase-simple-login-with-email-password?rq=1 – TriFu

+0

@TriFu建立在我的答案下面,這個例子的原因你這裏列出的工作是因爲''authClient.login'不被調用,直到點擊一個按鈕,允許分配的時間。 – Kato

1

當您最初調用new FirebaseAuthClient,它會調用回調與當前登錄狀態(用戶已經可以登錄,例如,當這被調用時)。此回調發生在new FirebaseAuthClient返回之前,這意味着尚未分配authClient

你不需要在回調中移動你的authClient.login,雖然這工作正常。您只需要注意第一次發出回調的事實可能在分配之前。

你可以,例如,使用一個setTimeout在你的電話,以確保該變量設置第一:

var authClient = new FirebaseAuthClient(myRootRef, function(error, user) { 
    if (error) { 
     // an error occurred while attempting login 
     console.log(error); 
    } else if (user) { 
     // user authenticated with Firebase 
     console.log('User ID: ' + user.id + ', Provider: ' + user.provider); 
    } else { 
     // user is logged out 
     console.log('not logged in yet or logged out again!'); 
     setTimeout(login, 1); 
    } 
});