2015-04-15 4 views
0

Я читал ответы на подобные вопросы, но ни один из них не исправляет проблему, которую я вижу. Дано:ng-response save: ожидаемый ответ был объектом, получил массив

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 Ожидаемого ответ содержит объект, но получила массив».

Что бы это было хорошо, за исключением того, что, насколько я могу видеть, мой backend делает возвращает один объект. Испытано с завитком:

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 работает как ожидалось, возвращая массив пост-объектов. Любые подсказки относительно того, почему CreateCtrl может видеть массив, когда curl отлично работает?

ответ

1

Ну, это была моя собственная глупая ошибка, как обычно. Однако ошибка была немного «интересной» для интерпретации, поэтому в случае, если кто-то нападает на то же самое, вот резюме.

Мой API возвратил разные ответы по пути /post/, а не /post. /post/ функционирует так, как ожидалось, и это то, что я проверял с помощью завитка. Однако, когда я убрал слэш в завиток синтаксисе я вернулся:

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

и т.д. Из того, что я могу собрать, угловатые попытки сериализация это и в конечном итоге с массивом, следовательно, ошибки. Моя ошибка заключается в том, что вы не полностью проверяете бэкэнд, хотя в моей защите он отлично работает для запросов GET (оба /post/ и /post возвращают JSON). Из-за этого я спустился с ума, так как заметил, что Угловая лишала его.

В любом случае, надеюсь, это поможет кому-то застрять в той же дыре. Фиксирование находится в верхней части the API: $resource docs:

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

использование isArray: false

isArray – {boolean=} Если так, то возвращаемый объект для этого действия является массивом

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

+0

Я очень ценю, что вы нашли время ответить. Фактически, я считаю, что 'isArray' по умолчанию имеет значение false для' $ resource.save' (только '$ resource.query' имеет' isArray: true'), но это была хорошая мысль, и мне было предложено пересмотреть мой внутренний код , что привело к исправлению. Благодаря! –

Смежные вопросы