2012-10-26 2 views
8

Gibt es eine Möglichkeit, Ereignisse vom Server an alle oder einige Clients zu senden, ohne Sammlungen zu verwenden.Senden von Ereignissen von Server zu Client (s) in Meteor

Ich möchte Ereignisse mit einigen benutzerdefinierten Daten an Clients senden. Während der Meteor mit Sammlungen sehr gut ist, wird in diesem Fall die zusätzliche Komplexität und der Speicher nicht benötigt.

Auf dem Server sind keine Mongo-Speicher oder lokale Sammlungen erforderlich. Der Client muss nur darauf hingewiesen werden, dass er ein Ereignis vom Server empfangen hat und entsprechend den Daten handelt.

Ich weiß, das ist ziemlich einfach mit Sockjs, aber es ist sehr schwierig, sockjs vom Server zugreifen.

Meteor.Error tut etwas Ähnliches.

Antwort

4

Das Paket jetzt veraltet und arbeiten nicht für Versionen> 0,9

Sie können das folgende Paket verwenden, die ursprünglich ist Ziel Nachrichten von Kunden-Server-Clients übertragen

http://arunoda.github.io/meteor-streams/

keine Sammlung, kein mongodb hinter, ist die Nutzung wie folgt (nicht getestet):

stream = new Meteor.Stream('streamName'); // defined on client and server side 

if(Meteor.isClient) { 
    stream.on("channelName", function(message) { 
     console.log("message:"+message); 
    }); 
} 

if(Meteor.isServer) { 
    setInterval(function() { 
     stream.emit("channelName", 'This is my message!'); 
    }, 1000); 
} 
+0

Gibt es Alternativen zu diesem Paket? –

+0

https://atmosphherejs.com/rocketchat/streamer sieht aus wie eine brauchbare Alternative – TechplexEngineer

2

Sie sollten Collections verwenden.

Die "zusätzliche Komplexität und Speicherkapazität" spielt keine Rolle, wenn Sie lediglich eine Sammlung erstellen, eine einzelne Eigenschaft hinzufügen und diese aktualisieren.

Sammlungen sind nur eine Form für die Datenkommunikation zwischen Server und Client, und sie passieren auf Mongo, was wirklich nett ist, wenn Sie sie wie eine Datenbank verwenden möchten. Aber im Grunde genommen sind sie nur eine Art zu sagen: "Ich möchte einige Informationen speichern, die als X bekannt sind", die sich in die Publish/Subscribe-Architektur einklinken, die Sie nutzen sollten.

In Zukunft werden neben Mongo weitere Datenbanken verfügbar sein. Ich konnte irgendwann sehen, dass es ein intelligentes Paket gibt, das Collections auf ihre grundlegendsten Funktionen reduziert, wie Sie es vorschlagen. Vielleicht könntest du es schreiben!

+0

Also, wenn Sie Accelerometer-Daten von einem Gerät zu einem anderen streamen möchten, hat die Verwendung von Sammlungen keinen Einfluss auf die Stream-Rate? Ich möchte so schnell wie möglich von einem Gerät mit Beschleunigungsmesserdaten zu einem anderen Gerät streamen, das die Daten zum Zeichnen von WebGL-Grafiken verwendet. Ich würde denken, dass das Eliminieren der Notwendigkeit für Sammlungen und nur das Streaming von Daten schneller wäre. – trusktr

1

Ich fühle mich für @Rui und die Tatsache, eine Sammlung nur zu verwenden, um eine Nachricht zu senden fühlen sich schwerfällig.
Zur gleichen Zeit, sobald Sie mehrere solcher Nachricht zu senden haben, ist es bequem, eine Sammlung namens so etwas wie Einstellungen oder ähnliches, wo Sie diese zu halten.


1

Das beste Paket, das ich gefunden habe, ist Streamy.Es ermöglicht Ihnen,

https://github.com/YuukanOO/streamy

meteor add yuukan:streamy 

Nachricht an alle an alle, oder nur einem bestimmten Benutzer zu senden:

Streamy.broadcast('ddpEvent', { data: 'something happened for all' }); 

Hören Sie für die Nachricht auf Client:

// Attach an handler for a specific message 
Streamy.on('ddpEvent', function(d, s) { 
    console.log(d.data); 
}); 

Nachricht an einen Benutzer senden (nach ID)

var socket = Streamy.socketsForUsers(["nJyQvECmkBSXDZEN2"])._sockets[0] 
Streamy.emit('ddpEvent', { data: 'something happened for you' }, socket);