The [$injector:unpr]
Unknown Provider error occurs in AngularJS when Angular cannot find or inject a dependency (service, factory, provider, etc.) into a component. This typically happens due to issues in dependency injection (DI).
1. Understanding [$injector:unpr]
Error
Error Message in Console:
Error: [$injector:unpr] Unknown provider: myServiceProvider <- myService
What This Means:
- AngularJS is trying to inject
myService
, but it cannot findmyServiceProvider
. - This usually happens when:
myService
is not defined.- The service is not registered properly.
- A misspelling in service name or dependency injection syntax.
2. Common Causes & Fixes
1. Service is Not Defined Before Usage
Issue:
If myService
is not properly defined before using it, AngularJS cannot inject it.
Incorrect Code:
angular.module('myApp', [])
.controller('MyController', function(myService) { // myService is not defined yet
myService.doSomething();
});
Fix:
Define myService
before using it:
angular.module('myApp', [])
.service('myService', function() {
this.doSomething = function() {
console.log('Service is working!');
};
})
.controller('MyController', function(myService) { // Now it is defined
myService.doSomething();
});
2. Service is Not Registered in the Correct Module
Issue:
If myService
is defined in a different module that is not injected into myApp
, AngularJS won’t recognize it.
Incorrect Code (Module Not Injected):
angular.module('serviceModule', [])
.service('myService', function() {
this.doSomething = function() {
console.log('Service is working!');
};
});
angular.module('myApp', []) // 'serviceModule' is missing here
.controller('MyController', function(myService) {
myService.doSomething();
});
Fix:
Inject the correct module into myApp
:
angular.module('serviceModule', [])
.service('myService', function() {
this.doSomething = function() {
console.log('Service is working!');
};
});
angular.module('myApp', ['serviceModule']) // Include 'serviceModule'
.controller('MyController', function(myService) {
myService.doSomething();
});
3. Misspelling the Service Name
Issue:
AngularJS is case-sensitive. If there is a typo in the service name, Angular won’t find it.
Incorrect Code (Spelling Mistake):
angular.module('myApp', [])
.service('MyService', function() { // Capital 'M'
this.doSomething = function() {
console.log('Service is working!');
};
})
.controller('MyController', function(myservice) { // Lowercase 'm'
myservice.doSomething(); // Error!
});
Fix:
Use consistent spelling and casing:
angular.module('myApp', [])
.service('myService', function() {
this.doSomething = function() {
console.log('Service is working!');
};
})
.controller('MyController', function(myService) { // Match the correct case
myService.doSomething();
});
4. Incorrect Dependency Injection in Minified Code
Issue:
AngularJS relies on function parameter names for DI. When minified, parameter names change, breaking DI.
Incorrect Code:
angular.module('myApp', [])
.service('myService', function() {
this.doSomething = function() {};
})
.controller('MyController', function(myService) {
myService.doSomething();
});
When Minified, it Becomes:
.controller('MyController', function(a) { // 'myService' becomes 'a', breaking DI
a.doSomething();
});
Fix: Use array-style injection to prevent this issue:
angular.module('myApp', [])
.service('myService', function() {
this.doSomething = function() {};
})
.controller('MyController', ['myService', function(myService) {
myService.doSomething();
}]);
5. Using provider
Instead of service
or factory
Incorrectly
Issue:
Providers in AngularJS need an explicit .get()
method when being injected.
Incorrect Code:
angular.module('myApp', [])
.provider('myService', function() {
this.doSomething = function() {
console.log('This will not work!');
};
})
.controller('MyController', function(myService) { // Error!
myService.doSomething();
});
Fix:
Use .get()
inside $get
when defining a provider:
angular.module('myApp', [])
.provider('myService', function() {
this.$get = function() {
return {
doSomething: function() {
console.log('Now it works!');
}
};
};
})
.controller('MyController', function(myService) {
myService.doSomething();
});
If you don’t need advanced configurations, use service
or factory
instead of provider
.
6. Factory/Service Not Returning an Object
Issue:
Factories and services must return an object or function for dependency injection to work.
Incorrect Code (No Return Statement in Factory):
angular.module('myApp', [])
.factory('myService', function() {
var data = "This will not work!";
})
.controller('MyController', function(myService) {
console.log(myService); // Undefined
});
Fix:
Ensure the factory returns an object:
angular.module('myApp', [])
.factory('myService', function() {
return {
data: "Now it works!"
};
})
.controller('MyController', function(myService) {
console.log(myService.data); // Outputs: "Now it works!"
});
3. Debugging Steps in Chrome DevTools
Step 1: Check the Console for Errors
- Open Developer Tools (F12) → Go to Console
- Look for
[$injector:unpr]
errors and identify the missing service
Step 2: Manually Check if the Service is Registered Run this in the browser console:
angular.module('myApp')._invokeQueue
- Look for
myService
in the output. If missing, the module might not be loaded.
Step 3: Verify Script Load Order
- Open the Network tab and check if all required JavaScript files are loaded.
Step 4: Check the Dependency Injection Syntax
- Use array-style injection (
['myService', function(myService) { ... }]
) to avoid minification issues.