AngularJs Error: [$injector:unpr] while attempting to inject $httpProvider to a service

AngularJs Error: [$injector:unpr] while attempting to inject $httpProvider to a service

我会尽量保持简短。基本上我有这个模块...

var mod1= angular.module("mod1", ['ngRoute', 'ngCookies']);

然后是服务、拦截器、工厂和控制器...

mod1.service("sessionService", sessionService);
mod1.factory("loginFactory", loginFactory);
mod1.controller("accountController", accountController);

sessionService 在一个单独的文件中,该文件基本上向本地存储中的会话信息公开了一些函数...

var sessionService = function ($httpProvider) {
    return {
        startSession: function (token) {
            localStorage.setItem('so_acc_token', token.access_token);
            localStorage.setItem('so_acc_token_type', token.token_type);

            $httpProvider.defaults.headers.common.Authorization = token.token_type + " " + token.access_token;
        },

        //a couple more functions, removed for clarity
        ...
    }
}

sessionService.$inject = ["$httpProvider"];

现在,loginFactory(据称在更多模块和工厂上)calls/depends 在此“单例”服务上。它也位于一个单独的文件中,看起来像这样...

var loginFactory = function ($http, $q, sessionService) {
    return function (u, p, g, c) {

        var deferredObject = $q.defer();
        var data = { grant_type: g, username: u, password: p };
        var transformRequest = function (d) {
            var t = [];

            for (var k in d) {
                t.push(encodeURIComponent(k) + "=" + encodeURIComponent(d[k]));
            }

            return t.join("&");
        };

        $http.post('http://whatever_url/token', 
            transformRequest(data), {
            headers: { "Content-Type": "application/x-www-form-urlencoded" }
        })
        .success(function (data) {
            //sessionService.startSession(data);
            deferredObject.resolve({ success: true });
        })
        .error(function () {
            //sessionService.endSession();
            deferredObject.resolve({ success: false });
        });

        return deferredObject.promise;
    }
}

loginFactory.$inject = ["$http", "$q", "sessionService"];

最后,当特定路由被命中时,帐户控制器被调用...控制器看起来像这样...

var accountController = function ($scope, $routeParams, $location, loginFactory) {
    $scope.loginForm = {
        userName: '',
        password: '',
        grant_type: 'password',
        loginFailure: false
    };

    $scope.signIn = function () {
        var result = loginFactory($scope.loginForm.userName,
            $scope.loginForm.password,
            $scope.loginForm.grant_type);

        result.then(function (result) {
            if (result.success) {
                if ($scope.loginForm.returnUrl !== undefined) {
                    $location.path($scope.loginForm.returnUrl);
                }
                else {
                    $location.path('/');
                }
            }
            else {
                $scope.loginForm.loginFailure = true;
            }
        });
    };

};

accountController.$inject = ['$scope', '$routeParams', "$location", "loginFactory"];

但是,当从 accountController 调用 signIn 方法时,我得到以下错误...

 Error: [$injector:unpr] http://errors.angularjs.org/1.3.0/$injector/unpr?p0=%24httpProviderProvider%20%3C-%20%24httpProvider%20%3C-<div ng-view="" class="ng-scope">essionService%20%3C-%20loginFactory

我认为这与我将 $httpProvider 注入服务的方式有关,但我很难理解原因。所以,我的问题是...

我到底哪里错了?为什么?

P.S。对于问题的长度,我很抱歉,但我想为其添加一些上下文

提供程序只能在配置阶段使用。一旦该阶段完成,服务就从提供者创建,并且提供者不能再被使用。 所以在服务中注入提供者是不可能的。

要解决您的特定问题,只需注入 $http 服务即可:headers 可以直接在该服务上进行配置。 Documentation:

The defaults can also be set at runtime via the $http.defaults object in the same fashion. For example:

module.run(function($http) {
    $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'
});