【问题标题】:Expected response to be an object, but it is预期的响应是一个对象,但它是
【发布时间】:2014-01-23 06:57:35
【问题描述】:

使用 resource.get() 我得到这个错误:

“资源配置错误。预期响应包含一个对象但得到一个数组”。

如果我将资源配置为期望一个数组,我会得到这个:

“资源配置错误。预期响应包含一个数组但得到一个对象”

如果我转储 Advanced Rest Client 的响应,我会返回以下内容:

{
    "Note": {
        "id": "1",
        "clas": "test",
        "obj_id": null,
        "note": "test"
    }
}

这对我来说就像一个对象。奇怪的是该页面仍然可以正常工作。但是我在控制台中得到了那个错误。

工厂:

angular.module('app').factory('Notes', function($resource) {
    var notes = $resource('/index.php/notes/:id.json');
    return {
        get: function(id, success) { notes.get({id:id}, function(resp) { success(resp.Note); }); },
        query: function() { return notes.query(); }
    }
});

控制器

angular.module('app').controller('NotesCtrl',
    function($scope, $stateParams, $state, $location, Notes) {
        Notes.get($stateParams.id,
            function(note) {
                $scope.note = note;
            },
            function(note) {
                console.log('error');
                console.log(note);
            }
        );
    });

该资源是使用 CakePHP 构建的,这是 bake 为您制作的正在序列化的 vanilla 视图函数。

【问题讨论】:

  • 如果我们能看到一个plunker会更容易。在此之前,什么可能完全不在墙上,但我想我还是会问:你能改变你的 json 中的标签吗?在解析 json 时,“note”的重复是否有可能导致混淆?
  • 我不知道如何欺骗 plunker 的 api 调用。不过我可以用代码更新。
  • 哦,php。这是欺骗 api 的最简单方法:plnkr.co/edit/46V2g8rlrwlrAxsZ81dX?p=preview。只需创建另一个将 json 放在范围内的控制器,然后在其上运行工厂。 (替代方法是创建一个静态 json 文件并调用它。)这将让您检查是否是 json 本身触发了错误,如果不是,至少将其从罪魁祸首列表中剔除。
  • 这是个好主意。我尝试了静态 json 的想法,它工作得很好。我还尝试了一个全新的 Cake 安装,它只剩下我想要的一个对象,而且效果也很好。我认为我的蛋糕安装有问题。
  • 是的,我以前从 php 那里得到过那种疯狂。我不确定我会说它本身就是蛋糕。这可能更多是因为 php 本身不会说 json,所以它很容易弄乱它,然后 angular throws 适合。祝你好运!

标签: angularjs angularjs-resource


【解决方案1】:

我想只是让其他有类似情况的人都知道有一个解决方案(或者至少是一个解决方案),我会在这里做一个正式的回答。看到 php 本身不讲 json,它可以生成 angular 无法解析的有问题的 json。为了确保问题不是(或者是)json,绕过 php 并欺骗 json。

要欺骗 api,请创建一个新控制器并将预期的 json 插入范围。

app.controller('NoteCtrl', function($scope) {
    $scope.allNotes = [{
        "Note": {
            "id": "1",
            "clas": "test",
            "obj_id": null,
            "note": "test"
        }       
    }];
});

用这个新范围替换对 api/json 的任何引用,即更改

var notes = $resource('/index.php/notes/:id.json'); 

到:

var notes = $scope.allNotes;

...然后测试。如果一切顺利,那么这不是你的角度也不是你的 json,它可能是你的 php.ini 文件。这至少可以缩小故障排除思路的范围。

【讨论】:

  • 将此标记为答案,因为它使我遇到了真正的问题。我认为问题实际上出在 ui-router 中。问题是每次页面加载它都会加载控制器两次。第一次传入的 id 为空,所以它尝试从 cake 中提取索引。我所要做的就是在调用资源之前检查 id。我将与 ui-router 团队一起讨论这个问题,看看我是否能得到真正的解决方案。感谢@kl02 的所有帮助。
【解决方案2】:

我收到此错误是因为我在同一个 Angular.js 控制器中有两个请求:

 function UserCtrl($scope, $resource, $routeParams, API) {
   $scope.users = API.Users.query();
   $scope.user = API.Users.get({ id:$routeParams.id });
 };

所以在一个页面上,你会得到错误,但在另一个页面上不会。

这是实现它的另一种方法(反映了第 11 步的电话教程 - http://docs.angularjs.org/tutorial/step_11):

<div class="container" style="border:solid 1px grey">
  <div ng-view>
  </div>
</div>

<script>
  var app = angular.module('myApp', ['ngRoute', 'ngResource']);

  app.config(function($routeProvider) {
    $routeProvider.when('/users/', { templateUrl: 'assets/users/index.html', controller: UserListCtrl });
    $routeProvider.when('/users/:id', { templateUrl: 'assets/users/show.html', controller: UserCtrl });
 });

  app.factory('API', ['$resource', function($resource) {
    return {
      Users: $resource('/users/:id.json')
    };
  }]);

  function UserListCtrl($scope, $resource, API) {
    $scope.users = API.Users.query();
  };

  function UserCtrl($scope, $resource, $routeParams, API) {
    $scope.user = API.Users.get({ id:$routeParams.id });
  };

</script>

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2022-01-02
    相关资源
    最近更新 更多