Метеорная сигнализация без записи в БД - PullRequest
0 голосов
/ 21 ноября 2018

Я искал хороший способ сделать это, но не нашел ничего, что не показалось бы хакерским.Я хочу сигнализировать клиенту, не проходя через базу данных и подписку.Например, в игре я хочу отправить клиенту сообщение для отображения «Игрок 1 почти забивает!».Я не забочусь об этой информации в долгосрочной перспективе, поэтому я не хочу передавать ее в БД.Думаю, я мог бы просто установить еще один socket.io, но я бы предпочел не управлять вторым соединением, если есть хороший способ сделать это в метеоре.Спасибо!(Кстати, смотрели на Метеорные потоки , но, похоже, они неактивны)

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Вы знаете, что Meteor обеспечивает связь с сервером в режиме реального времени с помощью механизма Публикация и подписка , который обычно используется для отправки данных MongoDB и последующих модификаций.

Вы быкак аналогичная система push, но без необходимости записывать некоторые данные в вашу MongoDB.

Вполне возможно повторное использование системы Meteor Pub / Sub, но без части базы данных: при использовании Meteor.publish вы обычно возвращаете Курсор Коллекции, следовательно, данные из вашей БД, вы также можете использовать его низкоуровневый API для отправки произвольной информации в режиме реального времени:

В качестве альтернативы, функция публикации может напрямую управлять еенабор опубликованных записей путем вызова функций added (для добавления нового документа в опубликованный набор записей), changed (для изменения или очистки некоторых полей в документе, уже находящемся вопубликованный набор записей) и removed (для удаления документов из опубликованного набора записей).[…]

Просто не возвращайте ничего, используйте вышеупомянутые методы и не забывайте вызывать this.ready() до конца вашей функции публикации.

См. Также Руководство по Пользовательские публикации

// SERVER
const customCollectionName = 'collection-name';
let sender; // <== we will keep a reference to the publisher

Meteor.publish('custom-publication', function() {
  sender = this;

  this.ready();

  this.onStop(() => {
    // Called when a Client stops its Subscription
  });
});

// Later on…
// ==> Send a "new document" as a new signal message
sender.added(customCollectionName, 'someId', {
  // "new document"
  field: 'values2'
});

// CLIENT
const signalsCollectionName = 'collection-name'; // Must match what is used in Server
const Signals = new Mongo.Collection(signalsCollectionName);
Meteor.subscribe('custom-publication'); // As usual, must match what is used in Server

// Then use the Collection low-level API
// to listen to changes and act accordingly
// https://docs.meteor.com/api/collections.html#Mongo-Cursor-observe
const allSignalsCursor = Signals.find();
allSignalsCursor.observe({
  added: (newDocument) => {
    // Do your stuff with the received document.
  }
});

Тогда как и когда вы используете sender.added() полностью зависит от вас.

Примечание: имейте в виду, что он будет отправлять данные индивидуальноКлиент (у каждого Клиента есть свой собственный сеанс Сервера)

Если вы хотите передавать сообщений одновременно нескольким Клиентам, тогда самый простой способ - использовать MongoDB в качестве связующего звена между сеансами Сервера.,Если вас не волнует фактическое сохранение, просто снова и снова используйте один и тот же документ и слушайте изменения вместо дополнений в обозревателе Client Collection Cursor.

0 голосов
/ 23 ноября 2018

Вполне нормально использовать базу данных для такой задачи.Может быть, создать коллекцию «Streams», где вы храните предполагаемый получатель и сообщение, клиент подписывается на его поток и следит за любыми изменениями в нем.Затем вы можете удалить поток из базы данных после того, как клиент покончит с ним.Это намного проще, чем изобретать велосипед и писать все с нуля.

...