AngularJS $http.interceptors.push Uncaught Error: [$injector:unpr]
AngularJS $http.interceptors.push Uncaught Error: [$injector:unpr]
我试图在登录成功后将 access-token 设置为 header。我试图通过使用拦截器来实现它但出现此错误:
Uncaught Error: [$injector:unpr] Unknown provider: aProvider <- a <- TokenInterceptor <- $http <- $compile
JS
myApp.config(['$httpProvider',function ($httpProvider) {
$httpProvider.interceptors.push('TokenInterceptor');
}]);
myApp.factory('TokenInterceptor', function ($q, $window, $location, AuthenticationService) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
return config;
},
requestError: function(rejection) {
return $q.reject(rejection);
},
response: function (response) {
return response || $q.when(response);
},
//Revoke client authentication if 401 is received
responseError: function(rejection) {
console.log("Rejecton !");
console.log(rejection);
if (rejection != null && rejection.status === 401 && ($window.sessionStorage.token || AuthenticationService.isLogged)) {
console.log("Revoked !");
delete $window.sessionStorage.token;
AuthenticationService.isLogged = false;
$location.path("/admin/login");
}
return $q.reject(rejection);
}
};
});
yApp.config(['$httpProvider', function ($httpProvider) {
var interceptor = ['$q', '$window', '$location', '$injector', function($q, $window, $location, $injector) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
return config;
},
requestError: function(rejection) {
return $q.reject(rejection);
},
response: function (response) {
return response || $q.when(response);
},
// Revoke client authentication if 401 is received
responseError: function(rejection) {
console.log(rejection);
// Dynamically get the service since they can't be injected into config
var AuthenticationService = $injector.get('AuthenticationService');
if (rejection != null && rejection.status === 401 && ($window.sessionStorage.token || AuthenticationService.isLogged)) {
delete $window.sessionStorage.token;
AuthenticationService.isLogged = false;
$location.path("/login");
}
return $q.reject(rejection);
}
};
}];
$httpProvider.interceptors.push(interceptor);
}]);
当您丑化源时,TokenInterceptor
被解析为 a
,在 angular 上下文中找不到。
您可以在 uglify 之前使用 ng-annotate 预处理您的源代码,它会自动将您的源代码转换为使用显式注释(数组)样式 myApp.factory('TokenInterceptor', ['$q', '$window', '$location', 'AuthenticationService', function ($q, $window, $location, AuthenticationService){...}])
以确保最小化安全
ng-annotate
还有 grunt
和 gulp
插件
我试图在登录成功后将 access-token 设置为 header。我试图通过使用拦截器来实现它但出现此错误:
Uncaught Error: [$injector:unpr] Unknown provider: aProvider <- a <- TokenInterceptor <- $http <- $compile
JS
myApp.config(['$httpProvider',function ($httpProvider) {
$httpProvider.interceptors.push('TokenInterceptor');
}]);
myApp.factory('TokenInterceptor', function ($q, $window, $location, AuthenticationService) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
return config;
},
requestError: function(rejection) {
return $q.reject(rejection);
},
response: function (response) {
return response || $q.when(response);
},
//Revoke client authentication if 401 is received
responseError: function(rejection) {
console.log("Rejecton !");
console.log(rejection);
if (rejection != null && rejection.status === 401 && ($window.sessionStorage.token || AuthenticationService.isLogged)) {
console.log("Revoked !");
delete $window.sessionStorage.token;
AuthenticationService.isLogged = false;
$location.path("/admin/login");
}
return $q.reject(rejection);
}
};
});
yApp.config(['$httpProvider', function ($httpProvider) {
var interceptor = ['$q', '$window', '$location', '$injector', function($q, $window, $location, $injector) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
return config;
},
requestError: function(rejection) {
return $q.reject(rejection);
},
response: function (response) {
return response || $q.when(response);
},
// Revoke client authentication if 401 is received
responseError: function(rejection) {
console.log(rejection);
// Dynamically get the service since they can't be injected into config
var AuthenticationService = $injector.get('AuthenticationService');
if (rejection != null && rejection.status === 401 && ($window.sessionStorage.token || AuthenticationService.isLogged)) {
delete $window.sessionStorage.token;
AuthenticationService.isLogged = false;
$location.path("/login");
}
return $q.reject(rejection);
}
};
}];
$httpProvider.interceptors.push(interceptor);
}]);
当您丑化源时,TokenInterceptor
被解析为 a
,在 angular 上下文中找不到。
您可以在 uglify 之前使用 ng-annotate 预处理您的源代码,它会自动将您的源代码转换为使用显式注释(数组)样式 myApp.factory('TokenInterceptor', ['$q', '$window', '$location', 'AuthenticationService', function ($q, $window, $location, AuthenticationService){...}])
以确保最小化安全
ng-annotate
还有 grunt
和 gulp
插件