【问题标题】:Meteor MongoDB find / fetch issuesMeteor MongoDB 查找/获取问题
【发布时间】:2014-04-02 21:56:00
【问题描述】:
Meteor.publish('polls', function () { 
    return Polls.find({}); 
});

Meteor.publish('recentPolls', function() {
    return Polls.find({}, {sort: {date: -1}, limit: 10}).fetch();
});

所以这是在我的文档中的/server/server.js 文件中,它说fetch() 方法在数组中返回匹配的文档。但是,像这样在客户端使用订阅功能

Template.recentPolls.polls = function() {
    console.log(Meteor.subscribe('recentPolls'));
    return Meteor.subscribe('recentPolls');
}

出于某种奇怪的原因,这将返回以下对象(不是数组)而是一个对象

Object {stop: function, ready: function}

这是我在控制台中遇到的错误。

Exception from sub 5NozeQwianv2DL2eo Error: Publish function returned an array of non-Cursors

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

    fetch 返回一个对象数组,这不是从发布函数返回的合法值。

    发布函数只能返回一个游标、游标数组或假值。要修复您的错误,只需删除 fetch:

    return Polls.find({}, {sort: {date: -1}, limit: 10});
    

    在您不想希望在模板内订阅的客户端上。您想订阅一次(通常在一个名为 client/subscriptions.js 的文件中)或在您的路线内订阅(请参阅 Iron-router documentation)。

    忽略subscribe 返回的任何内容。调用subscribe 只是允许服务器将数据同步到客户端。调用的结果不是数据本身。

    要从您的模板访问您的数据,只需使用另一个查找,例如:

    Template.recentPolls.polls = function() {
      Polls.find({}, {sort: {date: -1}});
    }
    

    【讨论】:

    • 那只是返回光标正确?我将如何访问客户端中的数据?
    • 这是我在控制台中得到的错误:Error: {{#each}} only accepts arrays, cursors, or falsey values. You passed: [object Object]
    • 问题是它仍然返回相同的对象。 console.log(Meteor.subscribe('recentPolls')); 返回相同的对象 Object {stop: function, ready: function}
    • 是的,find 返回一个游标。我更新了答案 - 看看是否有帮助。请确保在客户端和服务器上都定义了Polls
    • 这解决了我的问题,也是同样的错误。我订阅了RouteController 并将该数据返回到模板。当我将订阅移动到全局调用并将控制器更改为简单的 find() 时,它起作用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 2016-08-13
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多