私はログインシステムを持っています...私はウェブサイトにログイン/ログアウト機能を実装しようとしています。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をかなり新しくしています。これは角度の制限ですか?
レビュー例最初の間違いは、実際に約束しているリクエストに頼っているときに 'if(Auth.isLogin())'を使っていて、 'isLogin()'のチェックのために '.then()'の代わりに 'if'を書いています。単純に - チェックログイン機能で同期 'if'を使って非同期の' $ http'ログイン要求を混乱させました。 – Appeiron