Meteor.call не работает

0

У меня был этот код, прежде чем я захотел изменить методы поиска/вставки на стороне клиента на стороне сервера. Я удалил небезопасный и автообновляемый из моего проекта метеор и изменил свой код на то, что он ниже.

Мой угловой код в 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

1 ответ

2
Лучший ответ

Передача данных 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). Обратите внимание, что, отправляя данные по методу (что совершенно приемлемо), вы теряете реактивность, предлагаемую системой публикации/подписки.

  • 1
    Так что, если я вас правильно понимаю, все мои «чтения» должны основываться на публикации / подписке, поэтому я получаю поведение реактивации из обновлений. Мои записи (поскольку это действительно то, что я пытаюсь защитить, просто пытаюсь заставить чтение работать для простоты) должны быть методами, чтобы я мог дезинфицировать входные данные.
  • 0
    Правильно :) Обратите внимание, что вы можете защитить оба метода и публиковать функции, например, проверяя, вошел ли пользователь в систему, имеет ли он необходимую роль (администратор ...) и т. Д.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню