0

トークンがヘッダーに挿入される (最初の) 角度付きアプリを構築しています (表示されるコンテンツの大部分はここから取得されます) 。

angular.module('myApp')

.factory('sessionInjector', ['SessionService', function(SessionService) {  
   var sessionInjector = {
        request: function(config) {
            config.headers['x-session-token'] = SessionService.getToken();
            return config;
        }
    };
    return sessionInjector;
}])

.config(['$httpProvider', function($httpProvider) {  
    $httpProvider.interceptors.push('sessionInjector');
}])

私が抱えている問題はSessionService、サーバーへの呼び出しでこれを初期化するにはどうすればよいですか?

たとえば、これはうまくいきませんでした:

.factory('SessionService', ['$injector', function($injector){
    var token = "";

    return {
        getToken: function () {
            var http = $injector.get('$http');
            if (token === "") {
                http.get('http://localhost/api/auth/getToken').success(function (ret) {
                    token = ret;
                });
            }
            return token; 
            //I can see a $q/deferred/promise should be used somehow here... 
            //but I'm not sure it solves the problem I'm having...
        }
    }
}]);

CPUが100%に過負荷になるだけなので...

初めてのAngularアプリなので、何か足りないと思いますが...何ですか?

編集
問題の別の見方...それでも機能しません...(繰り返しますが、CPUを使い果たし、おそらく無限ループです)

  .factory('sessionData', function () {
    var currentToken = '[uninitialized-token]';

    return {
        getToken: function () {
            return currentToken;
        },
        setToken: function (token) {
            currentToken = token;
        }
    }
})

.factory('sessionInjector', ['sessionData', '$injector', '$q', function (sessionData, $injector, $q) {
    var sessionInjector = {
        request: function (config) {
            var deferred = $q.defer();
            var http = $injector.get('$http');
            http.get('http://localhost/api/auth/getToken').success(function (ret) {
                sessionData.setToken(ret);
                console.log("successfully authenticated with token " + sessionData.getToken());
                config.headers['x-header-sessionID'] = sessionData.getToken();
                deferred.resolve(config);
            })
            .error(function(){
                console.log("failed to authenticate");
                deferred.resolve(config);
            });

            return deferred.promise;
        }
    };
    return sessionInjector;
}])

.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.interceptors.push('sessionInjector');
}])

.run(['$http', 'sessionData', function ($http, configs, sessionData) {
    $http.get('http://localhost/api/auth/testMethod').then(function (ret) {
        //do something...
    });
}])
4

2 に答える 2

0

回答は実際には非常に簡単でした-対象のURLがログイン用の場合は、何も注入しないでください(コメントを探してくださいthe fix):

.factory('sessionData', function () {
    var currentToken = '[uninitialized-token]';

    return {
        getToken: function () {
            return currentToken;
        },
        setToken: function (token) {
            currentToken = token;
        }
    }
})

.factory('sessionInjector', ['sessionData', '$injector', '$q', function (sessionData, $injector, $q) {
    var sessionInjector = {
        request: function (config) {

            //The fix:
            if(config.url === 'http://localhost/api/auth/getToken')
                return config;

            var deferred = $q.defer();
            var http = $injector.get('$http');
            http.get('http://localhost/api/auth/getToken').success(function (ret) {
                sessionData.setToken(ret);
                console.log("successfully authenticated with token " + sessionData.getToken());
                config.headers['x-header-sessionID'] = sessionData.getToken();
                deferred.resolve(config);
            })
            .error(function(){
                console.log("failed to authenticate");
                deferred.resolve(config);
            });

            return deferred.promise;
        }
    };
    return sessionInjector;
}])

.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.interceptors.push('sessionInjector');
}])

.run(['$http', 'sessionData', function ($http, configs, sessionData) {
    $http.get('http://localhost/api/auth/testMethod').then(function (ret) {
        //do something...
    });
}])
于 2015-09-28T10:58:17.597 に答える