2015-08-05 1 views
0

Я строй своего (первым) углового приложения, которое будет иметь маркера, вставленные в заголовки (содержание показано по большей части взят из here)

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... 
     } 
    } 
}]); 

, потому что он просто перегружает мой процессор до 100% ...

Так как это мой первый угловой приложение, я уверен, что я что-то не хватает, но ... что?

EDIT:
Другой принять по этому вопросу ... до сих пор не работает, хотя ... (опять же, израсходовал процессор, вероятно, бесконечный цикл)

.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... 
    }); 
}]) 

ответ

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... 
    }); 
}]) 
1

Проверьте этот модифицированный код фрагмент поможет решить ваши проблемы.

.factory('SessionService', ['$http', '$q', function($http, $q) { 
    var token = null; 
    var sessionService = {}; 
    var differred = $q.defer(); 

    sessionService.readToken = function() { 
     return $http.get('http://localhost/api/auth/getToken') 
      .success(function (res) { 
       console.log('Auth Success and token received: ' + JSON.stringify(res.data)); 

       // Extract the token details from the received JSON object 
       token = res.data; 
       differred.resolve(res); 
      }, function (res) { 
       console.log('Error occurred : ' + JSON.stringify(res)); 
       differred.reject(res); 
      } 
     ) 
    }; 

    sessionService.getToken = function() { 
     return token; 
    }; 

    sessionService.isAnonymous = function() { 
     if (token) 
      return true; 
     else 
      return false; 
    }; 

    return sessionService; 
}]) 


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

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

Спасибо за ответ - но это не работает. $ Http, который вы используете, не вводится. И даже если бы это было, это создало бы круглую ссылку и не сработало бы. Вот почему мне пришлось получить $ http из $ инжектора во время запроса на токен (внутри функции, в ее контексте во время выполнения по запросу) ... – veljkoz

+0

В исправлении объявления службы сеанса была опечатка. Кроме того, сначала вам нужно вызвать метод 'Session.readToken()' внутри вашего контроллера, чтобы прочитать его. Впоследствии, если токен доступен, все последовательные запросы будут отправляться с токеном в качестве параметра заголовка HTTP. Это работает и проверяется. Никаких круговых ссылок не было обнаружено, как я его определял. – Aviro

+0

Это круговая ошибка, которую я получаю, когда я использовал ваш код: 'Uncaught Error: [$ injector: cdep] Обнаружена круговая зависимость: $ http <- SessionService <- sessionInjector <- $ http <- $ templateRequest <- $ compile '(AngularJS v1.4.3) – veljkoz

Смежные вопросы