2016-11-23 4 views
1

Я хочу отправить сообщение из сценария сервера в 'server/main.js' в сценарий Cliente в 'client/main.js'.Как отправить сообщение от сервера клиенту в Meteor?

Я пробовал несколько вещей с публикацией/подпиской, но я, должно быть, сделал что-то не так. Консоль, на которой работает метеоритный сервер, сходит с ума от тысяч сообщений об ошибках.

сервер

Meteor.publish("test", function() { 
    this.ready(); 
    return 'some test'; 
    }); 

клиент

Template.panel.onCreated(function loginOnCreated() { 
    Tracker.autorun(function() { 
    const handle = Meteor.subscribe('test'); 
    if(handle.ready()){ 
     alert('Done') 
    } 
    }); 
}); 

Во всяком случае, мне нужен метод сервера вызвать что-то клиенту, когда он будет готов.

Причина: Template.panel.onCreated не может запрашивать данные у Mongodb. Он должен подождать несколько секунд. Поэтому то, что я хочу сделать, невозможно в Template.panel.onCreated на клиенте. Он должен подождать, пока Монго не будет готов.

Как это сделать?

+0

Какое сообщение об ошибке на консоли сервера? –

ответ

0

Вы можете сделать это путем обновления базы данных и вспомогательные клиент оповещения метод его к тому, что сервер хотел сказать что-то, или вы можете использовать пакет, как это:

https://atmospherejs.com/raix/eventddp

Это позволяет сервер инициировал обмен сообщениями. Я не пробовал, но он исходит из хорошего источника

1

Вы должны положить Meteor.subscribe за пределами Tracker.autorun.

Я думаю, что проблема в том, что handle является реактивным источником данных, поэтому, когда он изменяет функцию внутри Tracker.autorun повторного запуска, он снова подписаться на сервер, новая ручка создана и новая ручка вызвать функцию для повторного запуска , Это повторяется снова и снова и вызывает много сообщений об ошибках на вашей консоли.

1

Он должен подождать несколько секунд.

Я принимаю данные, которые вы извлекаете из Монго, необходимо для проживания населения. Для любого процесса ожидания вы можете использовать загрузчик. Вы можете сделать это, установив хелпер, который будет «ложным», пока вы не получите ответ от сервера. Когда вы получите ответ, заполните dom и установите для этого поля значение true.

Что-то вроде:

{{#if dataLoaded}} 
    {{domYouWantToPopulate}} 
{{else}} 
    {{spinner}} //your loading icon template 
{{/if}} 

Или, даже если вам не нужно, чтобы данные по-прежнему дома загрузки значка для остановки пользователя сделать что-то до данных принимаются.

Итак, убедитесь, что вы находитесь в разработке, у вас есть только клиент, но в реальном сценарии у вас будет один сервер и множество клиентов. Поэтому вызов клиентской функции на каждом клиенте с сервера неверен как по показателям обработки, так и по технико-экономическим показателям. Вот почему у нас есть API для получения ответа от сервера, поэтому сервер может отправлять ответ только на тот клиент, который ударил этот API.

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