AngularJs错误:[$ injector:unpr]尝试将$ httpProvider注入服务时

时间:2015-05-23 11:56:28

标签: angularjs angular-services

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

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(假设更多的模块和工厂)调用/取决于这个“单例”服务。它也位于一个单独的文件中,看起来像这样......

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"];

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

 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。对于问题的篇幅我很抱歉,但我想为它添加一些上下文

1 个答案:

答案 0 :(得分:3)

提供商只能在配置阶段使用。完成该阶段后,将从提供程序创建服务,并且不再使用提供程序。 因此,无法在服务中注入提供程序。

要解决您的特定问题,只需注入$ http服务:可以直接在服务上配置标头。 MSDN

  

默认值也可以在运行时通过$ http.defaults对象以相同的方式设置。例如:

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