Meteor.call无法正常工作

时间:2015-06-29 04:56:37

标签: javascript angularjs meteor

在我想将客户端集合查找/插入方法更改为服务器端之前,我已经使用了此代码。我从流星项目中删除了不安全和自动发布,并将我的代码更改为下面的代码。

client/controllers/item-controller.js

中的我的角度代码
    angular.module('prototype').controller('ItemController', ['Config','$window','$meteor', function(Config, $window, $meteor) {

    this.items = function(){
        Meteor.call('getAllItems', function(err, res){
            alert("error: " +err + " res: " + res );
            return res;
        });
    }

server/item-collection-methods.js

中的我的项目集合代码
Meteor.methods({
    getAllItems : function(){
        console.log("i got here")
        return Items.find();
    }
});

我在lib/app.js

中的主文件
Items = new Mongo.Collection("Items");

在我有15个项目显示之前,现在没有一个显示。

当我将Meteor.call函数复制到chrome控制台时,我得到的只是undefined

我感觉它要么与项目结构有关,要么就是删除了自动发布和不安全的事实。任何建议都会有所帮助。

编辑:

我确实在我的服务器控制台中获得了一些东西

I20150629-00:54:54.402(-4)? Internal exception while processing message { msg: '
method', method: 'getAllItems', params: [], id: '2' } Maximum call stack si
ze exceeded undefined

1 个答案:

答案 0 :(得分:2)

流星数据传输与发布/订阅系统一起工作。该系统能够将存储在MongoDB(服务器)中的部分或全部数据复制到内存数据库(MiniMongo)中的客户端。自动发布是在客户端上发布所有内容,当您删除它时,Items集合中不再有任何内容。

为了将一些数据发布到客户端,您必须在服务器端声明一个发布:

Meteor.publish('allItems', function () { 
  //collection to publish
  return Items.find({});
});

在客户端订阅(在路由器或模板中):

Meteor.subscribe('allItems');

要了解有关此系统的更多信息,请阅读official docs

关于您的方法" getAllItems",您无法直接向您的数据发送游标(Items.find()),这就是您收到错误消息的原因"超出最大调用堆栈大小& #34 ;. 但是您可以通过返回Items.find().fetch()来发送这些数据的数组。对Meteor方法的调用也是异步的,因此你必须使用回调(more on Meteor methods) 请注意,通过方法发送数据(完全可以接受),您将失去发布/订阅系统提供的反应性。