【问题标题】:AngularJs auth service behaves strangelyAngularJs 身份验证服务行为异常
【发布时间】:2013-10-14 20:30:23
【问题描述】:

更新:code in JS

我从angular-app借用了auth(session)服务,强烈修改:

  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()
    ])

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

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 在服务中始终为空。但是我如何定义它才能改变值呢?

【问题讨论】:

    标签: javascript angularjs authentication coffeescript angular-services


    【解决方案1】:

    您可以使用监视功能:

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

    【讨论】:

    • 我刚刚发现,如果我的 current_user 工作正常,那么 isAuthenticated 不需要这种方法。那太明显了,我没看到!感谢您的帮助 =)
    • 我不知道我做了什么,但我确信它可以工作,但现在它不能使用相同的代码。
    【解决方案2】:

    更新 isAuthenticated 为

    isAuthenticated: ->
          service.currentUser?
    

    虽然这是异步的,但你应该在路由器中使用 resolve。

    【讨论】:

    • isAuthenticated true 一直在控制器中。可能这种异步是这种行为的原因。我正在尝试执行解析,但它不会访问路由器中的会话。 Unknown provider: session 但它无疑包括在内。 pastebin.com/UjmHEz2T
    • 也许我可以同步执行此方法。顺便说一句,我不擅长解决=)我应该创造承诺。
    猜你喜欢
    • 2014-12-31
    • 2013-07-11
    • 2016-09-14
    • 2018-12-10
    • 2012-01-07
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多