在缩小的javascript中调试未知提供程序

在缩小的javascript中调试未知提供程序,javascript,angularjs,Javascript,Angularjs,我很难确定angular应用程序中有哪些方法会导致错误: Uncaught Error:[$injector:unpr]未知提供程序:nProvider如评论中所述,这些是我尝试查找JS错误所采取的步骤 如果有其他更简单的解决方案,请随时发布,我可能会将其标记为已接受 试图调试缩小的代码是一场噩梦 我最终做的是直接从Chrome中的inspector复制我的缩小javascript 然后,我将JS粘贴到了——我已经尝试过了,但发现他们的站点被这么大的JS代码冻结了 一旦它“非常明确”,我在我的

我很难确定angular应用程序中有哪些方法会导致错误:


Uncaught Error:[$injector:unpr]未知提供程序:nProvider如评论中所述,这些是我尝试查找JS错误所采取的步骤

如果有其他更简单的解决方案,请随时发布,我可能会将其标记为已接受


试图调试缩小的代码是一场噩梦

我最终做的是直接从Chrome中的inspector复制我的缩小javascript

然后,我将JS粘贴到了——我已经尝试过了,但发现他们的站点被这么大的JS代码冻结了

一旦它“非常明确”,我在我的解决方案中创建了一个test.js文件,并将现在更容易阅读的代码粘贴到其中

快速注释掉我的
\u布局中的
@script
标记,并添加到test.js文件的链接,我已经准备好调试一个现在更容易阅读的Javascript块


遍历调用堆栈仍然非常困难,尽管现在您可以看到实际的方法,这使它变得不太可能了。

对于解决此问题的其他人,我找到了一个更简单的解决方案。如果打开开发者控制台(在chrome上),并在angular抛出错误的地方添加断点:

然后,在右边的堆栈跟踪上,单击您看到的第一个“invoke”。这将带您进入invoke函数,其中第一个参数是angular尝试注入的函数:

然后,我在我的代码中搜索了一个类似的函数(在本例中为
grep“\.onload”-R public
),并找到了8个地方进行检查


我希望这有帮助

对于阅读本文的任何人,使用Angular 1.3

现在可以使用Angular的ng严格di检查,如下所示:

<div ng-app="some-angular-app" ng-strict-di>
  ...
</div>

...

如果您没有使用数组语法加载依赖项,这将给您一条适当的错误消息。

我也遇到了同样的问题,我找到了一个解决方案,可以帮助其他人。我的建议基本上是我在评论和文档中看到的。如果您使用的是Angular 1.3.0或更高版本,则可以使用:

<html ng-app="myApp" ng-strict-di>
   <body>
      I can add: {{ 1 + 2 }}.
      <script src="angular.js"></script>
    </body>
</html>
最好在文档中记录


我希望这有帮助。祝你好运

我的工作方式如下:

1) 使两个测试规范html文件(单元测试)最小化且简单

2) 确保文件的绑定顺序与普通规范文件相同(JS脚本参考)

3) 确保显式声明所有依赖项(数组或$inject声明请参见)

当单元测试(模拟引用)文件出现错误时,我可以比较并确保文件的引用与工作文件的顺序正确


希望能有帮助。

帮助我解决这个问题的东西(最后!)实际上已经在文档中了!如果将
ng strict di
属性添加到定义
ng app
的代码中,angular将抛出一个严格警告,以便您可以更轻松地查看开发模式中的情况。我希望这是默认的

请参见ngApp文档底部的参数列表


我也遇到了类似的问题,花了很多时间进行调查,发现是Chrome扩展Batarang注入了错误代码,并且错误看起来完全一样。很遗憾,很难找到问题的确切原因。

我也有类似的问题。这个解决方案就是ozkary第3点的答案,即确保明确声明所有依赖项,包括路由的“解析”部分

下面是我的代码

当('/contact/:id'{
控制器:“contactCtrl”,
templateUrl:'assets/partials/contact.html',
决心:{
联系人:['ContactService','$route',函数(ContactService,$route){
返回ContactService.getContactDetail($route.current.params.id);
}]
}

})
适用于正在启动angularjs应用程序的用户

angular.bootstrap(body, ['app'], { strictDi: true });
别忘了在非精简代码中调试,您应该能够很快找出格式错误的依赖项注入

格式错误的注入通常如下所示:

...
.run([ function(ServiceInjected){
...
但看起来应该更像这样

...
.run(['ServiceInjected', function(ServiceInjected){
...   

这在angularjs 1.7.2中进行了测试

我猜minifier正在更改函数的参数名。由于DI项是通过字符串注册的(不是通过缩小来修改的),它们将不再匹配DI失败。是的,就是这样,尽管我的DI的所有(我可以看到)都是使用安全的方式完成的。只是似乎找不到一个不是…虽然不是解决方案;您可以包括angular+minified自定义代码的非精简版本。这将允许您在报告的错误上设置一个断点,并从那里回溯它(通过将怪异的命名函数与您自己的函数进行逻辑比较)。@MarvinSmit-这就是我目前正在做的-我使用了我的缩小JS并试图进行追踪-几乎不可能(无论如何,到目前为止),我发现了我们的问题。。我们有一个第三方指令——没有一个DI方法是安全的。调整好了,现在一切都好了。也许这个问题很少见,但你帮我省了几个小时的时间。非常感谢。这应该是答案!节省了我数小时的代码库搜索时间,考虑到我们在哪里犯了错误,这将是徒劳的。非常感谢!您的示例在未缩小的javascript中添加断点。OP在缩小js时遇到问题。如果错误只发生在缩小后,这将如何解决问题?@glyph我刚刚更改了我的构建过程,因此angular.js没有缩小,而其他所有的都没有缩小。这应该是公认的答案。它甚至变得更好:当您将鼠标悬停在
fn
上,看到带有
...
.run([ function(ServiceInjected){
...
...
.run(['ServiceInjected', function(ServiceInjected){
...