代码之家  ›  专栏  ›  技术社区  ›  Adam Zerner

页面重新加载后,如何获取CurrentUser?

  •  1
  • Adam Zerner  · 技术社区  · 11 年前

    以下是我目前的做法:

    angular
      .module('mean-starter')
      .factory('Auth', function($http, $state, $window, $cookies) {
        var currentUser = {};
    
        return {
          signup: function(user) {
            return $http
              .post('/users', user)
              .then(function(data, status, headers, config) {
                angular.copy(data, currentUser);
                $cookies.put('userId', data._id);
                $window.location.href = '/';
              })
            ;
          },
          login: function(user) {
            return $http
              .post('/login', user)
              .then(function(data) {
                angular.copy(data, currentUser);
                $cookies.put('userId', data._id);
                $window.location.href = '/';
              })
            ;
          },
          logout: function() {
            $http
              .get('/logout')
              .then(function() {
                angular.copy({}, currentUser);
                $cookies.remove('userId');
                $window.location.href = '/';
              })
              .catch(function() {
                console.log('Problem logging out.');
              })
            ;
          },
          getCurrentUser: function() {
            // user is logged in
            if (currentUser._id) {
              return currentUser;
            }
            // user is logged in, but page has been refreshed and currentUser is lost
            if ($cookies.get('userId')) {
              return $http.get('/current-user')
                .then(function(data) {
                  angular.copy(data, currentUser);
                })
              ;
            }
            // user isn't logged in
            else {
              return currentUser;
            }
          },
          isLoggedIn: function() {
            return !!currentUser._id;
          }
        };
      })
    ;
    

    重新加载页面后,Auth工厂将重新运行 currentUser 已重新分配给 {} 因此,如果用户登录, 当前用户 不会反映出来。所以我要检查一下 !currentUser._id && $cookies.get('userId') 如果是,则为当前登录的用户查询数据库。

    现在我想访问 当前用户 :

    angular
      .module('mean-starter')
      .run(run)
    ;
    
    function run($rootScope, Auth, $state) {
      $rootScope.$on('$stateChangeStart', function(event, toState, toParams) {
        if (typeof toState.authenticate !== 'undefined') {
          var currentUser = Auth.getCurrentUser();
          var admin = currentUser.role === 'admin';
          var authorized = currentUser._id.toString() === toParams.id;
          if (!Auth.isLoggedIn()) {
            event.preventDefault();
            alert('Must be logged in to access this route.');
            $state.go('login');
          }
          else if (toState.authenticate.authorized) {
            if (!admin && !authorized) {
              event.preventDefault();
              alert('You are not authorized to access that route.');
            }
          }
          else if (toState.authenticate.isAdmin) {
            if (!admin) {
              event.preventDefault();
              alert('You must be an admin to access this route.');
            }
          }
        }
      });
    }
    

    问题是我不知道是否 Auth.getCurrentUser() 将返回用户或承诺。我该如何检查?这应该如何构建?

    2 回复  |  直到 11 年前
        1
  •  2
  •   logee    11 年前

    为什么不总是在你的 getCurrentUser 在…的帮助下 $q ?

    所以像这样

    getCurrentUser: function() {
            if (currentUser._id || !$cookies.get('userId')) {
              // $q.when will wrap your currentUser into a promise
              return $q.when(currentUser);
            }
    
            return $http.get('/current-user')
                .then(function(data) {
                  angular.copy(data, currentUser);
                  return currentUser;
                });
            }
          }
    

    在您的控制器中:

    Auth.getCurrentUser().then(function(currentUser) {
        // Your code
    
    })
    
        2
  •  0
  •   maschwenk    11 年前

    在这两种情况下,您都可以使用$q调整函数以返回promise。在这种情况下,所有三种逻辑路径都应该产生相同的结果,尽管它们之间有不同的操作集,因此一个承诺在这里将完美地发挥作用。特别是因为您可以对错误处理流进行非常具体的控制(如果需要)

    http://markdalgleish.com/2013/06/using-promises-in-angularjs-views/