【问题标题】:Expected response to contain an array but got an object包含数组但得到对象的预期响应
【发布时间】:2015-03-11 22:16:32
【问题描述】:

所以我是 Angular 的新手,我已经查看了各种其他解决方案,但似乎没有一个适合我。我的应用程序需要从 mongodb 数据库中获取一些数据并将其显示给客户端。问题是我得到了

错误:[$resource:badcfg] 操作 query 的资源配置错误。预期的响应包含一个数组但得到一个对象

这是客户端上的 SchoolCtrl.js

app.controller('SchoolsCtrl', function($scope, SchoolResource) {
    $scope.schools = SchoolResource.query();
});

这是我的 ngResource

app.factory('SchoolResource', function($resource) {
    var SchoolResource = $resource('/api/schools/:id', {id: '@id'}, { update: {method: 'PUT', isArray: false}});
    return SchoolResource;
});

这是我在服务器上的 SchoolsController

var School = require('mongoose').model('School');

module.exports.getAllSchools = function(req, res, next) {
    School.find({}).exec(function(err, collection) {
        if(err) {
            console.log('Schools could not be loaded: ' + err);
        }

        res.send(collection);
    })
};

我尝试添加 IsArray: true,尝试在资源中的“SchoolResource”之后添加 [],尝试更改路线,但没有任何效果。我想看看实际返回了什么,抱怨的查询不是数组,所以我把它变成了字符串,结果如下:

function Resource(value) { shallowClearAndCopy(value || {}, this); }

我不知道为什么它会返回一个函数。谁能帮帮我?

【问题讨论】:

  • 调用函数 (function()) 来获取你的数组。
  • 你能告诉我哪个函数吗?我尝试了资源,尝试了控制器(虽然我不知道如果我在获取数据之前调用控制器会起作用),但它不起作用。

标签: javascript angularjs node.js mongodb single-page-application


【解决方案1】:

该错误消息通常意味着您的服务器正在返回代表单个对象的 JSON,例如:

{"some": "object", "with": "properties"}

当 Angular 期望 JSON 表示一个数组时,例如:

[ {"some": "object", "with": "properties"}, {"another": "object", "with": "stuff"} ]

即使只有一个结果,query 也需要 JSON 作为数组:

[ {"a": "single", "result": "object"} ]

您可以通过简单地将 API 调用加载到浏览器中并进行检查来验证这一点。如果整个 JSON 响应周围没有方括号,则它不是数组。

【讨论】:

  • 我想通了,所以我试图通过将其设为字符串来查看返回的内容(可能有更好的方法,但我没有想到任何方法),我认为这将是一个 JSON ,但它实际上是一个函数。
  • 只需将浏览器指向http://yourdomain.com/api/schools 并直接查看 JSON。这就是 Angular 试图解析的内容。
  • 至于打印,我猜你正在尝试打印SchoolResource。那是一个构造函数(本质上是一个类)。它不会打印任何有用的东西。您将无法轻松打印出给 Angular 带来麻烦的对象,因为它实际上并没有将它存储在任何有用的地方——一旦 Angular 意识到它不是一个数组,它就会像烫手山芋一样丢弃它。有一些方法可以截取和检查值,但只是在浏览器中查看要简单得多。
【解决方案2】:

我也遇到过,但后来我在控制台打印了对象,发现有这样的东西:

{ options:{....},results:[ ...the Array I was looking for... ]}

所以你需要做的就是

res.send(collection.results);

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2013-12-01
    • 2013-12-17
    • 2016-09-27
    相关资源
    最近更新 更多