Я строй своего (первым) углового приложения, которое будет иметь маркера, вставленные в заголовки (содержание показано по большей части взят из 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...
});
}])
Спасибо за ответ - но это не работает. $ Http, который вы используете, не вводится. И даже если бы это было, это создало бы круглую ссылку и не сработало бы. Вот почему мне пришлось получить $ http из $ инжектора во время запроса на токен (внутри функции, в ее контексте во время выполнения по запросу) ... – veljkoz
В исправлении объявления службы сеанса была опечатка. Кроме того, сначала вам нужно вызвать метод 'Session.readToken()' внутри вашего контроллера, чтобы прочитать его. Впоследствии, если токен доступен, все последовательные запросы будут отправляться с токеном в качестве параметра заголовка HTTP. Это работает и проверяется. Никаких круговых ссылок не было обнаружено, как я его определял. – Aviro
Это круговая ошибка, которую я получаю, когда я использовал ваш код: 'Uncaught Error: [$ injector: cdep] Обнаружена круговая зависимость: $ http <- SessionService <- sessionInjector <- $ http <- $ templateRequest <- $ compile '(AngularJS v1.4.3) – veljkoz