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

标签 javascript meteor publish-subscribe minimongo

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

相关文章:

Postgresql:仅当数据更改时,才在更新每个语句后运行触发器

.net - RabbitMQ Pub/Sub : Closing the last consumer closes the publisher's channel/model. 为什么?

swift - 组合中的链接请求

javascript - 为什么我刚派发事件就立即触发?

meteor - 如何在Meteor JS中使Collection Field唯一?

javascript - 在 X 小时后使我的链接过期

meteor :更新集合时未触发 Deps.autorun

node.js - 有没有办法为 Meteor 指定 Mongo 数据库名称?

javascript - 在导航栏中选择一个元素,然后它会导致在页面中显示文本

javascript - 如何用类比来解释 JavaScript 的单线程特性?