"알 수 없는 공급자" 오류의 원인 찾기
다음의 에러가 표시됩니다.
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
'programing' 카테고리의 다른 글
"오류: 리듀서 실행 중에는 store.getState()를 호출할 수 없습니다." (0) | 2023.02.15 |
---|---|
작업 트리의 일부가 포함된 Git 사후 수신 후크 (0) | 2023.02.15 |
Spring의 GA, RC 및 M2 릴리즈의 차이점은 무엇입니까? (0) | 2023.02.15 |
XmlDocument - 문자열에서 로드하시겠습니까? (0) | 2023.02.15 |
개체를 JSON에 직렬화하는 방법 (0) | 2023.02.15 |