programing

"알 수 없는 공급자" 오류의 원인 찾기

newsource 2023. 2. 15. 22:05

"알 수 없는 공급자" 오류의 원인 찾기

다음의 에러가 표시됩니다.

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

는 이것이 최소화 과정으로 인해 야기되고 있다는 것을 알고 있고 이유를 이해한다.그러나 실제로 문제의 원인이 되고 있는 파일을 쉽게 판별할 수 있는 방법이 있을까요?

Angular 1.3.x에는 ng-app 디렉티브와 같은 요소에 배치된ng-strict-di 디렉티브가 있습니다.이 요소는 종속성에 주석을 달지 않을 때마다 앱에서 오류를 발생시킵니다.아직 문제가 되는 코드의 회선 번호는 알 수 없지만, 그 파라미터(즉, 함수($scope, myServiceName))와 함께 함수가 표시됩니다.이러한 함수는 적절한 코드 편집으로 매우 빨리 찾을 수 있을 만큼 충분히 고유합니다.

명령어 ng-strict-di의 개요.

질문을 이해했고 답을 찾았어요. 약간 난해할 뿐이죠.

제가 문제를 발견한 방법은 모든 식별자의 이름을 변경하여 모두 고유하게 만드는 것입니다. 그러면 컴파일된 Javascript에서 찾을 수 있는 유용한 정보를 얻을 수 있습니다.

수정된 버전의 uglify 다운로드(풀 요청 보류 중...)

brew install node노드가 설치되어 있지 않은 경우.

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

이제 컴파일된 js를 다음으로 바꿉니다.new.min.js문제를 재현하기 위해 앱을 로드하면 n4536과 같은 의존성 주입 오류가 발생합니다.

당신의 에디터가 매우 긴 행으로 훌륭하다면 new.min.js를 로드하기만 하면 됩니다.n4536을 찾으면 범인을 특정하는데 도움이 될 것입니다.

그렇지 않은 경우 문제를 둘러싼 컨텍스트를 출력할 수 있습니다. egrep -o '.{199}n4536.{99}' new.min.js

Angular의 인젝터는 다음과 같은 세 가지 방법으로 종속성을 해결할 수 있습니다.

1. 함수 인수 이름에서 종속성을 추론합니다.이것은 모든 각도의 예에서 가장 많이 사용됩니다.

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

이 경우 인젝터 캐스트는 문자열로서 기능하며 인수 이름을 해석하고 해당 이름에 일치하는 서비스/팩토리/any-else를 찾습니다.

2. 인라인 주석또, 다음의 구문이 표시되는 일이 있습니다.

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

이 경우 필요한 종속성의 이름을 명시적으로 기술하기 때문에 주입기가 훨씬 쉬워집니다.이름은 따옴표로 묶고 js 미니어는 코드의 문자열을 수정하지 않습니다.

3. 속성으로서의 인라인 주석.컨트롤러를 함수로 정의하는 경우 특정 속성에 주석을 설정할 수 있습니다.$inject:

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

이 경우, 의존 관계도 명시적으로 기술합니다.

솔루션 No.1을 사용하고 있는 것 같습니다.미니어가 암묵적으로 정의된 의존관계 이름을 변경하면 인젝터는 함수의 의존관계를 알 수 없게 됩니다.이 문제를 해결하려면 종속성에 주석을 다는 두 번째 또는 세 번째 방법을 사용해야 합니다.

이러한 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])

언급URL : https://stackoverflow.com/questions/22197191/finding-the-cause-of-unknown-provider-errors