我是新手,在调用服务后使用资源模块很难获得此错误。 任何人都可以在代码中修改我的错误,我错了或者只是修改了那些需要纠正的问题必须得到理解。
数据格式来了: -
[
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);
}
);
});
答案 0 :(得分:16)
行动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);
}
);
});
这可能有助于理解这个问题:
答案 4 :(得分:0)
the documentation的一个非常简单的解决方法:
app.factory('Article', ['$resource', function ($resource) {
return $resource('/v1/a/:id', null,
{
'query': {method:'GET', isArray:false},
'update': { method:'PUT' }
});
}]);