2015-06-05 3 views
1

Я знаю, что этот вопрос уже существует на SO (как здесь: Error in resource configuration. Expected response to contain an object but got an array), и даже если я уже сталкивался с этой ошибкой несколько дней назад, я не нашел почему я получаю это сейчас.

С одной стороны, у меня есть RESTful API в Node Express. Это дает мне доступ к базе данных, где я пытаюсь получить некоторые данные. При использовании конкретного $resource запроса, я получаю эту JSON (протестировано с Postman):

[ 
    { 
    "ref": 2, 
    "type": "string here", 
    "matriculeMD": 4567, 
    "name": "William", 
    "date": "2016-09-14T22:00:00.000Z", 
    "client": 1 
    }, 
    { 
    "ref": 4, 
    "type": "string here", 
    "matriculeMD": 1589, 
    "name": "Averell", 
    "date": "0000-00-00", 
    "client": 1 
    } 
] 

С другой стороны, у меня есть приложение Угловая JS. Это один использовать завод, чтобы получить данные от API:

.factory('Things', ['$resource', function($resource) { 

    return $resource(

     'api_url/:client_id', 
     {client_id: '@client_id'}, // getting some data from an ID 
     {'query' : { 
         method : 'GET', // ofc, it's a get request in the API 
         isArray : false // to be sure to get an object and not an array 
        } 
     } 

У меня также есть контроллер, который использует этот завод, пытается выполнить запрос с парами:

app.controller('ctrl', ['$scope','Things', function ($scope,$things) 

    { 
     $scope.thing = $things.query({},{'client_id':'1'}); 
     // replacing '@client_id' from factory with 1. I also tried with quoteless 1. 
    } 
]); 

И, наконец, У меня есть html-представление, где я пытаюсь использовать данные, которые я должен получить в $scope.thing с некоторыми <div ng-repeat'thing in things'>{{thing.ref}}</div>.

Прочитав другие сообщения, я был уверен, что добавление на заводе isArray : false устранит проблему, поскольку она уже зафиксировала его на другом заводе.

Любая идея?

Редактировать: Спасибо за ваши ответы. Я изменил свой заводской код с:

.factory('Things', ['$resource', function($resource) { 

     return $resource(

      'api_url/:client_id', 
      {client_id: '@client_id'}, // getting some data from an ID 
      {'query' : { 
          method : 'GET', // ofc, it's a get request in the API 
          isArray : true // 
         } 
      } 

И исправлена ​​ошибка. Теперь я работаю над другой проблемой с моим $scope содержимым, которое не определено и отправлено $promise : Promise, $resolved : Resolved. Я читал $resource doc, чтобы понять, что это значит, но я до сих пор не знаю, как заставить его работать.

+0

Так что ваш API возвращает массив после всего? isArray не будет преобразовывать данные, он просто подскажет, какую структуру данных ожидать. – doldt

ответ

0

Как уже сказал дольдт, вы на самом деле ожидаете массив.

Ваш ответ представляет собой массив объектов.

Либо вы меняете isArray на true, либо вы изменяете ответ на сервере для возврата объекта.

После того, как вы это изменились, вы можете использовать свой ресурс на контроллере таким образом (при условии обратного вызова для $ ресурса, так как вы теперь имеете дело с обещаниями):

$things.query({}, { 'client_id' : '1' }, function(response){ 
    $scope.thing = response; 
}); 
+0

Так что я могу сделать в этом случае? Изменение способа использования данных в html-файле? – Arhyaa

+0

@Arhyaa вызывает вашу службу как '$ scope.things = $ things.query ({}, {'client_id': '1'}); 'и затем вы можете выполнить итерацию в html-шаблоне, как вы написали'

{{thing.ref}}
'. Конечно, установите 'isArray' в true. – kTT

+0

Просто измените isArray на true :) – avcajaraville

0

Я думаю, что вы делаете неправильный с isArray флаг. Это должно быть true если вы отправляете массив.

Попробуй ....

+0

Спасибо, это уже было сказано в комментариях. В коде больше нет ошибок, но я в настоящее время не могу использовать то, что получаю. Когда я показываю '$ scope.thing', я получаю' $ обещание: обещание, $ разрешено: разрешено', а содержимое '$ scope' не определено. Я хочу отредактировать свой первый пост :) – Arhyaa

+0

попробуйте этот $ things.query ({}, {'client_id': '1'}). $ Prom.then (функция (данные) { $ scope.thing = data; }); –

+0

Я сделал что-то подобное раньше, чтобы использовать данные области, как только будет установлено обещание, но это ничего не изменило, как ваше решение. Могу ли я пропустить что-то еще, в моей структуре приложения или что-то в этом роде? – Arhyaa

0

// Code goes here 
 

 
var myApp = angular.module('myApp', ['ngResource']); 
 

 
myApp.factory('Things', ['$resource', 
 
    function($resource) { 
 

 
    return $resource(
 

 
     'data/sample.json' 
 
     //, { 
 
     // client_id: '@client_id' 
 
     //}, // getting some data from an ID 
 
     //{ 
 
     // 'query': { 
 
     // method: 'GET', // ofc, it's a get request in the API 
 
     // isArray: true // to be sure to get an object and not an array 
 
     // } 
 
     //}) 
 
    ) 
 
    } 
 
]); 
 

 
myApp.controller('myCtrl', function($scope, Things) { 
 

 
    Things.query({}, { 
 
    'client_id': '1' 
 
    }).$promise.then(function(data) { 
 
    $scope.thing = data; 
 
    console.log($scope.thing); 
 
    }) 
 
});
[ 
 
    { 
 
    "ref": 2, 
 
    "type": "string here", 
 
    "matriculeMD": 4567, 
 
    "name": "William", 
 
    "date": "2016-09-14T22:00:00.000Z", 
 
    "client": 1 
 
    }, 
 
    { 
 
    "ref": 4, 
 
    "type": "string here", 
 
    "matriculeMD": 1589, 
 
    "name": "Averell", 
 
    "date": "0000-00-00", 
 
    "client": 1 
 
    } 
 
]
<!DOCTYPE html> 
 
<html ng-app="myApp"> 
 

 
<head> 
 
    <script data-require="[email protected]*" data-semver="2.0.0-alpha.26" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.min.js"></script> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-resource.min.js"></script> 
 
    <link rel="stylesheet" href="style.css" /> 
 
    <script src="script.js"></script> 
 
</head> 
 

 
<body ng-controller="myCtrl"> 
 
    <h1>{{1/2}}</h1> 
 
    <ul ng-repeat="t in thing"> 
 
    <li>{{t.name}}</li> 
 
    </ul> 
 
</body> 
 

 
</html>

--output 0.5

Уильям Averell

0

Try:

$things.query({},{'client_id':'1'}).$promise.then(function(result){ 
    $scope.thing = result; 
    console.log($scope.thing); 
}); 
+0

PAWAN RAJ сказал мне то же самое, но ничего не изменил: / – Arhyaa

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

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