[解決済み] AngularJS: HTTPインターセプターへのサービスインジェクション (円形依存)
2022-08-22 05:27:04
質問
AngularJSアプリで認証処理をするためにHTTPインターセプターを書こうとしています。
このコードは動作しますが、私はAngularがこれを自動的に処理することになっていると思ったので、手動でサービスを注入することに懸念しています。
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 インターセプターに "通常の方法" で依存性を注入する方法を示しているように見えるからです。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');
上記のコードはどこに書くべきでしょうか?
私の質問は、これを行うための正しい方法は何ですかということだと思います。
ありがとうございます。私の質問が十分に明確であったことを願っています。
どのように解決するのですか?
http と AuthService の間に循環的な依存関係があります。
を使うことで行っていることは
$injector
サービスを使用することで行っていることは、$http の AuthService への依存を遅らせることで、 鶏と卵の問題を解決しています。
あなたがしたことは、実際には最もシンプルな方法だと思います。
また、こんな方法もあります。
-
インターセプターを後で登録する (これは
run()
ブロックではなくconfig()
ブロックの代わりにブロックにすることで、すでにトリックを行うことができるかもしれません)。しかし、あなたは $http がすでに呼び出されていないことを保証できますか? -
を呼び出してインターセプターを登録する際に、 AuthService に手動で $http をインジェクトします。
AuthService.setHttp()
などで登録します。 - ...
関連
-
[解決済み] AngularJSのコントローラからビューにHTMLを挿入する
-
[解決済み] AngularJS 。非同期データでサービスを初期化する
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] javascriptでオプションのパラメータを扱う
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] これは純関数ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] JavaScriptでjson-objectのキーを取得する [重複].
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?