2013-05-28 2 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

[инженер Firebase] @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

Зачем мне это нужно? Я видел несколько других ответов на аутентификацию здесь, которые не охватывают его так? Они вызывают функцию, которая обращается к авторизационному клиенту и вызывает функцию входа? – 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); 
    } 
}); 
Смежные вопросы