2016-07-15 4 views
1

私はログインシステムを持っています...私はウェブサイトにログイン/ログアウト機能を実装しようとしています。angularjs- HTTPリクエストが解決でfalseを返すのはなぜですか?

(function() { 
    var onlyLoggedIn = function($location, $q, AuthService2) { 
    var deferred = $q.defer(); 

    if (AuthService2.isLogin()) { 
     deferred.resolve(); 
    } else { 
     deferred.reject(); 
     $location.url('/login'); 
    } 
    return deferred.promise; 
    }; 

    angular.module('myApp', [ 
     'ngRoute', 
     'myApp.login', 
     'myApp.home', 
     'myApp.logout', 
     'myApp.notifications' 
    ]) 
    .factory('AuthService2', ["$http", "$location", function($http, $location) { 
     //var vm = this; 
     var baseUrl = 'api/'; 

     return { 

     isLogin: function() { 
      var token; 
      if (localStorage['entrp_token']) { 
      token = JSON.parse(localStorage['entrp_token']); 
      } else { 
      token = ""; 
      } 
      var data = { 
      token: token 
      }; 
      $http.post(baseUrl + 'validateUserToken', data).success(function(response) { 
      if (response.msg == "authorized") { 
       //console.log(response.msg); 
       return localStorage.isLogged === "true"; 
      } else { 
       return localStorage.isLogged === "false"; 
      } 
      }); 
     } 
     } 
     return { 
     isLogin: isLogin 
     }; 
    }]) 

    .config(['$routeProvider', function($routeProvider) { 
    $routeProvider 
     .when('/login', { 
     controller: 'LoginController', 
     templateUrl: 'app/components/login/loginView.html', 
     controllerAs: 'vm' 
     }) 
     .when('/home', { 
     controller: 'HomeController', 
     templateUrl: 'app/components/home/homeView.html', 
     resolve: { 
      loggedIn: onlyLoggedIn 
     }, 
     controllerAs: 'vm' 
     }) 
     .when('/logout', { 
     controller: 'LogoutController', 
     templateUrl: 'app/components/login/loginView.html', 
     resolve: { 
      loggedIn: onlyLoggedIn 
     }, 
     controllerAs: 'vm' 
     }) 
     .when('/notifications', { 
     controller: 'NotificationsController', 
     templateUrl: 'app/components/notifications/notificationsView.html', 
     resolve: { 
      loggedIn: onlyLoggedIn 
     }, 
     controllerAs: 'vm' 
     }) 

    .otherwise({ 
     redirectTo: '/login' 
    }); 
    }]); 

})(); 

ユーザーがログインページを訪問されます。

これは私がfollowing- FIDDLE

よこれは私のルートファイルであるフィドルです。認証後、セッションとローカルストレージトークンを設定します。

私は、ユーザーが有効かどうかを確認するために解決方法を使用します。私はそのための関数を定義しました(コードから見ることができます)。

ログイン時に、ユーザーを確認してセッションを設定し、ログインコントローラが有効なユーザーを自宅にリダイレクトすることができます。しかし、ユーザーはルートに到達し、ログインページ自体にとどまります。

httpリクエストは正常です。私はそれをチェックし、正しい結果を返します。しかし、私は関数がfalseを返し、httpリクエストだけが実行されていると思います。コンソーゼルでhttpリクエストを見ることができ、肯定的な結果を返すので、ユーザーはナビゲートする必要がありますが、httpリクエストが遅れているなど何も起こっていません。

私はこの中に警告メッセージを出そうとしましたが、それはいつも他の状態になります。

if (AuthService2.isLogin()) { 
     deferred.resolve(); 
    } else { 
     deferred.reject(); 
     $location.url('/login'); 
    } 

なぜですか?私はANgularをかなり新しくしています。これは角度の制限ですか?

+0

レビュー例最初の間違いは、実際に約束しているリクエストに頼っているときに 'if(Auth.isLogin())'を使っていて、 'isLogin()'のチェックのために '.then()'の代わりに 'if'を書いています。単純に - チェックログイン機能で同期 'if'を使って非同期の' $ http'ログイン要求を混乱させました。 – Appeiron

答えて

3

問題は、isLogin関数にreturn文がないことです。

return文は$ http.postコールバックの中にあります。not isLoginしたがって、isLoginはundefinedを返します。したがって、falsyに解決されます。

$http.post(baseUrl + 'validateUserToken', data).success(function(response) { 
     //Notice that you are inside function(response) closure. 
     if (response.msg == "authorized") { 
      return localStorage.isLogged === "true"; 
     } else { 
      return localStorage.isLogged === "false"; 
     } 
     }); 

私は返すようにあなたをお勧めすることができます$ http.post代わりに、$ http.post以下、このような方法で使用することができます約束オブジェクトを返す、あなたがそれを行うことができますどのように簡単な例です。

isLogin: function() { 
     //Omitted some code 
     //This method return a promise object 
     return $http.post(baseUrl + 'validateUserToken', data); 
     }); 


AuthService2.isLogin().then(function(res){ 
    if (response.msg == "authorized") { 
     deferred.resolve(); 
    } else { 
     deferred.reject(); 
     $location.url('/login'); 
    } 
}, errorCallback); //Optional if you want to handle when post request failed 

コードはテストされていません。ちょうどあなたにアイデアを与えます。

+0

このメソッドを試してみました。ハリー・リムを働かせません – Annabelle

+0

上記の方法で質問やフィドルを更新できますか?私はかなり方法が論理的に働かなければならないと確信しています。 –

+0

http://jsfiddle.net/pm1c3hok/このフィドルをチェックしてください。それはログインをモックする。ログインボタンをクリックすると、ユーザーはpage.toatというロジックをチェックすることができます。 @ハリー・リム – Annabelle

関連する問題