【发布时间】:2016-07-15 08:58:53
【问题描述】:
我有一个登录系统...我正在尝试对网站实施登录/注销功能。
这是我关注的小提琴-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'
});
}]);
})();
用户将访问登录页面。身份验证后,我设置了一个会话和一个本地存储令牌。
我使用 resolve 来检查用户是否有效。我为此定义了一个函数(您可以从代码中看到)。
登录后,我可以验证用户并设置会话,登录控制器将有效用户重定向到主页。但是用户到达了路线,他停留在登录页面本身。
我的 http 请求很好。我检查了它,它返回正确的结果。但我认为该函数返回 false 之后只有 http 请求被执行。因为我可以在 consoel 中看到 http 请求并返回肯定的结果,所以用户应该得到导航但它没有发生,因为 http 请求被延迟或其他原因。
我尝试在 if else 中发出警告消息,无论如何它总是进入 else 条件。
if (AuthService2.isLogin()) {
deferred.resolve();
} else {
deferred.reject();
$location.url('/login');
}
为什么会这样?我对 Angular 很陌生。这是角度的限制吗?
【问题讨论】:
-
已审查示例。第一个错误是使用
if (Auth.isLogin()),当您依赖实际上是承诺的请求并且您正在编写if而不是.then()来检查isLogin()。简单地说 - 你在检查登录功能中用同步if弄乱了异步$http登录请求。