2013-06-26 13 views
11

Nel seguente esempio di codice:

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

    $httpProvider.defaults.withCredentials = true; 

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

    return JSON.stringify(data); 

}]); 

ottengo un errore angularjs come 'Unknown fornitore $ cookieStore'.

'myApp' ha dependenciy e 'ngCookies' e angular-cookies.min.js è laico, quindi cosa c'è di sbagliato in quel codice?

È questo il fatto che sto facendo questo in .config?

+1

Perché non ci mostri anche il codice di inizializzazione 'myApp'. – Chandermani

risposta

14

Perché è possibile solo a passare i fornitori durante la configurazione, ho finalmente fatto la sovrascrittura della mia parametro http non con un trasformatore richiesta, ma con la creazione di un servizio come fabbrica fare richieste

Ecco un esempio di codice del servizio (non testato, solo per informazioni):

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

E esempio di utilizzo (non testato, solo per informazioni):

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

Anche questo ha problemi dal momento che le intestazioni dalla fabbrica saranno statiche. Prova ad accedere, poi a uscire, poi di nuovo e ti renderai conto che sta ancora utilizzando il vecchio token. – Rob

2

Probabilmente è necessario aggiungere il cookieStore

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

già testato e l'errore scompare, ma poi ho ottenuto un 'non è possibile andare avanti indefinito', vale a dire $ cookieStore non è definito – kij

+0

oh questo è vero. nella parte config puoi usare solo i provider, mentre nella parte .run puoi usare solo le istanze. Immagino che cookieStore non sia un fornitore –

+0

Dannato. C'è un altro modo per impostare dinamicamente l'intestazione quando si richiede con $ http? – kij

2

Mi sono imbattuto in questo stesso problema, quindi posterò come ho fatto a girarlo. Essenzialmente ho usato il modulo $ injector per afferrare manualmente un'istanza del servizio di cui avevo bisogno. Nota questo funziona anche per i servizi definiti dall'utente.

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