AngularJS uygulamamın kimlik doğrulamasını işleyebilmesi için bir HTTP yakalayıcı yazmaya çalışıyorum.
Bu kod işe yarıyor, ancak Angular'ın bunu otomatik olarak halletmesi gerektiğini düşündüğüm için bir hizmeti manuel olarak enjekte etmekten endişe duyuyorum:
app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push(function ($location, $injector) {
return {
'request': function (config) {
//injected manually to get around circular dependency problem.
var AuthService = $injector.get('AuthService');
console.log(AuthService);
console.log('in request interceptor');
if (!AuthService.isAuthenticated() && $location.path != '/login') {
console.log('user is not logged in.');
$location.path('/login');
}
return config;
}
};
})
}]);
Yapmaya başladığım şey, ancak döngüsel bağımlılık sorunları ile karşılaştım:
app.config(function ($provide, $httpProvider) {
$provide.factory('HttpInterceptor', function ($q, $location, AuthService) {
return {
'request': function (config) {
console.log('in request interceptor.');
if (!AuthService.isAuthenticated() && $location.path != '/login') {
console.log('user is not logged in.');
$location.path('/login');
}
return config;
}
};
});
$httpProvider.interceptors.push('HttpInterceptor');
});
Endişelenmemin bir başka nedeni de, Angular Docs içindeki $ http ile ilgili bölümün, bağımlılıkları bir Http durdurucuya "normal yoldan" enjekte etmenin bir yolunu gösteriyor gibi görünmesidir. Kod snippet'lerini "Interceptors" altında görün:
// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
return {
// optional method
'request': function(config) {
// do something on success
return config || $q.when(config);
},
// optional method
'requestError': function(rejection) {
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return $q.reject(rejection);
},
// optional method
'response': function(response) {
// do something on success
return response || $q.when(response);
},
// optional method
'responseError': function(rejection) {
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return $q.reject(rejection);
};
}
});
$httpProvider.interceptors.push('myHttpInterceptor');
Yukarıdaki kod nereye gitmeli?
Sanırım sorum şu, bunu yapmanın doğru yolu nedir?
Teşekkürler ve umarım sorum yeterince açıktı.
$http
. Bulduğum tek yol kullanmaktır $injector.get
, ancak bundan kaçınmak için kodu yapılandırmanın iyi bir yolu olup olmadığını bilmek harika olurdu.