2016-08-25 9 views
0

私はAngularJSに苦労し、接続しているユーザー情報にアクセスします。私の目標は、接続されたユーザーの情報をサービスに保存して、アプリ全体で利用できるようにすることです。これは、私はそれを行う方法です。AngularJS:コントローラから接続されたユーザー情報にアクセスする

ログイン機能は、ログインサービスを介して公開され、そのコードは以下の通りです:

(function(){ 
var $loginService = angular.module("RockMyTask.LoginService", [ 
    "satellizer", 
    "RockMyTask.ApiService" 
]); 

/** 
* Login service 
* 
* function login(identifier, password, after) 
* Logs the given user. Global data about the user are registered in the root scope. 
* @param identifier The user's identifier (either email or password) 
* @param password The user's password 
* @param success (optional) A callback to execute when the user is successfully logged in. This callback is passed 
* the response object. 
* @param failure (optional) A callback to execute when the log in fails. This callback is passed the response 
* object. 
* 
* function restore() 
* If the user was already logged in, restore the user data in the rootScope. 
* 
* function connectedUser() 
* Return the data of the currently connected user. If the user is not connected an empty object is returned. 
* If the user data hasn't be fetched yet, then an empty object is returned and this object will be filled with 
* the user data as soon as it is received. 
*/ 
$loginService.factory("Login", ["$auth", "$rootScope", "User", 
    function($auth, $rootScope, User) { 
    var obj = {}; 
    var connectedUser = {}; 

    obj.logout = function() { 
     $auth.logout(); 
     //Authorization.clear(); 
     connectedUser = null; 
    }; 

    obj.login = function(identifier, password, success, failure) { 
     var credentials = { 
      user_identifier: identifier, 
      password: password 
     }; 

     $auth.login(credentials).then(function(auth_response) { 
      // fetch user data (with both spectator and rockstar flags set to true) 
      User.me(true, true).then(function(response) { 
       connectedUser = response.data; 
       //TODO add check for DEBUG_MODE 
       console.log("Received connected user data and stored it in connectedUser var"); 
      }, function() { 
       connectedUser = {}; 
      }); 

      // execute provided success callback 
      if (_.isFunction(success)) { 
       success(auth_response); 
      } 
     }, function(response) { 
      connectedUser = null; 

      // execute provided failure callback 
      if (_.isFunction(failure)) { 
       failure(response); 
      } 
     }); 
    }; 

    obj.restore = function() { 
     if ($auth.isAuthenticated()) { 
      User.me(true, true).then(function(response) { 
       connectedUser = response.data; 
      }, function() { 
       connectedUser = null; 
      }); 
     } else { 
      connectedUser = null; 
     } 
    }; 

    obj.getConnectedUser = function(){ 
     if($auth.isAuthenticated && !connectedUser){ 
      User.me(true, true).then(function(response) { 
       connectedUser = response.data; 
      }, function() { 
       connectedUser = null; 
      }); 
     } 
     return connectedUser; 
    }; 

    obj.updateUserInfo = function(user){ 
     connectedUser = user; 
    }; 

    obj.isConnectedUserRockstar = function(){ 
     return connectedUser.rocker != null; 
    }; 
    obj.isConnectedUserSpectator = function(){ 
     return connectedUser.spectator != null; 
    }; 

    return obj; 
}]); 
})(); 

あなたがログインに成功すると、コード内で観察することができるように、私は打ち上げHTTPリクエスト(User.me(true, ture))は、返されたデータ(接続されたユーザに関する情報を表す)をサービスのアドホック変数connectedUserに格納します。ユーザーがある場合

obj.getConnectedUser = function(){ 
     if($auth.isAuthenticated && !connectedUser){ 
      User.me(true, true).then(function(response) { 
       connectedUser = response.data; 
      }, function() { 
       connectedUser = null; 
      }); 
     } 
     return connectedUser; 
    }; 

この機能をチェック:

アプリケーションの任意のポイントから接続されたユーザー情報にアクセスするには、私がログインサービスで機能を実装しましたが、そのコードをここに報告されgetConnectedUserと呼ば実際に認証され、変数connectedUsersがすでに正しく設定されている場合は、HTTP関数を再度トリガーしてデータを取得します(それ以外の場合は単にconnectedUser varを返します)。

私の問題は次のとおりです。ログインに成功した後、ユーザーをリダイレクトするページは、ログインサービスに合格したコントローラを使用します。コントローラは、接続されたユーザー情報を取得しようとしますが、結果はNULLポインタです。私は何を間違えているのですか?

コントローラ内のコード(だけでも非常に単純な場合場合):私は、HTTPリクエストが成功し、返されたデータを持っていることがわかりブラウザでコンソールを見ると

$scope.user = Login.getConnectedUser(); 

EDIT 1 次のとおりです。私は、コントローラに$scope.userの変数にアクセスしようとすると

先に述べたように
{"id":3,"email":"[email protected]","name":"Michele","surname":"Imperiali","locale":"it_IT","picture":"https:\/\/storage.rockmytask.it\/users\/profile_image\/3.jpeg","birthday":"1982-06-23","gender":"M","country":"IT","province":"Lombardia","city":"Milano","zip":"20100","street":"190 Grover Expressway","mobile_phone":"(437)924-8282","home_phone":"239-250-3166x783","username":"spectator","validated":true,"timezone":"Europe\/Rome","created_at":"2016-04-01T12:50:53+0000","rocker":null,"spectator":{"description":"I need help with my garden !"}} 

は、私は、nullポインタ例外を取得します。

+0

consol.loggingで 'User.me(true、ture)'に正しいデータがあることを確認できますか? –

+0

@JahongirRahmonovはいできます。質問に詳細を追加しました – miks87

+0

フルログインサービスコードを投稿できますか? –

答えて

-1

私はあなたがconnectedUserをnullに設定されている理由がある問題が

, function() { 
      connectedUser = null; 
     } 

としなければならないと思いますか?あなたはこれをnullに設定したいので、理由がある場合は、バックエンドのか悪いのリターンからのエラーを取得するならば、やって:

obj.getConnectedUser = function(){ 
    if($auth.isAuthenticated && !connectedUser){ 
     User.me(true, true).then(function(response) { 
      connectedUser = response.data; 
     }, function(error) { 
      connectedUser = null; 
     }); 
    } 
    return connectedUser; 
}; 

を、これはのみ、あなたが悪いの応答を取得する場合nullにCONNECTUSERを設定しますconnectUserは常にnullに設定され、nullポインタを説明しているように見えます。

+0

ありがとうございましたJeffreyですが、私はあなたの解決策は良いとは思いません。 'then'関数の表記法は、成功と失敗の2つの関数を定義することです。第2のパラメータである私の機能は、HTTP要求が失敗した場合にのみトリガされます。実際には、私が 'connectedUser = null'ボディにコメントしても、問題はまだ同じです... – miks87

+1

申し訳ありませんが、私はまだコメントするほどの評判はありませんでした。私の他の思想は、関数内で約束を待つのではなく、実際に約束を返さなければならないということです。したがって、この関数はhttp要求を返します。コントローラでLogin.getConnectedUser()を実行してから、(function(response){$ scope.user = response.data}); –

+0

ちょっとジェフリー、そうですね。あなたが言ったように、私はそのサービスをそのサービスで実行し、接続されたユーザー情報をそこに格納し、アプリケーションの他の部分からの後続の要求に利用できるようにしたいからです。しかしあなたのコメントは正しい方向に私を指摘しました。私はすぐに私のソリューションを掲載するつもりです。 乾杯! – miks87

関連する問題