Перехватчик $httpProvider не работает, когда $http внедряется в фабрику

У меня есть служба под названием «api», зарегистрированная примерно так:

angular
  .module('myApp')
  .factory('api', ['$http', function ($http) {
    // do stuff with $http.get() etc here.
  }]);

... и $http настраивается следующим образом:

angular
  .module('myApp')
  .factory('httpInterceptor', ['$rootScope', function ($rootScope) {
    // do stuff to intercept http requests and auth things here
  }]);

angular
  .module('myApp')
  .config(function ($httpProvider) {
    $httpProvider.interceptors.push('httpInterceptor');
  });

Перехватчики работают, когда я напрямую ввожу $http в контроллер, но когда я использую службу api в своем контроллере, настройки $http не работают. Похоже, Angular не добавляет точки пересечения в точку, которую требует созданная мной фабрика.

Как мне это решить?


person Aditya M P    schedule 28.07.2014    source источник
comment
Можете ли вы предоставить больше кода фабрики API?   -  person Satpal    schedule 28.07.2014
comment
вы используете службу $http или api внутри перехватчиков?   -  person ryeballar    schedule 28.07.2014
comment
Фабрика перехватчиков напрямую вставлена ​​в $httpProvider.interceptors @ryeballar, так что вопросов не возникает.   -  person Aditya M P    schedule 28.07.2014
comment
@Satpal уверен, что на самом деле ничего особенного: laravel.io/bin/mY8On   -  person Aditya M P    schedule 28.07.2014
comment
@ryeballar Я пытался использовать $injector.get('$http') в сервисе api, но это тоже не сработало. Я думаю, что это то, что происходит внутри в любом случае.   -  person Aditya M P    schedule 28.07.2014
comment
в консоли есть ошибки?   -  person ryeballar    schedule 28.07.2014
comment
Нет, совсем нет; на самом деле, когда я вставляю console.log в перехватчик, он не срабатывает, когда я использую службу api, но консоль получает сообщения, когда происходят обычные изменения углового маршрута.   -  person Aditya M P    schedule 28.07.2014


Ответы (2)


Вопрос был основан на неправильной предпосылке. Перехватчики на самом деле работают, просто я использовал не тот крючок. Вместо того, чтобы настраивать свойство responseError объекта-перехватчика, я пытался перехватывать ошибки из самого свойства response. Вот почему я думал, что перехватчики вообще не работают.

Этой проблемы на самом деле не существует. Перехватчики провайдера работают корректно даже в заводских условиях.

person Aditya M P    schedule 01.08.2014
comment
Это мне очень помогло. - person mz3; 29.08.2014

Вы можете попробовать сделать httpInterceptor переменной внутри конфига, а не фабрикой:

angular
  .module('myApp')
  .config(function ($httpProvider) {

    var httpInterceptor = ['$rootScope', 
      function($rootScope) {
        // do stuff to intercept http requests and auth things here
      }
    ];

    $httpProvider.responseInterceptors.push(httpInterceptor);
  });

Обратите внимание, что я также изменил $httpProvider.interceptors на $httpProvider.responseInterceptors, а параметр, переданный push(), не является строкой.

Дайте мне знать, если это поможет.

ИЗМЕНИТЬ:

Вы также можете рассмотреть возможность использования этого плагина: https://github.com/witoldsz/angular-http-auth. . У него есть интересная функция после перехвата: "Затем authService повторит все запросы, ранее не выполненные из-за ответа HTTP 401."

person mattarau    schedule 28.07.2014