AngularJS Error: [$injector:unpr] Unknown provider: eProvider <- e <- $exceptionHandler <- $rootScope

AngularJS Error: [$injector:unpr] Unknown provider: eProvider <- e <- $exceptionHandler <- $rootScope

我突然在我们的 EC2 生产实例上看到这个错误。我部署了一个新版本并意识到错误。后来,我部署了早期版本,但问题没有得到解决。无论我之前部署的任何工作提交,都会出现错误。

问题已经解决,需要您注意源代码中的细节,因为它不像从浏览器控制台错误中指向代码中的特定行或其他人如何通过 break 解释调试那样容易点在浏览器开发者工具中。

每当你得到这样的错误,你应该剖析AngularJS错误中的信息如下:

Unknown provider: eProvider <- e <- $exceptionHandler <- $rootScope

  1. Unknown Provider 表示您有一个注入问题,可能是由您拥有的 angularjs 代码的缩小版本引起的。缩小的意思是,您编译的 angularjs 文件重命名了您注入到 angular 模块组件(控制器、服务、工厂、指令、装饰器等)之一的服务或变量。重命名(例如从 $delegate 到 e)可能会导致编译的缩小版本出现问题。是的,对解决问题没有多大帮助,但你应该确保你理解这一点。

  2. eProvider <- e 没有意义,因为这是你注入的对象得到的缩小名称,不要试图在你的代码库中搜索它.那没用。

  3. $exceptionHandler: 这是最大的提示。您需要找到具有使用此服务或对象的组件。其中之一导致了问题。导致此类问题的是如下所示:

some_module.module_component(function(myService) {...

要修复它,它应该如下所示:

some_module.module_component(["myService", function(myService) {...

它仍然让我感到困惑,为什么即使我将已部署的修订恢复到以前工作的修订,我仍然看到这个问题。 EC2 实例上编译后的 JS 文件似乎没有还原。

希望对您有所帮助。

错误是由缩小引起的。注入有两种语法,隐式和显式。

  1. 隐式注入通过变量名推断应该注入什么:

    some_module.module_component(function(myService) {...

这将寻找名为 myService 的东西并注入它,但是如果变量名被缩小为类似 "e" 的东西,它将无法找到任何名为 "e" 的服务,所以angular抱怨没有eProvider。

  1. 显式注入使用字符串来指定注入,并且从不缩小字符串:

    some_module.module_component(["myService", function(myService) {...

这将查找名为 myService 的内容并将其分配给 myService 变量,如果变量名称更改,这无关紧要,因为它仍然知道要查找 myService,即使它最终将其分配给名为 "e".

的变量