AngularJs 身份验证服务行为奇怪

AngularJs auth service behaves strangely

本文关键字:服务行 身份验证 AngularJs      更新时间:2023-09-26

更新:JS中的代码

我从angular-app借用了身份验证(会话)服务,并对其进行了强烈修改:

  angular.module('auth', [])
    .factory('session', ['$location', '$http', '$q', ($location, $http, $q) ->
      service =
        requestCurrentUser: ->
          if service.isAuthenticated()
            $q.when service.currentUser
          else
            $http.get('/user').then (response) ->
              console.log(response.data)
              service.currentUser = response.data
              service.currentUser
        currentUser: null
        isAuthenticated: ->
          not service.currentUser?
      service
    ])

这是一个应用程序:

  BookReader = angular.module('BookReader', ['ngRoute', 'home', 'main', 'books', 'auth'])
  BookReader
    .config(['$routeProvider', '$httpProvider', '$locationProvider', ($routeProvider, $httpProvider, $locationProvider) ->
      $routeProvider
        .when '/',
          templateUrl: 'assets/tour.html'
          controller: 'MainCtrl'
        .when '/home',
          templateUrl: 'assets/main.html'
          controller: 'HomeCtrl'
        .when '/books',
          templateUrl: 'assets/books.html'
          controller: 'BooksCtrl'
    ])
    .run(['session', (session) ->
      session.requestCurrentUser()
    ])

所以,我想,当应用程序启动时,请求当前用户(也许控制器在请求回调之前开始工作,但其他地方的问题)。接下来,控制器:

angular.module('main', ['ngCookies'])
  .controller('MainCtrl', ['$scope', '$http', '$cookies', '$location', 'session', '$log',
    ($scope, $http, $cookies, $location, session, $log) ->
      $log.info "currentUser: " + session.currentUser + " ; isAuth: " + session.isAuthenticated()
      $location.path '/home' if session.isAuthenticated()
  ])

angular.module('home', ['ngCookies'])
  .controller('HomeCtrl', ['$scope', '$http', '$cookies', 'session', '$location', '$log'
    ($scope, $http, $cookies, session, $location, $log) ->
      $log.info "currentUser: " + session.currentUser + " ; isAuth: " + session.isAuthenticated()
      $location.path '/' unless session.isAuthenticated()
  ])

关键是isAuthenticated()总是false,但在用户登录时currentUser不为空。因此,当我登录时,$log.info不仅在网站刚刚加载时显示currentUser: [object Object] ; isAuth: false,而且在我导航时也是如此。当我注销时,它显示currentUser: null ; isAuth: false.显然,currentUser在服务中始终为 null。但是我该如何定义它才能更改值?

您可以使用监视功能:

$scope.$watch(function() {
   return session.isAuthenticated();
 },
 function() {
   $log.info "currentUser: " + session.currentUser + " ; isAuth: " + session.isAuthenticated()
 }
);

更新已验证为

isAuthenticated: ->
      service.currentUser?

虽然这是异步的,但您应该在路由器中使用解析。