Viktor M.
Viktor M.

Reputation: 4613

TypeError: Cannot read property 'protocol' of undefined

I cannot understand why my factory for communication with REST API doesn't work. I receive the following errors:

TypeError: Cannot read property 'protocol' of undefined

and

TypeError: Cannot read property 'message' of undefined

todo.controller.js

'use strict';
angular
    .module('app')
    .controller('TodoController', ['$scope', 'todoFactory', function ($scope, todoFactory) {

        getTodos();

        function getTodos() {
            todoFactory.all()
                .success(function (todos) {
                    $scope.todos = todos;
                })
                .error(function (error) {
                    $scope.status = 'Unable to load todo data: ' + error.message;
                });
        }

    }]);

todo.factory.js

'use strict';
angular.module('app')
    .constant('API_URI', 'http://localhost:8080/api/todo')
    .factory('todoFactory', ['$http', function($http, API_URI) {

        var todoFactory = {};

        function getUrl() {
            return API_URI;
        }

        function getUrlForId(itemId) {
            return getUrl + itemId;
        }

        todoFactory.all = function () {
            return $http.get(getUrl());
        };

        todoFactory.fetch = function (id) {
            return $http.get(getUrlForId(id));
        };

        todoFactory.add = function (todo) {
            return $http.post(getUrl(), todo);
        };

        todoFactory.update = function (todo) {
            return $http.put(getUrlForId(id), todo)
        };

        todoFactory.delete = function (id) {
            return $http.delete(getUrlForId(id));
        };

        return todoFactory;
    }]);

However, if I will invoke simple $http.get(something) in the controller that works:

   $http.get('http://localhost:8080/api/todo').
        success(function(data) {
            $scope.todos = data;
        });

What I do wrong with my factory usage in comparison with simple direct $http.get() in controller?

Upvotes: 0

Views: 2585

Answers (1)

Davin Tryon
Davin Tryon

Reputation: 67296

With this syntax (for minification support):

.factory('todoFactory', ['$http', function($http, API_URI) {

You need to add 'API_URI' as a string as well (next to '$http')

.factory('todoFactory', ['$http', 'API_URI', function($http, API_URI) {

Otherwise, noting is injected in for the API_URI parameter.

Upvotes: 1

Related Questions