Error: [$resource:badcfg] Error in resource configuration. Expected response to contain an array but got an object?

Angularjs

Angularjs Problem Overview


How fix Error:

> [$resource:badcfg] Error in resource configuration. Expected response > to contain an array but got an object?

// Service

   angular.module('admin.services', ['ngResource'])       
    // GET TASK LIST ACTIVITY
    .factory('getTaskService', function($resource) {
        return $resource('../rest/api.php?method=getTask&q=*',{ 'get':    {method:'GET'}});
    })

// Controller

$scope.getTask = getTaskService.query(function (response) {
    angular.forEach(response, function (item) {
        if (item.numFound > 0) {
            for(var i = 0; i < item.numFound; i++) {

                $scope.getTasks[i] = item.docs[i];

            }

        }
    });

});

Angularjs Solutions


Solution 1 - Angularjs

Also, if your service is sending an object instead of an array add isArray:false to its declaration.

'query': {method: 'GET', isArray: false }

Solution 2 - Angularjs

$resource("../rest/api"}).get();

returns an object.

$resource("../rest/api").query();

returns an array.

You must use :

return $resource('../rest/api.php?method=getTask&q=*').query();

Solution 3 - Angularjs

First of all you should configure $resource in different manner: without query params in the URL. Default query parameters may be passed as properties of the second parameter in resource(url, paramDefaults, actions). It is also to be mentioned that you configure get method of resource and using query instead.

Service

angular.module('admin.services', ['ngResource'])       
  // GET TASK LIST ACTIVITY
  .factory('getTaskService', function($resource) {
    return $resource(
      '../rest/api.php',
      { method: 'getTask', q: '*' }, // Query parameters
      {'query': { method: 'GET' }}
    );
  })

Documentation

http://docs.angularjs.org/api/ngResource.$resource

Solution 4 - Angularjs

In order to handle arrays with the $resource service, it's suggested that you use the query method. As you can see below, the query method is built to handle arrays.

    { 'get':    {method:'GET'},
      'save':   {method:'POST'},
      'query':  {method:'GET', isArray:true},
      'remove': {method:'DELETE'},
      'delete': {method:'DELETE'} 
   };

User $resource("apiUrl").query();

Solution 5 - Angularjs

Make sure you are sending the proper parameters too. This happened to me after switching to UI-Router.

To fix it, I changed $routeParams to use $stateParams in my controller. The main issue was that $stateParams was no longer sending a proper parameter to the resource.

Solution 6 - Angularjs

For anyone coming here in 2021, another way this request may look is as follows (at least it was in our app)

angular.module('load').factory('StateService', ['$resource', 'store', function($resource, store) {
	return $resource('/some/url', {}, {
        fetchAllStateCodes: {
            method: 'GET',
            isArray: true,  // Response is an array of objects
			headers: {
                "Authorization": "Bearer " + store.get("jwt"),
                "Content-type": "application/json"
            }
        }
    });
}]);

From all of the good answers, it still wasn't obvious to me as to where to put the isArray flag...

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionnocView Question on Stackoverflow
Solution 1 - Angularjsuser1932958View Answer on Stackoverflow
Solution 2 - AngularjsKarim OukaraView Answer on Stackoverflow
Solution 3 - AngularjsVadimView Answer on Stackoverflow
Solution 4 - AngularjsHitesh ModhaView Answer on Stackoverflow
Solution 5 - AngularjsAlaa AwadView Answer on Stackoverflow
Solution 6 - AngularjsAdam HughesView Answer on Stackoverflow