3

次のコードを実行しようとしています (fusseApp は angularModule です)。

fusseApp.run(function(URI, $http){

  $http.get('/check/userLogged').then(function(response){
            console.log(response);
  });

PS : 実際、私の http 呼び出しはファクトリで実行されます。ここでは、このファクトリへの呼び出しがあります。

angularModule は次のようにモックされます。

angular.module('fusseApp.mainMocks', ['fusseApp', 'fusseApp.loginMocks', 'ngMockE2E', 'ngResource'])
    .run(function($httpBackend, $http) {

...

$httpBackend.whenGET('/check/userLogged').respond(200,response);

私の問題は、モック モジュールが初期化される前に fusseApp.run が実行されることです。だから私はエラーがあります:

キャッチされないエラー: 予期しない要求: GET /check/userLogged これ以上要求はありません

この問題はジャスミンの単体テストで発生したようですが、解決策が見つかりません。$httpアプリケーションが完全に初期化されたことを知らせるイベントの後に呼び出しを実行することはできますか?

画面にデータを表示する前に、ユーザーが認証されていることを確認する必要があります。

4

1 に答える 1

0

多分これは役立つかもしれません...

.run()ブーストラッププロセスの一部であるコードを設定すると、常に実行さng-app=""れます。そこから、コンパイルとリンクのプロセスを停止することはできませんが、ユーザーがログインしていない場合にビューがレンダリングされないようにする方法はたくさんありますの:

A) $http サービスは NG の外にあるため、jQuery $.ajax または別の lib を使用して、認証に問題がなければ、手動の角度ブーストラップ (それほど楽しくはないが実行可能) を実行できます。

B)しかし、あなたはすべてのNGサービスに.run()アクセスできるため、リスナーをリッスンし、リスナー内で認証検証を実行できます。$rootScope$stateChangeStart

これは多かれ少なかれ NG 認証のベスト プラクティスです。このリスナーは、ユーザーが状態を変更するたびにチェックを続けます (これは、セッションの有効期限をキャッチできるようにするためです)。正確にこれを行います:

$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
    if (!AuthService.isAuthenticated()) {
        $state.transitionTo("login"); // redirect to login page
        event.preventDefault();
    }
});

AuthServicetrueまたはfalseユーザーが認証された場合に返す単純なサービスです。私の経験では、許可されていないユーザーに対してビューを非表示にしてリダイレクトするための最良の解決策は、前に示したように状態変更プロセスをキャッチすることです。状態を装飾できるため、これらのプロパティはtoState引数で (少なくとも ui-router で) アクセスできます。そのため、ユーザー ロールをキャッチするなど、あらゆる種類の派手なことを行うことができます...

于 2014-11-01T04:43:47.387 に答える