我突然在我们的 EC2 生产实例上看到这个错误。我部署了一个新版本并意识到了错误。之后,我部署了早期版本,但问题没有得到解决。无论我之前部署什么工作提交,都会出现错误。
2 回答
该错误是由缩小引起的。注入有两种语法,隐式和显式。
- 隐式注入通过变量名推断应该注入什么:
some_module.module_component(function(myService) {...
这将寻找名为 myService 的东西并注入它,但如果变量名被缩小为“e”之类的东西,它将无法找到任何名为“e”的服务,因此 angular 抱怨没有 eProvider。
- 显式注入使用字符串来指定注入,并且永远不会缩小字符串:
some_module.module_component(["myService", function(myService) {...
这将查找名为 myService 的内容并将其分配给 myService 变量,如果变量名称发生更改,则无关紧要,因为即使最终将其分配给名为“e”的变量,它仍然会知道查找 myService .
该问题已解决,需要您注意源代码中的细节,因为它不像从浏览器控制台错误中指向代码中的特定行或其他人如何通过浏览器开发人员中的断点解释调试那样简单工具。
每当你遇到这样的错误时,你应该剖析 AngularJS 错误中的信息,如下所示:
Unknown provider: eProvider <- e <- $exceptionHandler <- $rootScope
未知的提供者意味着您有一个注入问题,可能是由您拥有的 angularjs 代码的缩小版本引起的。缩小的意思是,您编译的 angularjs 文件已经重命名了您注入到您的 Angular 模块组件(控制器、服务、工厂、指令、装饰器等)之一的服务或变量。重命名(例如,从 $delegate 到 e)可能会导致编译的缩小版本出现问题。是的,对解决问题没有多大帮助,但您应该确保您理解这一点。
eProvider <- e没有任何意义,因为这是您注入的对象获得的缩小名称,不要尝试在您的代码库中搜索它。那不会有帮助的。
$exceptionHandler:这是最大的提示。您需要找到具有使用此服务或对象的组件的一个或多个模块。其中之一是导致问题。导致此类问题的问题如下所示:
some_module.module_component(function(myService) {...
并修复它,它应该如下所示:
some_module.module_component(["myService", function(myService) {...
它仍然让我感到困惑,为什么即使我将部署的修订版恢复为以前工作的修订版,我仍然会看到这个问题。似乎 EC2 实例上已编译的 JS 文件没有恢复。
我希望这有帮助。