2013-07-01 3 views
5

Я делаю простую вставку в коллекцию метеор, которая появляется, но оставляет пустую коллекцию.Метеорная вставка, похоже, работает, но остается пустой

Коллекция правильно определена на сервере:

Meteor.publish("comments", function() { 
return Comments.find(); 
}); 

подписываемый правильно в client.js:

Meteor.subscribe("commments"); 

и настроить должным образом на model.js:

Comments = new Meteor.Collection("comments"); 

Код вставки выглядит следующим образом:

Meteor.methods({ 
    addComment: function (options) { 
    check(options.post_id, String); 
    check(options.comment, NonEmptyString); 

    if (! this.userId) 
     throw new Meteor.Error(403, "You must be logged in to comment."); 
    if (options.comment.length > 1000) 
     throw new Meteor.Error(413, "Comment is too long"); 
    var post = Posts.findOne(options.post_id); 
    if (! post) 
     throw new Meteor.Error(404, "No such post"); 
// add new comment 
    var timestamp = (new Date()).getTime(); 
    console.log('Comment: ' + options.comment); 
    console.log('Post: ' + options.post_id); 
    console.log('UserId: ' + this.userId); 
    var saved = Comments.insert({ 
     owner: this.userId, 
     post_id: options.post_id, 
     timestamp: timestamp, 
     text: options.comment}); 
    console.log('Saved: ' + saved); 
    } 
}); 

После вставки называется, консоль печатает следующее:

Comment: Something 
Post: xRjqaBBEMa6qjGnDm 
UserId: SCz9e6zrpcQrKXYWX 
Saved: FCxww9GsrDsjFQAGF 
> Comments.find().count() 
0 

У меня есть вставки в нескольких других коллекциях, которые работают просто отлично (сообщения являются одним из них, как вы можете увидеть идентификатор поста код). В документах сказано, что если ошибки вставки будут распечатываться на консоли, но, как вы видите, он работает, но на самом деле пуст.

Спасибо.

UPDATE: Я обнаружил, что данные помещаются в базу данных, но по какой-то причине не отображаются. Я не уверен, почему данные не публикуются должным образом, поскольку на find() нет фильтров.

ответ

5

Я точно не знаю, что случилось, но здесь есть несколько вещей, чтобы проверить это.

• Во-первых, это:

Meteor.publish("comments", function() { 
    return Comments.find(); 
}); 

направляет сервер публиковать коллекцию, но на самом деле не устанавливать на стороне сервера сбора.

У вас должен быть Comments = new Meteor.Collection("comments");, доступный как на клиенте, так и на сервере. Я склонен вставлять в файл с именем model.js, как правило, examples.

• Вторая возможность: у вас нет функции подписки, указанной выше, например Meteor.subscribe("comments"); Если у вас нет функции подписки, ваш клиент не будет знать об этом, даже если она существует в коллекция.

Вы можете проверить эту теорию, введя meteor mongo в оболочке (с запущенным приложением Meteor) и db.comments.find(), чтобы узнать, действительно ли ваши комментарии находятся в базе данных, но не подписаны на нее.

+0

Я проверил свой код, и я забыл отметить, что у меня есть Meteor.subscribe в моей model.js. У меня есть Комментарии = новый Meteor.Collection («комментарии»); на главной странице, но у меня также есть то же самое для коллекций Post и Section, и они работают так, как ожидалось. Я проверил и они находятся в базе данных. Любая другая идея, почему они могут не показывать? – Erick

+0

'Meteor.subscribe (...)' должен быть в вашем коде клиента, а не распространяться ... Возможно, обновите код в своем вопросе? Должна быть очень легко найти ошибку, если бы я мог видеть, где она находится :) – emgee

+0

Моя ошибка (мне все еще нужен мой утренний кофе). Meteor.subscribe() находится на клиенте, а не на модели. Комментарии = новый Meteor.Collection («комментарии»); находится в файле model.js. – Erick

0

Убедитесь, что у вас нет ошибки в коде клиента. С Meteor.call, если вы не инициализируете переменную, вы можете иметь условие ошибки, которое блокирует реактивное обновление в ваших шаблонах, но продолжайте писать штрафом на консоль прямо перед рукой.

Я сделал эту ошибку, которую я говорю о здесь: http://doctormehmet.blogspot.com/2013/07/revoltdc-hackathon-20130622-iteration-3.html

В частности у меня было что-то вроде

Template.mytemplate.helpers({ 
    somevar: function({ 
       if (some_session_var_set_by_a_call.party){ 
       //do something 
       } 
} 

Теперь функция somevar вызывается на визуализации, до возвращения Meteor.call. Поэтому переменная some_session_var_set_by_a_call еще не установлена. Все это останавливает клиентскую сторону от неопределенной ошибки.

+0

Как вы можете видеть, я проверяю ошибки и записываю все переменные перед вставкой. Никаких ошибок в консоли тоже нет. Есть что-то еще, что я могу сделать, чтобы проверить? Кроме того, я действительно проверял db непосредственно на предложение @emgee, и я показываю, что комментарии публикуются. Теперь кажется, что проблемы заключаются в том, что клиентский код не получает доступ к коллекции должным образом. Идеи? – Erick

+0

Erick Я не вижу этого, потому что я не вижу вашу функцию Meteor.call, ваши функции рендеринга, вспомогательные функции или ваш шаблон, который вы обслуживаете для клиента. Поскольку у вас нет ошибок, почему бы вам не попробовать распечатать (console.log) внутри обратного вызова внутри функции Meteor.call и посмотреть, что произойдет. Вам также необходимо подключить какой-либо реактивный элемент (либо session.get, либо курсор) в шаблоне, чтобы обновить его, когда асинхронная функция вернется в более позднюю точку. Асинхронная функция должна изменить эту реактивную переменную для создания зависимости. – DrM

+0

Спасибо за ввод. Я написал «комментарии» как «коммиты». – Erick

Смежные вопросы