角度资源:错误:$ resource:badcfg

时间:2017-02-28 14:55:23

标签: javascript html angularjs angularjs-resource

我在这里看过其他帖子,但仍然无法解决我的问题。

我收到错误:

  

$ resource:badcfg响应与配置的参数

不匹配

我认为这个错误是由它返回一个数组而不是一个对象引起的,反之亦然。

这是我的代码:

在我的工厂内(我添加了isArray:false但仍然没有运气)

var task = $resource('http://localhost:5000/task/:id', {id:'@id'}, {
    'get': {method:'GET', isArray: false},
}); 

然后在我工厂的返回部分

    find: function(id){
      return task.get({ id: id });
    }

在我的Flask服务器中,它在我加载页面时执行正确的响应:

127.0.0.1 - - [28/Feb/2017 14:35:13] "GET /task/1 HTTP/1.1" 200 -

但是我仍然收到错误?

如果我把它放在浏览器中,这也是我的服务器提供的 http://localhost:5000/task/1

[{"completed": true, "id": 1, "ownerName": "Ryan", "task": "Test Activity", "title": "A test task"}]

我也试过这个并得到同样的错误:

console.log(task.get({ id: 1 }));

3 个答案:

答案 0 :(得分:1)

  

$resource服务期望响应可以作为数组反序列化但接收对象时,会发生此错误,反之亦然。默认情况下,所有资源操作都需要对象,但需要数组的query除外。

     

要解决此错误,请确保您的$resource配置与从服务器返回的数据的实际格式相匹配。

     

--AngularJS Error Reference - $resource:badcfg

$ resource的默认操作是:

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

避免更改默认方法:

var task = $resource('http://localhost:5000/task/:id', {id:'@id'}, {
    //AVOID changing default
    //'get': {method:'GET', isArray: true},
});

而是使用query操作方法:

find: function(id){
  //return task.get({ id: id });
  //INSTEAD use query action method
  return task.query({ id: id });
}

这样可以避免让熟悉$ resource服务约定的程序员感到困惑。

有关详细信息,请参阅AngularJS $resource API Reference

使用transformResponse从数组中提取对象

如果服务器错误地返回数组中包含的资源对象,则可以使用响应转换函数提取它:

var task = $resource('http://localhost:5000/task/:id', {id:'@id'}, {
    'get': {method:'GET',
            transformResponse: function(json) {
                var data = angular.fromJson(json);
                if ((typeof data == 'array' && (data.length == 1)) {
                   return data[0];
                } else {
                   return data;
                };
            } 
     }
});

答案 1 :(得分:0)

你尝试过类似的事情吗?

var task = $resource('http://localhost:5000/task/:id', {id:'@id'}, {
    'get': {method:'GET', isArray: false},
  });

您错过了{id:'@ id'}来传递参数ID

答案 2 :(得分:0)

原来我需要将isArray:false设置为true 这样:

  var task = $resource('http://localhost:5000/task/:id', {id:'@id'}, {
    'get': {method:'GET', isArray: true},
  });