在我想将客户端集合查找/插入方法更改为服务器端之前,我已经使用了此代码。我从流星项目中删除了不安全和自动发布,并将我的代码更改为下面的代码。
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
答案 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)
请注意,通过方法发送数据(完全可以接受),您将失去发布/订阅系统提供的反应性。