gpt4 book ai didi

javascript - 从内存中 Meteor 的 Minimongo 中删除已传递的消息

转载 作者:行者123 更新时间:2023-12-03 06:07:26 26 4
gpt4 key购买 nike

我正在尝试简单地构建一个简单的聊天服务器。目前的主要目标是将消息从一个客户端发送到另一个客户端,而不保存到数据库中,从而消耗更少的内存。
我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com