使用解析和 http.get 请求对用户进行角度验证

Angularness authenticating user with resolve and http.get request

现在我有一个简单的 angular 设置,其中包含登录状态和云状态。我想做到这一点,如果用户通过身份验证,云状态只能是 运行。如果没有,它将引导他们进入登录状态。

到目前为止,我相信我已经设置了 "resolve" 并且我设置了 .run() 函数以在解析失败时重定向到登录状态。

我唯一的问题是,无论如何,我的 authenticated 变量 get 返回时未定义。我不确定如何合并 $http.get.

我是 angular 的新手,所以如果有人有任何建议,我将不胜感激。

var routerApp = angular.module('app', ['ui.router'])

 .factory('Auth', function($http, $state, $q) {

    var factory = { isLoggedIn: isLoggedIn };
    return factory;

    function isLoggedIn() {
        $http.get('/auth/user').then(function(data) {
            return true;
        });
    }

})

.config(function($stateProvider, $urlRouterProvider, $locationProvider) {

    $locationProvider.html5Mode(true);
    $urlRouterProvider.otherwise('/cloud');

    var authenticated = ['$q', 'Auth', function ($q, Auth) { 
        var deferred = $q.defer();
        if(Auth.isLoggedIn()) deferred.resolve(); else deferred.reject();
        return deferred.promise;
    }];

    var authGuest = function($state, Auth) {
        if(Auth.isLoggedIn()) $state.transitionTo('cloud');
    }

    $stateProvider

        .state('login', {
            url: '/login',
            templateUrl: "pages/templates/login.html",
            onEnter: authGuest
        })

        .state('cloud', {
            url: '/cloud',
            templateUrl: "pages/templates/account.html",
            resolve: { authenticated: authenticated }
        })

})
.run(function ($rootScope, $state, $log) {
    $rootScope.$on('$stateChangeError', function () {
        $state.go('login');
    });
});

首先服务方法应该 return 来自 isLoggedIn 的承诺,其他方法应该使用该承诺来解决它。那么你不需要在 if 中使用 use Auth.isLoggedIn() 因为无论如何它都会 return 一个 catch, then & [=17 的承诺=] 在里面。

function isLoggedIn() {
    retutn $http.get('/auth/user');
}

然后这些方法将使用 promise

解决
var authenticated = ['$q', 'Auth', function ($q, Auth) { 
    var deferred = $q.defer();
    Auth.isLoggedIn().then(function(){
        deferred.resolve();
    }, function(error){
        deferred.reject();
    });
    return deferred.promise;
}];

var authGuest = function($state, Auth) {
    Auth.isLoggedIn().then(function(){
       $state.transitionTo('cloud');
    }) 
}