我一直在寻找一种好的方法,但是还没有发现任何看起来很怪异的东西。我想在不通过数据库和订阅的情况下向客户端发出信号。例如,在游戏中,我想向客户端发送一条消息,以显示“玩家1几乎得分!”。从长远来看,我并不关心这些信息,因此我不想将其推送到数据库。我想我可以只设置另一个socket.io,但是如果有很好的方法在流星中进行连接,我宁愿不必管理第二个连接。谢谢! (顺便说一句,您已经查看了Meteor Streams,但它似乎不活跃了)
答案 0 :(得分:1)
您知道Meteor通过Publish and Subscribe机制提供了从服务器到客户端的实时通信,该机制通常用于发送MongoDB数据和以后的修改。
您想要一个类似的推送系统,但不必将一些数据记录到您的MongoDB中。
完全有可能重新使用Meteor Pub / Sub系统,但没有数据库部分:使用Meteor.publish
时,通常返回Collection Cursor,因此,数据库中的数据也可以使用其低级API发送任意实时信息:
或者,发布函数可以通过调用函数
added
(向发布的记录集添加新文档)changed
(更改或清除其中的某些字段)来直接控制其发布的记录集已存在于已发布记录集中的文档)和removed
(用于从已发布记录集中删除文档)。 […]
只需不返回任何内容,使用上述方法,并且不要忘记在发布功能结束时调用this.ready()
。
另请参阅有关Custom publications的指南
// 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观察器中添加其他内容。
答案 1 :(得分:0)
完全可以将数据库用于此类任务。 也许创建“流”的集合,在其中存储预期的接收者和消息,客户端订阅他的流并观察其上的任何更改。 客户端完成后,您可以从数据库中删除流。 这比重新发明轮子并从头开始编写所有内容容易得多。