【问题标题】:returning cursor results causes "stack size exceeded" error返回游标结果导致“超出堆栈大小”错误
【发布时间】:2014-08-06 06:22:12
【问题描述】:

我有一个页面,其中列出了公司的资料并显示了它的空缺职位。我使用 Iron-router 来获取公司简介信息,但是在页面加载后使用 Meteor.call 来获取活跃的工作。但是,当我返回一个游标时,它会抛出一个超出堆栈大小的错误。

组织.js

Template.organization.rendered = function() {
    Meteor.call('getActiveJobs', function(error, jobs){
        if(error){
            console.log(error);
        } else {
            console.log(jobs);
        }
    });
}

收藏

Meteor.methods({
.....
    getActiveJobs: function(){
        return Jobs.find({organizationId: user.profile.organizationId});
    }
.....
});

这会引发“RangeError:超出最大调用堆栈大小”错误。

但是,我可以返回

return Jobs.find({organizationId: user.profile.organizationId}).fetch();

没有错误,但我尝试不返回光标,以便使用车把更容易,但我不太明白为什么会出现此错误。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    请注意,从您的方法返回的值需要以 JSON 格式从服务器传输到客户端。因此,您不能返回非 JSON 可序列化的对象(这里有一些小例外,但我们现在可以忘记它们)。

    如果你想返回一个游标,你应该使用Meteor.publish而不是Meteor.methods,所以

    Meteor.publish('activeJobs', function () {
      var user = Meteor.users.findOne({_id: this.userId});
      return Jobs.find({organizationId: user.profile.organizationId});
    });
    

    另外,一旦您需要此数据集,请记得在客户端上致电Meteor.subscribe('activeJobs')

    【讨论】:

    • 但 .fetch() 不返回对象数组,它本身就是一个对象(有效)?
    • 是的,当然。但它是可序列化的。你可以安全地从一个方法返回一个对象数组,但是这样你就没有游标了。
    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多