查找“未知提供程序”错误的原因

时间:2014-03-05 12:02:48

标签: angularjs minify

我收到以下错误:

Error: [$injector:unpr] Unknown provider: nProvider <- n

我知道这是由缩小过程引起的,我理解为什么。但是,是否有一种简单的方法可以确定哪个文件实际导致了问题?

4 个答案:

答案 0 :(得分:27)

Angular 1.3.x有一个ng-strict-di指令,它与ng-app指令放在同一个元素上。此元素会导致应用程序在未注释依赖项时抛出错误。虽然它仍然没有给你提供违规代码的行号,但它确实为你提供了带有参数的函数(即函数($ scope,myServiceName)),这个函数非常独特,你可以很快找到它。一个很好的代码编辑。

对指令的概述:ng-strict-di

答案 1 :(得分:7)

我理解这个问题而且我有一个答案,它只是有点令人费解。

我发现问题的方法是重命名所有标识符以使它们都是唯一的,然后你会在编译的javascript中找到有用的东西,希望能指出你的罪魁祸首。

下载我uglify的修改版本(拉请求等待...)

brew install node如果您没有安装节点。

./bin/uglifyjs --unique_ids original.min.js >new.min.js

现在用new.min.js替换已编译的js并加载您的应用以重现问题 现在你应该得到一个依赖注入错误,如n4536

如果你的编辑器很棒,超长线你可以加载new.min.js,寻找n4536,希望能帮助你找出罪魁祸首。

如果没有,这将打算围绕问题打印一些上下文。 egrep -o '.{199}n4536.{99}' new.min.js

答案 2 :(得分:6)

Angular的注入器有3种方法可以解决依赖关系:

<强> 1。从函数参数名称中推断出依赖关系。这在所有角度的例子中最常用,例如

app.controller('MyController', function($scope, MyService) { ... });

在这种情况下,注入器将函数转换为字符串,解析参数名称并查找与该名称匹配的services / factories / anything-else。

<强> 2。内联注释。您可能还会遇到以下语法:

app.controller('MyController', ['$scope', 'MyService', function($scope, MyService) { ... }]);

在这种情况下,您可以使注入器更容易,因为您明确说明了所需的依赖项名称。名称用引号括起来,js minifiers不修改代码中的字符串。

第3。内联注释作为属性。如果将控制器定义为函数,则可以在特殊属性$inject中设置注释:

function MyController($scope, MyService) {...}
MyController.$inject = ['$scope', 'MyService'];

在这种情况下,我们还明确说明了依赖关系。

我的猜测是你正在使用解决方案。 1.一旦minifier更改了隐式定义的依赖项的名称,注入器就不再知道你的函数的依赖性是什么。要解决这个问题,你应该使用第二种或第三种注释依赖关系的方式。

答案 3 :(得分:3)

虽然如果你不知道在哪里看,似乎没有任何好方法来调试这些DI问题,但我有一种感觉我的处于一个不太明显的地方......它是:

App.Services = angular.module('spokenvote.services', ['ngResource', 'ngCookies'])
    .config(servicesConfig)
    .run(($rootScope, $location) -> $rootScope.location = $location)

需要:

App.Services = angular.module('spokenvote.services', ['ngResource', 'ngCookies'])
    .config(servicesConfig)
    .run(['$rootScope', '$location', ($rootScope, $location) -> $rootScope.location = $location])