मैं प्रमाणीकरण को संभालने के लिए अपने AngularJS ऐप के लिए एक HTTP इंटरसेप्टर लिखने की कोशिश कर रहा हूं।
यह कोड काम करता है, लेकिन मैं एक सेवा को मैन्युअल रूप से इंजेक्ट करने के बारे में चिंतित हूं क्योंकि मुझे लगा कि कोणीय इसे स्वचालित रूप से संभालने वाला है:
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;
}
};
})
}]);
मैंने क्या करना शुरू किया, लेकिन परिपत्र निर्भरता की समस्याओं में भाग गया:
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');
});
एक और कारण है कि मैं चिंतित हूं कि एंगुलर डॉक्स में $ http पर अनुभाग निर्भरता प्राप्त करने के लिए एक तरीका दिखा रहा है ताकि "रेगुलर तरीका" को एक Http इंटरसेप्टर में इंजेक्ट किया जा सके। "इंटरसेप्टर्स" के तहत उनका कोड स्निपेट देखें:
// 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');
उपरोक्त कोड कहां जाना चाहिए?
मुझे लगता है कि मेरा सवाल यह है कि ऐसा करने का सही तरीका क्या है?
धन्यवाद, और मुझे आशा है कि मेरा प्रश्न पर्याप्त स्पष्ट था।
$http। इसका एकमात्र तरीका जो मैंने पाया है वह उपयोग करना है $injector.get, लेकिन यह जानना बहुत अच्छा होगा कि इससे बचने के लिए कोड को संरचना करने का अच्छा तरीका है या नहीं।