2013-06-26 17 views
11

W poniższym przykładzie kodu:

myApp.config(['$httpProvider', function($httpProvider, $cookieStore) { 

    $httpProvider.defaults.withCredentials = true; 

    $httpProvider.defaults.headers.get['Authorization'] = 'Basic '+ $cookieStore.get('myToken'); 

    return JSON.stringify(data); 

}]); 

dostaję angularjs błąd jak 'Unknown provider $ CookieStore'.

"myApp" ma zależność, a "ngCookies" i angular-cookies.min.js są zalane, więc co jest nie tak z tym kodem?

Czy to, że robię to w .config? Prawdopodobnie

+1

Dlaczego nie pokazujesz nam również kodu inicjującego 'myApp'. – Chandermani

Odpowiedz

14

Ponieważ jest to możliwe tylko przekazać dostawcom podczas konfigurowania, mam w końcu zrobić nadpisywanie mojego parametru HTTP nie z transformatorem żądanie ale tworząc usługę w fabryce robić żądania.

Oto przykładowy kod usługi (nie testowane, tylko dla informacji):

angular.module('myapp-http-request', []); 
angular.module('myapp-http-request') 
.factory('MyRequests', function($http, $cookieStore){ 

    return { 
     request: function(method, url, data, okCallback, koCallback){ 
      $http({ 
       method: method, 
       url: url, 
       data: data 
      }).success(okCallback).error(koCallback); 
     }, 
     authentifiedRequest: function(method, url, data, okCallback, koCallback){ 
      $http({ 
       method: method, 
       url: url, 
       data: data, 
       headers: {'Authorization': $cookieStore.get('token')} 
      }).success(okCallback).error(koCallback); 
     } 
    } 
}); 

i przykład użycia (nie testowane, tylko dla informacji):

angular.module('sharewebapp', ['myapp-http-request']) 
.controller('MyController', ['MyRequests', function(MyRequests){ 
    MyRequests.authentifiedRequest('DELETE', '/logout', '', function(){alert('logged-out');}, function(){alert('error');}) 
}]); 
+0

Ma to również problem, ponieważ nagłówki z fabryki będą statyczne. Spróbuj zalogować się, a następnie wyjść, a następnie ponownie, a zobaczysz, że nadal używa starego tokena. – Rob

2

Trzeba dodać CookieStore

myApp.config(['$httpProvider', '$cookieStore', function($httpProvider, $cookieStore) 
+0

zostało już przetestowane, a błąd zniknął, ale potem dostałem "niemożliwe do zrobienia na niezdefiniowanym", tj. $ CookieStore jest niezdefiniowany – kij

+0

oh to prawda. w części konfiguracyjnej można używać tylko dostawców, natomiast w części .run można używać tylko instancji. Domyślam się, że cookieStore nie jest dostawcą –

+0

Cholernie. Czy istnieje inny sposób dynamicznego ustawiania nagłówka przy żądaniu za pomocą $ http? – kij

2

Wpadłem na ten sam problem, więc opowiem, jak sobie z nim poradziłem. Zasadniczo użyłem modułu $ injector do ręcznego pobrania instancji usługi, której potrzebowałem. Uwaga: działa to również w przypadku usług zdefiniowanych przez użytkownika.

angular.module('app'). 
config(config); 

config.$inject = ['$httpProvider']; 

function config($httpProvider) { 
    //Inject using the $injector 
    $httpProvider.interceptors.push(['$injector', function($injector){ 
    return { 
    request: function(config) { 

     //Get access by injecting an instance of the desired module/service 
     let $cookieStore = $injector.get('$cookieStore'); 

     let token = $cookieStore.get('your-cookie-name'); 
     if (token) { 
     config.headers['x-access-token'] = token; 
     } 
     return config; 
    } 
    } 
}]) 
}