2016-06-22 23 views
1

Erhalte den Fehler Error: [$injector:unpr] Unknown provider: IdleProvider in meiner Anwendung, wenn er mit dokku auf unserem Staging-Server bereitgestellt wird, aber ich bekomme ihn nicht, wenn er auf meinem lokalen Rechner ausgeführt wird. Ich benutze ng-idle 1.2.1

Ich habe diese Frage einige Male gefragt, aber die Ursache wurde immer auf die Änderungen in der Version 1.0.0, wo die Service-Namen geändert wurden, bezogen. Das einzige, woran ich denken kann ist, dass die Minimierung des Codes das Problem ist, aber soweit ich sehen kann, sollte der Code in Ordnung sein, aber ich bin kein Experte. Jede Hilfe würde sehr geschätzt werden.

Es ist in Coffeescript geschrieben

configuration = (RestangularProvider, $logProvider, growlProvider, IdleProvider, KeepaliveProvider) -> 
    . 
    . 
    . 
    return 

configuration.$inject = [ 
    'RestangularProvider' 
    '$logProvider' 
    'growlProvider' 
    'IdleProvider' 
    'KeepaliveProvider' 
] 

angular 
    .module 'vssApp.config', [ 
    'restangular' 
    ] 
    .config configuration 

EDIT

Während ich entfernte das 'ngIdle' Modul in dem modules unter Array versuchen, das Problem auf meinem lokalen Rechner zu replizieren. Dies führte zu dem gleichen Verhalten, so dass ich davon ausgehe, dass das Problem davon herrührt, dass das ngIdle Modul hier nicht korrekt geladen wird. Ich denke immer noch, dass Minification das Problem verursachen könnte, aber ich bin mir nicht sicher warum oder wie ich es beheben kann.

modules = [ 
    'ui.router' 
    'ui.bootstrap' 
    'ui.select' 
    'ngAnimate' 
    'ngMessages' 
    'ngSanitize' 
    'ngCookies' 
    'smart-table' 
    'angularMoment' 
    'templates' 
    'angular-storage' 
    'angular-growl' 
    'vssApp.core.auth' 
    'vssApp.core.loading' 
    'ngIdle' 
    'cgPrompt' 
    'vssApp.filters' 
] 

runBlock.$inject = [ 
    '$templateCache' 
] 

angular 
    .module 'vssApp.core', modules 
    .run runBlock 

EDIT 2

Hier ist die vollständige Ausgabe von der Fehlermeldung erhalte ich

Error: [$injector:modulerr] Failed to instantiate module vssApp due to: 
Error: [$injector:modulerr] Failed to instantiate module vssApp.config due to: 
Error: [$injector:unpr] Unknown provider: IdleProvider 
http://errors.angularjs.org/1.3.16/$injector/unpr?p0=IdleProvider 
    at https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:3:18814 
    at https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:16489 
    at getService (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:14903) 
    at Object.invoke (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:15466) 
    at runInvokeQueue (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:13793) 
    at https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:14062 
    at forEach (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:3:19482) 
    at loadModules (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:13587) 
    at https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:13964 
    at forEach (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:3:19482) 
http://errors.angularjs.org/1.3.16/$injector/modulerr?p0=vssApp.config&p1=E…net%2Fassets%2Fapplication-85a5fd382c73380bf2a71b66e581c941.js%3A3%3A19482) 
    at https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:3:18814 
    at https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:14406 
    at forEach (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:3:19482) 
    at loadModules (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:13587) 
    at https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:13964 
    at forEach (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:3:19482) 
    at loadModules (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:13587) 
    at createInjector (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:4:16844) 
    at doBootstrap (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:3:28466) 
    at bootstrap (https://SERVER/assets/application-85a5fd382c73380bf2a71b66e581c941.js:3:28995) 
http://errors.angularjs.org/1.3.16/$injector/modulerr?p0=vssApp&p1=Error%3A…net%2Fassets%2Fapplication-85a5fd382c73380bf2a71b66e581c941.js%3A3%3A28995) 
+1

Komma (,) fehlt nach jedem Konfigurationseintrag $ inject array – ranakrunal9

+0

Sorry, ich hätte erwähnen sollen, dass es in CoffeeScript geschrieben ist, also sind die Kommas nicht notwendig –

+0

IdleProvider wird wahrscheinlich zum ngIdle Modul gehören. Und es ist nicht geladen. – estus

Antwort

0

Endlich die Ursache und Lösung gefunden, scheint es ein Problem gewesen zu sein.

Es ist eine Rails-Anwendung, so dass ich angegeben ng-idle 1.2.1 in der bower.json-Datei, aber aus irgendeinem Grund die Bower-Datei wurde ignoriert, wenn die App 0.3.5 blieb mit Dokku und die letzte installierte Version eingesetzt wurde, die 1.0.0 ng-idle, dass die prä- gemeint Dienste Namenskonvention wurde immer noch verwendet, wo allen Servicenamen eine $ vorangestellt wurde. Dies führte zu dem Unknown provider: IdleProvider Fehler, weil $IdleProvider der tatsächliche Dienstname war.

Am Ende musste ich eine Verbindung zum Docker Container herstellen und alle Bower Komponenten entfernen und neu installieren. Das Ausführen von bower update als Teil der Bereitstellung war aus irgendeinem Grund nicht ausreichend. Wenn ich mehr Zeit habe, werde ich untersuchen, was dieses Verhalten verursacht hat, und ich werde hier berichten.

+0

Die richtige Vorgehensweise wäre wahrscheinlich, dein 'bower.json' zu enteignen, was dann hoffentlich dazu führen würde, dass' bower update' die richtige Version dieser Abhängigkeit aufgreift . –

0

Eine Faustregel Module Abhängigkeiten in jedem Ort zu laden, wo sie verwendet werden, . Dies ermöglicht es, sie zu entkoppeln. Und dies beseitigt die Wettlaufsituation mit der Injektion von Service Providern.

Wenn die App wie folgt aussehen

angular.module('vssApp', ['vssApp.config', 'ngIdle', ...]).. 
angular.module('vssApp.config', ['restangular'])... 

Dienstleister für Idle-Dienst wird nicht zu dem Zeitpunkt definiert, wenn vssApp.config Modul geladen wird.

Während dieser

angular.module('vssApp', ['ngIdle', 'vssApp.config', ...]) 
angular.module('vssApp.config', ['restangular'])... 

vermeidet Bedingung Rennen aber zeigt noch Codegeruch.

Es sollte

angular.module('vssApp.config', ['restangular', 'ngIdle'])... 

, dieses Problem zu Dienstleistern gilt nur und Konfigurationsphase. Service-Instanzen können für jede Modulreihenfolge eingefügt werden.

+0

Ich sehe absolut die Vorteile, Abhängigkeiten einzeln zu laden, wie Sie oben beschrieben haben, und ich werde das in Zukunft ändern, aber es erklärt immer noch nicht das Problem, das ich habe. Wenn dies der Fall ist, sollte das Problem bestehen, wenn ich den Code lokal ausführe, aber ich sehe ihn nur auf unserem Staging-Server, nachdem er bereitgestellt wurde. –

+0

@RobbieNolan Es kann von einigen Umständen abhängen, die hinter der Szene bleiben, wie zum Beispiel, wie die App gebaut wird. Es ist noch nicht klar, wie 'vssApp.config' in den obigen Code passt. Sie haben keine vollständige Fehlermeldung angegeben, und es ist nicht ersichtlich, dass der Fehler in 'vssApp.config' auftritt. In jedem Fall, wenn 'ngIdle' in jedes Modul geladen wird, das seine Dienste nutzt, sollte dies das Problem lösen. – estus

+0

Ich folgte Ihrem Rat und ich lade jetzt 'ngIdle' in jedes Modul, das es benutzt, aber immer noch der gleiche Fehler bleibt. Ich weiß nicht, was dieses Problem verursacht. –