ng-response save:预期响应是对象,得到一个数组

时间:2015-04-15 08:45:17

标签: angularjs

我已经在这里阅读了类似问题的答案,但似乎没有一个能够解决我所看到的问题。给出:

var app = angular.module("eg", ["ngResource", "postAPI"]);

var postAPI = angular.module("postAPI", ["ngResource"]);

postAPI.factory("Post", ["$resource", 
    function postFactory(resource) {
        return resource("/post");
    }
]);

postAPI.controller("PostIndexCtrl", ["$scope", "Post",
    function($scope, Post) {
        Post.query(function(data) {
            $scope.response = data;
        });
    }
]);

postAPI.controller("CreateCtrl", ["$scope", "Post",
    function($scope, Post) {
        Post.save({
            title: "Title",
            body: "Body",
            tags: ["one", "two", "three"],
        });
    }
]);

收到错误(docs):“操作save的资源配置出错。包含对象但得到数组的预期响应”。

哪个会好的,除了我可以看到我的后端 返回一个对象。用curl测试:

curl -H "Content-Type: application/json" -X POST -d '{"title":"foo","body":"bar","tags":["wombat"]}' http://localhost:8080/post/

响应:

{"title":"foo","body":"bar","tags":["wombat"],"created":"...","modified":"...","id":12345}

(为简洁起见,编辑格式相同)。 PostIndexCtrl按预期工作,返回一个post对象数组。关于为什么CreateCtrl在curl工作正常时可能会看到数组的任何线索?

2 个答案:

答案 0 :(得分:1)

使用isArray: false

isArray – {boolean=}如果为true,则此操作的返回对象是数组



return $resource("/post", {}, {
  'query': {
    method: 'GET',
    isArray: false
  },
  'get': {
    method: 'GET',
    isArray: true
  }
});




答案 1 :(得分:1)

嗯,这是我常见的愚蠢错误。然而,错误有点'有趣'来解释,所以如果有人在同一事情发生同样的事情,这里是一个总结。

我的API针对路径/post/返回了不同于/post的不同回复。 /post/按预期运行,这就是我用curl检查的内容。但是当我在curl语法中删除尾部斜杠时,我回来了:

<html>
    <head>
        <title>404 Not Found</title>
    </head>
<body>
...

等。从我可以收集到的,角度尝试序列化这个并最终得到一个数组,因此错误。我没有彻底测试后端我的错,尽管在我的辩护中它适用于GET请求(/post//post返回JSON)。因此,自从我注意到Angular正在剥离它之后,我采取了尾随斜线。

无论如何,希望这可以帮助那些陷入同一个洞的人。修复程序位于the API: $resource docs

的顶部
app.config(['$resourceProvider', function($resourceProvider) {
    // Don't strip trailing slashes from calculated URLs
    $resourceProvider.defaults.stripTrailingSlashes = false;
}]);