Angular - Error: [$injector:unpr] Unknown provider: IdleProvider

Angular - Error: [$injector:unpr] Unknown provider: IdleProvider

当我的应用程序使用 dokku 部署到我们的登台服务器时,我的应用程序出现错误 Error: [$injector:unpr] Unknown provider: IdleProvider,但是当 运行 它在我的本地计算机上时,我没有得到它。我正在使用 ng-idle 1.2.1

我发现这个问题被问过很多次,但原因总是与服务名称更改的版本 1.0.0 中所做的更改有关。我唯一能想到的是代码的缩小是问题所在,但据我所知,代码应该没问题,但我不是专家。任何帮助将不胜感激。

它是用 Coffeescript 编写的

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

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

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

编辑

在尝试在我的本地计算机上重现该问题时,我删除了下面 modules 数组中的 'ngIdle' 模块。这导致了相同的行为,所以我假设问题源于 ngIdle 模块未在此处正确加载。我仍然觉得缩小可能是导致问题的原因,但同样,我不确定为什么或如何解决它。

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

编辑 2

这是我收到的错误消息的完整输出

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)

一个经验法则是在每个使用它们的地方加载模块依赖项。这允许将它们解耦。这消除了服务提供商注入的竞争条件。

如果应用看起来像这样

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

Idle 服务的服务提供商在加载 vssApp.config 模块时未定义。

虽然这

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

避免竞争条件,但仍然指示代码味道。

应该是

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

此问题仅适用于服务提供商和配置阶段。可以为任何模块顺序注入服务实例。

终于找到原因和解决办法了,好像是bower的问题。

这是一个 Rails 应用程序,所以我在 bower.json 文件中指定了 ng-idle 1.2.1 但由于某些原因,在使用 Dokku 和最后一个部署应用程序时忽略了 bower 文件安装版本 0.3.5 仍然存在,这意味着仍然使用 1.0.0 ng-idle 之前的服务命名约定,其中所有服务名称都以 $ 开头。这导致 Unknown provider: IdleProvider 错误,因为 $IdleProvider 是实际的服务名称。

最后我不得不连接到 docker 容器并删除并重新安装所有 Bower 组件。 运行 bower update 作为部署的一部分由于某种原因还不够。当我有更多时间时,我会调查导致此行为的原因,并会在此处报告。