1

Good Morning, J'ai rencontré un problème que je ne suis pas en mesure de résoudre moi-même.Enregistrement d'un intercepteur HTTP dans un module chargé paresseusement

J'essaie d'enregistrer un intercepteur http dans un endroit différent du bloc de configuration initial.

Faire cela fonctionne comme prévu:

angular.module('app', ['ngResource']) 
.config(function($httpProvider) { 
    $httpProvider.interceptors.push(function() { 
    return { 
     request: function($request) { 
     console.log($request); 
     return $request; 
     } 
    } 
    }) 
}) 

Mais l'intercepteur fait partie d'un sous-module. Donc, mon application se présente comme suit:

EDIT:

angular.module('app', ['ngResource']); 
angular.module('app.submodule', ['ngResource']) 
.config(function($httpProvider) { 
    $httpProvider.interceptors.push(function() { 
    return { 
     request: function($request) { 
     console.log($request); 
     return $request; 
     } 
    } 
    }) 
}) 

De plus, le sous-module est lazyloaded. Mais je ne pense pas que ce soit la racine du problème.

J'ai essayé référençant le httpProvider dans le bloc de configuration initiale en ajoutant:

$httpProviderReference = $httpProvider; 

donc je pourrais enregistrer un intercepteur plus tard. Cela ne fonctionnerait même pas dans le bloc initial run(). Inspecter le fournisseur, il semble avoir travaillé, mais l'intercepteur n'est jamais appelé.

Est-ce que quelqu'un sait comment contourner cela? J'essaye d'ajouter un jeton d'authentification à l'en-tête d'une demande.

Merci à l'avance, olu

+0

Etes-vous sûr que angular.module ('app.submodule', []) fait ce que vous pensez qu'il fait, pour moi, il semble que c'est juste la création d'un nouveau module et ne sait rien sur l'autre module. – Delta

+0

J'ai ajouté la dépendance à ngResource au sous-module. Est-ce ce que vous avez mentionné? Lorsque j'essaie d'enregistrer un intercepteur dans la méthode d'exécution des modules principaux, cela ne fonctionne pas non plus. – olu

Répondre

1

Pour toute personne rencontrant d'autre un problème similaire, voici comment je l'ai fait:

J'enregistré un intercepteur général dans mon module principal:

angular.module('app', ['ngResource']) 
.config(function($httpProvider) { 
    $httpProvider.interceptors.push('Interceptors'); 
}) 
.factory('Interceptors', function() { 
    var requestFunctions = []; 
    return { 
    request: function($request) { 
     var r = $request; 
     for (var i = requestFunctions.length - 1; i >= 0; i--) { 
     r = requestFunctions[i]($request); 
     }; 
     return $request; 
    }, 
    setRequestFunction: function(fn) { 
     requestFunctions.push(fn); 
    } 
    } 
}) 

L'usine possède un éventail de fonctions, qui sont appelées en série. La requête d'origine est analysée à travers les fonctions. La demande est modifiée dans le sous-module:

angular.module('app.submodule', ['ngResource']) 
.run(function($injector,MyService) { 
    var Interceptors = $injector.get('Interceptors'); 
    Interceptors.setRequestFunction(function($request) { 
     $request.headers['auth-id'] = MyService.getAuthData().authId; 
     $request.headers['auth-token'] = MyService.getAuthData().authToken; 
    } 
    return $request; 
    }) 
}) 

Aussi Restangular vaut le coup d'oeil. C'est une substitution pour ngResource et il semble possible d'enregistrer des intercepteurs pour Restangular n'importe où dans l'application.