AngularJS-在应用程序启动前处理路由

AngularJS - handle routes before app startup

本文关键字:前处理 路由 启动 应用程序 AngularJS-      更新时间:2023-09-26

为此目的,可以在$stateProvider中使用服务吗?

我在stack上看过很多关于路由的帖子,但大多数都让初学者感到困惑,因为每个人都使用不同的方法,并将其视为火箭科学。我想从一开始就养成好习惯,避免坏习惯。。。

目标:在应用程序启动之前运行一些函数,并基于该输出路由作为最终用户。

我尝试过的:

实施服务>>AuthService|操作>>简单检查:

  1. 从客户端(SQLite DB)获取JWT令牌-令牌包含基本细节+API密钥
  2. 发送到服务器进行身份验证
  3. 响应(布尔值)
  4. 如果授权>>加载主视图。否则,重定向到注册View
  5. 服务器端验证在加载任何视图之前进行

服务提供商

myApp.factory('AuthService', function ( Session) {
         var authService = {};
          authService.isAuthorized = function(){
          return Session.authorized() ;
         };
        return authService;
 });

myApp.service('Session', function ($resource, $q, $timeout, URL_Config) {
  this.authorized = function () {
        var deferred = $q.defer();
        $timeout(function () {
            var db = window.openDatabase("config.db", "1.0", "Config", 2 * 1024 * 1024);
            db.transaction(function (tx) {
                tx.executeSql("SELECT * FROM user_details", [], function (tx, data) {
                    var token = data.rows.item(0).token;
                    var request = $resource(URL_Config.BASE_URL + '/authCheck', {token: token },
                        { query: {
                            isArray: false,
                            method: 'GET'
                        } });
                    request.query(function (res) {
                        if (res.error) {
                            deferred.resolve(false);
                        } else {
                            deferred.resolve(true);
                        }
                    });
                }, function (e) {
                    deferred.resolve(false);
                });
            });
        }, 500);
        return deferred.promise;
    };
 return this;
 });

路线配置

这是我正在挣扎的部分。在哪里以及如何注入此服务?我让它工作,但我不确定这是否是正确的处理方式。

  • 调用$stateProvider的Resolve属性内的服务
  • 基于AuthService的值重定向到视图
  • 在应用程序启动之前进行处理

myApp.config(function($stateProvider, $urlRouterProvider ) {
   $urlRouterProvider.otherwise('/home');
   $stateProvider
    .state('home', {
        url: '/home',
        templateUrl: 'templates/home.html',
        controller: 'MainController',
        resolve: ['AuthService', function(AuthService, $location, $q){
            var deferred = $q.defer();
            var authChk = AuthService.isAuthorized(); 
            authChk.then(function(data){
                if(!data){
                    $location.path('/register'); 
                    deferred.resolve();
                } else{
                    $location.path('/home');
                    deferred.resolve();
                }
            }, function(e){
                $location.path('/register');
                deferred.resolve();
            });
            return deferred.promise;
        }]
    })
    .state('register', {
        url: '/register',
        templateUrl: 'templates/register.html',
        controller  : 'RegisterController',
        resolve: ['AuthService', function(AuthService, $location, $q){
            var deferred = $q.defer();
            var authChk = AuthService.isAuthorized();
            authChk.then(function(data){
                if(!data){
                    $location.path('/register');
                    deferred.resolve();
                } else{
                    $location.path('/home');
                    deferred.resolve();
                }
            }, function(e){
                $location.path('/register');
                deferred.resolve();
            });
            return deferred.promise;
        }]
    })
});

这是运行此类身份验证的合适位置吗?

这是一个简单的Hello World演示,让我开始使用Angular。我没有导航(多个视图),所以检查应该是直接的。

我看到过许多使用locationChangeStart在加载视图之前激发服务的例子。然后在处理会话时使用$scope.watch$broadcast(同样不是这种情况),但可能对将来的使用有用。

谢谢。欢迎就如何以及在哪里处理这种情况提出任何建议。

这实际上也是我必须做的事情。您可以在每个状态上使用resolve

在下面的代码中,我有一个resolveUserAuth函数,它将返回用户对象。

 var resolveUserAuth = {
    'userAuth': function (AuthService, $rootScope) {
      if ($rootScope.user) {
        return $rootScope.user;
      } else {
        return myApp._getUserAuth(AuthService, $rootScope);
      }
    }
  };
  $stateProvider
    .state('login', {
      url: '/login',
      templateUrl: 'views/login.html',
      controller: 'LoginCtrl'
    })
    .state('logout', {
      url: '/logout',
      templateUrl: 'views/login.html',
      controller: 'LoginCtrl'
    })
    .state('home', {
      url: '/home',
      templateUrl: 'views/home.html',
      controller: 'HomeCtrl',
      resolve: resolveUserAuth
    })

getUserAuth

myApp._getUserAuth = function (service, rootScope) {
  return service.getRole().then(function () {
    service.getUser().then(function (user) {
      rootScope.user = user;
    });
  });
};

登录

 service.login = function (data) {
    var promise = $http.post('/auth/login', data).then(function (response) { // Success
      $rootScope.user = response.data;
      AssignedService.get({},
        function(assigned) {
          $rootScope.assigned = assigned;
          $rootScope.showLogin = false;
        }, function(error) {
          if (console && console.error) {
            console.error('Error getting assigned: ', error);
          }
        }
      );
      return response;
    }, function() { // Error
      $rootScope.showAlert('Unable to login, please try again', 'danger');
    });
    return promise;
  };