如何修复预期的响应包含一个数组但得到一个对象ANgular js

时间:2013-11-16 15:22:30

标签: javascript angularjs

我是新手,在调用服务后使用资源模块很难获得此错误。 任何人都可以在代码中修改我的错误,我错了或者只是修改了那些需要纠正的问题必须得到理解。

数据格式来了: -

[
    brands: Array[1]
    0: Object
    __v: 0
    _id: "5251a4a34f232fc3902"
    account_id: "525072320e32971b"
    name: "Fruits"
    __proto__: Object
    1: Object
    length: 2

    categories: Array[1]
        0: Object
        __v: 0
        _id: "5251a4a34f2323fc3902"
        account_id: "5250723230e32971b"
        name: "Fruits"
        __proto__: Object
        1: Object
        length: 2
]

错误: -

[$ resource:badcfg]资源配置错误。预期的响应包含一个数组但得到一个对象

itmsFormView.html

<select class="form-control" ng-model="item.brand_id" id="itemBrand" >
    <option value="">Select Brand</option>
    <option ng-repeat="brand in brands" value="{{brand.brand_id}}">{{brand.name}}  </option>
</select>



 <select class="form-control" ng-model="item.category_id" id="itemCategory">           

<option value="">Select Category</option>
       <option ng-repeat="category in categories" value="{{category.brand_id}}">{{category.name}}</option>
    </select>

ItemsService.js

app.factory('itemService', function ($resource) {
    return {
        getCategoryAndBrand   :  $resource("/user/categories_brands" ,{},{ TypeGetCategoryAndBrand:{method: 'get', isArray:true}})
    };
});

ItemsController.js

app.controller('itemsFormController', function ($rootScope, $scope, itemService, $location, $cookies, $routeParams) {
        itemService.getCategoryAndBrand.TypeGetCategoryAndBrand({}, function(response){
                console.log(response);

            },function(errorResponse){
                console.log(errorResponse);
            }
        );  
});

5 个答案:

答案 0 :(得分:16)

来自documentation

行动isArray

isArray – {boolean=} – If true then the returned object for this action is an array, see returns section.

根据你的代码isArray = true。将其设置为false,您可以使用对象而不是数组。

app.factory('itemService', function ($resource) {
return {
        getCategoryAndBrand   :  $resource("/user/categories_brands" ,{},{ TypeGetCategoryAndBrand:{method: 'get', isArray:true}})
    };
});

期望您将参数作为数组传递而不是对象

来自您的代码

$resource("/user/categories_brands" ,{},{ TypeGetCategoryAndBrand:{method: 'get', isArray:true}})

如果要相信文档而不是错误,我会尝试以数组的形式传递此文件而不是对象,以查看是否得到相同的响应。

答案 1 :(得分:7)

在我的情况下,API服务器返回一个被视为字符串的HTML页面(错误页面),而不是正确的JSON响应,它将是一个javascript对象。

作为旁注,javascript错误和堆栈跟踪确实存在。

答案 2 :(得分:4)

希望这个答案还不算太晚。

您不应该通过使用isArray:true语句来覆盖资源声明中“get”方法的性质来解决此问题。

有两种方法可以解决这个问题。

1.使用“查询”方法代替。它完全像“get”方法,但isArray自然地设置为true。

TypeGetCategoryAndBrand:{method: 'query'}

2.在服务器端,响应对象是一种更容易,更智能的方式。您可以继续在客户端使用“get”方法,并从中更改服务器端代码:

res.jsonp(articles);

where articles是结果数组,对此:

res.jsonp(articles[0]);

答案 3 :(得分:0)

您将获得一个包含两个数组的对象。

我的猜测是,在开始使用console.log输出之前,在代码中,您设置了categories = response;

您需要将其设置为: categories = response.categories;

下面:

app.controller('itemsFormController', function ($rootScope, $scope, itemService, $location, $cookies, $routeParams) {
        itemService.getCategoryAndBrand.TypeGetCategoryAndBrand({}, function(response){

                categories = response.categories;
                console.log(response);

            },function(errorResponse){
                console.log(errorResponse);
            }
        );  
});

这可能有助于理解这个问题:

AngularJS $resource query returns array with a function in it, which is not does not fit well when iterating through data

答案 4 :(得分:0)

the documentation的一个非常简单的解决方法:

app.factory('Article', ['$resource', function ($resource) {
    return $resource('/v1/a/:id', null,
        {
            'query':  {method:'GET', isArray:false},
            'update': { method:'PUT' }
        });
}]);