0

Firebase と Twitter でユーザー認証を設定しようとしています。この回答のコードは、ある程度機能します。

var url = 'https://molovo-comments.firebaseio.com/';
var myDataRef = new Firebase(url);

var dataStore = (function(){
  var user = null;

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

  return {
    getAuth : function() {
      if (auth) return auth;
        // else show some error that it isn't loaded yet;
    },
    getUser : function() {
      if (user) return user;
        // else show some error that it isn't loaded yet;
    }
  };
})();

を使用して auth 変数にアクセスでき、dataStore.getAuth()user.id がコンソールに記録されます。呼び出しdataStore.getAuth().login('twitter')も機能し、Twitter のログイン ページにリダイレクトされます。

しかし、を使用して外部からユーザー ID を返そうとするとdataStore.getUser().idcannot read property 'id' of undefinedエラーが発生します。

私はおそらくuser間違った方法で戻ってきていると思うので、誰かがこの問題に光を当てることができれば、とても感謝しています.

更新: @BenjaminWarren と @SpinyNorman からの回答のおかげで、次のように正しい変数を使用するようにコードを更新しました。

var dataStore = (function(){
  var userObj = null;

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

  return {
    getUser : function() {
      if (userObj) return userObj;
      // else show some error that it isn't loaded yet;
    },
    getAuth : function() {
      if (auth) return auth;
      // else show some error that it isn't loaded yet;
    }
  }
})();

jQuery(document).ready(function($) {
  console.log(dataStore.getUser().id);
});

コンソール出力は次のようになります。

Uncaught TypeError: Cannot read property 'id' of undefined main.js:37
User ID: 222936694, Provider: twitter main.js:14

dataStore.getUser().id認証オブジェクトが返される前にログに記録されているため、未定義です。getUser() リターンでさまざまな setTimout 値などを試しましたが、常に前に返されますauth

乾杯、

ジェームズ

4

2 に答える 2

0

user変数が更新されないため、現在のコードではユーザー ID がまったくログに記録されないように思えます。それは として始まり、決して到達できない でnullのみ設定されます。(...) if(user) { user = data }代わりに次のように言うべきだと思います} else if (data) {

var url = 'https://molovo-comments.firebaseio.com/';
var myDataRef = new Firebase(url);

var dataStore = (function(){
  var user = null;

  var auth = new FirebaseSimpleLogin(myDataRef, function(error, data) {
    if (error) {
      // an error occurred while attempting login
      console.log(error);
    } else if (data) {
      // user authenticated with Firebase
      user = data;          
      console.log('User ID: ' + user.id + ', Provider: ' + user.provider);
    } else {
      // user is logged out
      console.log('Not logged in.');
      user = {id: null}; // for example.
    }
  });

  return {
    getAuth : function() {
      if (auth) return auth;
        // else show some error that it isn't loaded yet;
    },
    getUser : function() {
      if (user) return user;
        // else show some error that it isn't loaded yet;
    }
  };
})();

編集: Benjamin Warren が指摘したように、これはおそらく、以前に定義された変数との衝突を避けるために、関数の引数の名前を からuserに変更したことが原因です。パラメータ名を からに変更した後、ログ機能が機能しなくなったと想定しています。datauseruserdata

于 2013-10-23T09:26:01.700 に答える