1

我正在尝试创建一个$http如下所示的拦截器:

.config(['$httpProvider',function($httpProvider){
$httpProvider.interceptors.push(function($q,$window){
    return {
        'request':function(config){
            config.headers = config.headers || {};
            if($window.sessionStorage)
                config.headers.Authorization = 'Bearer '+$window.sessionStorage.token;
        },
        'requestError':function(rejection)
        {
            $q.reject(rejection);
        },
        'response':function(response){
            return response || $q.when(response);
        },
        'responseError':function(response)
        {
            if(response!=null && response.status == 401)
            {
                delete $window.sessionStorage.token;
                //make the user login again
            }
            return response || $q.when(response);   
        }       
    };
});
}])

拦截器失败并出现以下错误:

 TypeError: Cannot read property 'headers' of undefined
at serverRequest (angular.js:9366)
at processQueue (angular.js:13248)
at angular.js:13264
at Scope.$eval (angular.js:14466)
at Scope.$digest (angular.js:14282)
at Scope.$apply (angular.js:14571)
at bootstrapApply (angular.js:1455)
at Object.invoke (angular.js:4203)
at doBootstrap (angular.js:1453)
at bootstrap (angular.js:1473)
4

2 回答 2

3

您忘记返回config值...

request: function(config) {
    if ($window.sessionStorage) {
        config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
    }
    return config;
}

文档

request: 拦截器被一个 http 配置对象调用。该功能可以自由修改配置对象或创建一个新对象。
该函数需要直接返回config对象,或者包含config或新对象的承诺config

于 2015-05-13T05:28:40.653 回答
2

我建议使用工厂并确保您的 headers 对象设置为一个对象:

angular.module('app')
  .factory('AuthInterceptor', ["$window", "$q", function ($window, $q) {

    return {
        request: function (config) {
            config.headers = config.headers || {};
            if ($window.sessionStorage) {
               config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
            }
            return config;
        },
        responseError: function (response) {
            if(response != null && response.status == 401)
            {
                delete $window.sessionStorage.token;
                //make the user login again
            }
            return response || $q.when(response);
        }
    }
  }]);

并在您的配置部分使用:

$httpProvider.interceptors.push("AuthInterceptor");
于 2015-05-13T05:52:44.240 回答