我正在尝试构建一个简单的聊天服务器。目前,主要目标是将消息从一个客户端发送到另一个客户端,而不保存到数据库中,从而消耗更少的内存。
我正在使用Meteor 1.4.1
。到目前为止,我可以在pub-sub数据加载服务的帮助下发送和接收消息。
// Collection declaration
if(Meteor.isServer){
export const Messages = new Meteor.Collection("messages",{connection: null});
}
// Publish function
Meteor.publish('messages', function(rid) {
if (!this.userId) {
return this.ready();
}
let finderHandle = Messages.find({
$or: [
{username: Meteor.users.findOne({_id: this.userId}).username},
{rid: Meteor.users.findOne({_id: this.userId}).username}
]
})
finderHandle.observeChanges({
added: (_id, record) => {
this.added( 'messages',_id, record )
},
changed: (_id, record) => {
this.changed( 'messages', _id, record)
},
removed: (_id, record) => {
this.removed( 'messages',_id, record)
}
});
this.onStop(() => {
console.log("disconnected")
// finderHandle.close(); // Giving an Error: finderHandle.close() function not found.
})
this.ready();
});
这里的问题是,它将所有消息保存在内存中,它应该仅作为中介使用当一个客户端订阅它应该传递消息,之后,它应该从内存中释放。目前,在订阅时我也收到了以前的所有消息。
我在这里失踪的是onStop
功能,我不知道如何实现这一点。请指出我正确的方向。
提前致谢,评论也将受到赞赏。
更新
来自@CodeChimp,我已经更新了收集查询,如下所示:
return Messages.find({
rid: Meteor.users.findOne({_id: this.userId}).username,
ls: {$exists: false}
},{
sort: {ts: -1}
})
其中rid
是收件人用户名,如果不存在ls
,则最后看到printf("Hello the number %d", number);
printf(" is correct!\n");
,只会将这些记录发送给收件人客户端。
答案 0 :(得分:1)
您正试图以不适合的方式使Meteor pub / sub工作。当您创建订阅时,Meteor将开箱即用,创建一个mini-mongo数据库来保存所述订阅的信息。来自发布的添加发送将添加到所有订阅的客户端,修改将应用于所有订阅的客户端,并从所有订阅的客户端删除删除。
我认为您需要做的是跟踪每个用户的最后一条消息的日期。然后,您的自定义发布可能会跳过那些早于该日期的发布。通过您的出版物发送消息后,请更新该用户的上次消息日期。