我正在尝试简单地构建一个简单的聊天服务器。目前的主要目标是将消息从一个客户端发送到另一个客户端,而不保存到数据库中,从而消耗更少的内存。
我正在使用 Meteor 1.4.1
。到目前为止,我可以借助发布-订阅数据加载服务发送和接收消息。
//集合声明
if(Meteor.isServer){
export const Messages = new Meteor.Collection("messages",{connection: null});
}
//发布函数
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
如果不存在则为最后一次看到,只有这些记录才会发送到收件人客户端。
最佳答案
您正试图让 Meteor pub/sub 以一种不符合其设计的方式工作。当您创建订阅时,Meteor 将立即创建一个迷你 mongo 数据库来保存所述订阅的信息。从发布发送的添加将添加到所有订阅的客户端,修改将应用于所有订阅的客户端,删除将从所有订阅的客户端中删除。
我认为您需要做的是跟踪每个用户的最后一条消息的日期。然后,您的自定义出版物可以跳过那些早于该日期的出版物。通过您的出版物发送消息后,请更新该用户的最后一条消息日期。
关于javascript - 从内存中 Meteor 的 Minimongo 中删除已传递的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39476967/