2015-02-11 68 views
3

我有一個角度$resource用於登錄和獲取用戶信息。登錄名將用戶名和密碼發送到服務器並獲取一個不記名令牌。在User.loginsuccess函數中,令牌存儲在localStorage中。在getEmail中,我將標記包含在用戶電子郵件地址的標題中。

問題是,第一次在控制器中調用getEmail$window.localStorage.getItem('TK')求值爲null,但是如果我刷新頁面,那麼它將正常工作。對包含令牌的服務器的所有後續請求均按預期工作。什麼會造成這種情況?

更不用說,getEmail被稱爲登錄後的方式,並且我已經確認該令牌存在於調用getEmail之前的localStorage中。

angular.module('authentication') 
    .factory('User', function ($resource, $window) { 
     return $resource('/login', {}, { 
      login: { 
       method: 'POST' 
      }, 

      getEmail: { 
       url: '/user', 
       method: 'GET', 
       headers: { 
        'Authorization': "Bearer " + $window.localStorage.getItem('TK') 
       } 
      } 
     }); 
    }) 

在迴應@評論: 我的控制器看起來是這樣的:

angular 
     .module('app.mymodule', ['ngReource', 'authentication') 
     .controller('myCtrl', mymodule); 

    mymodule.$inject = ['User', '$window']; 

    function mymodule(User, $window) { 

     // THIS PRINTS THE TK IN CONSOLE CORRECTLY 
     console.log($window.localStorage.getItem("CHTOKEN")); 

     // THIS IS UNAUTHORIZED CUZ TK IS NULL 
     User.getEmail({}, function(data){ 
       console.log('set the email'); 
     }); 
    } 
+1

只知道如果這是一個角度問題,如果使用常規的'window'而不是'$ window',會發生什麼? – floribon 2015-02-11 00:54:55

+0

@floribon,只是試了一下。同樣的問題。 – norbertpy 2015-02-11 00:59:21

+1

所以這與角度無關。不知何故,即使你認爲你的本地存儲器中沒有數據,也是如此。你甚至可以在運行任何角碼之前記錄'window.localStorage.getItem('TK')'?如果它爲空,那麼角將無濟於事。 – floribon 2015-02-11 01:09:29

回答

4

你的問題是,資源定義是在創建時所提供的(已保存令牌之前)。

您可以一般request interceptor添加到$httpProvider因此所有的請求都覆蓋或更改getEmail行動的header使用功能,所以它在運行時進行評估,如

headers: { 
    'Authorization': function() { 
     var token = $window.localStorage.getItem('TK'); 
     return token ? 'Bearer ' + token : null; 
    } 
} 
+0

偉大的解決方案!很容易忘記工廠在出生時實例化,錯誤信息可以隱藏真正的問題! – 2015-06-11 04:19:48

相關問題