Saya mencoba menulis pencegat HTTP untuk aplikasi AngularJS saya untuk menangani otentikasi.
Kode ini berfungsi, tetapi saya khawatir tentang menyuntikkan layanan secara manual karena saya pikir Angular seharusnya menangani ini secara otomatis:
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;
}
};
})
}]);
Apa yang saya mulai lakukan, tetapi mengalami masalah ketergantungan melingkar:
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');
});
Alasan lain mengapa saya khawatir adalah bahwa bagian di $ http di Angular Docs tampaknya menunjukkan cara untuk memasukkan dependensi dengan "cara biasa" ke dalam pencegat Http. Lihat cuplikan kodenya di bawah "Interceptors":
// 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');
Kemana perginya kode di atas?
Saya kira pertanyaan saya adalah apa cara yang benar untuk melakukan ini?
Terima kasih, dan saya harap pertanyaan saya cukup jelas.
$http
. Satu-satunya cara untuk mengatasinya yang saya temukan adalah dengan menggunakan $injector.get
, tetapi akan sangat bagus untuk mengetahui apakah ada cara yang baik untuk menyusun kode untuk menghindari hal ini.