У меня был этот код, прежде чем я захотел изменить методы поиска/вставки на стороне клиента на стороне сервера. Я удалил небезопасный и автообновляемый из моего проекта метеор и изменил свой код на то, что он ниже.
Мой угловой код в 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 в консоль хром, все, что я возвращаю, не 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
Передача данных Meteor работает с системой публикации/подписки. Эта система способна реплицировать часть или все данные, которые хранятся на вашем MongoDB (сервере), клиенту в БД внутренней памяти (MiniMongo). Autopublish публиковал все на клиенте, так как вы его удалили, в вашей коллекции Items
больше ничего нет.
Чтобы опубликовать некоторые данные клиенту, вы должны объявить публикацию на стороне сервера:
Meteor.publish('allItems', function () {
//collection to publish
return Items.find({});
});
И подписаться на клиент (либо в маршрутизаторе, либо в шаблоне):
Meteor.subscribe('allItems');
Чтобы узнать больше об этой системе, вы можете прочитать официальные документы.
Что касается вашего метода "getAllItems", вы не можете напрямую отправлять курсор (Items.find()
) на свои данные, поэтому вы получаете сообщение об ошибке "Максимальный размер стека вызовов". Но вы можете отправить массив этих данных, вернув Items.find().fetch()
. Кроме того, вызов метода Meteor является асинхронным, поэтому вам нужно использовать обратный вызов (подробнее о методах Meteor). Обратите внимание, что, отправляя данные по методу (что совершенно приемлемо), вы теряете реактивность, предлагаемую системой публикации/подписки.