2016-07-15 87 views
1

我有一個登錄系統...我試圖實現登錄/註銷功能的網站。angularjs-爲什麼http請求返回false並解決?

這是小提琴,我以下各項FIDDLE

這是我的路線文件:

(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' 
    }); 
    }]); 

})(); 

用戶將訪問登錄頁面。身份驗證後,我設置了一個會話和一個本地存儲令牌。

我使用解析來檢查用戶是否有效。我爲它定義了一個函數(就像你可以從代碼中看到的那樣)。

登錄後,我可以驗證用戶並設置會話,登錄控制器將有效用戶重定向到主頁。但用戶到達路線並且他本身停留在登錄頁面中。

我的http請求很好。我檢查了它,並返回正確的結果。但我認爲該函數返回false,並且只有http請求正在執行。因爲我可以在consoel中看到http請求並返回肯定結果,所以用戶應該導航,但不會發生這種情況,因爲http請求正在延遲或什麼。

我試着給出一個警告信息,如果沒有其他的話,它總是去其他條件,不管是什麼。

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

這是爲什麼?我對ANgular來說非常陌生。這是角度的限制嗎?

+0

評論示例。第一個錯誤是當你依賴於實際承諾的請求時,使用'if(Auth.isLogin())',而你正在爲'isLogin()'檢查寫入'if'而不是'.then()'。簡單地說 - 你在檢查登錄功能中混淆異步'$ http'請求登錄並且同步'if'。 – Appeiron

回答

3

問題是isLogin函數中沒有return語句。

你的return語句在$ http.post回調中NOT NOT LoginLog因此isLogin return undefined因此解析爲虛假。

$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

試過這個方法..不工作@Harry Lim – Annabelle

+0

你能用上面的方法更新問題或小提琴嗎?我相當肯定該方法應該邏輯明智.. –

+0

http://jsfiddle.net/pm1c3hok/檢查這個小提琴。它嘲笑登錄。點擊登錄按鈕後,用戶可以訪問關於頁面......這是邏輯..檢查控制檯。 @Harry Lim – Annabelle