从内存Meteor的Minimongo中删除已发送的消息

时间:2016-09-13 18:42:41

标签: javascript meteor publish-subscribe minimongo

我正在尝试构建一个简单的聊天服务器。目前,主要目标是将消息从一个客户端发送到另一个客户端,而不保存到数据库中,从而消耗更少的内存。
我正在使用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"); ,只会将这些记录发送给收件人客户端。

1 个答案:

答案 0 :(得分:1)

您正试图以不适合的方式使Meteor pub / sub工作。当您创建订阅时,Meteor将开箱即用,创建一个mini-mongo数据库来保存所述订阅的信息。来自发布的添加发送将添加到所有订阅的客户端,修改将应用于所有订阅的客户端,并从所有订阅的客户端删除删除。

我认为您需要做的是跟踪每个用户的最后一条消息的日期。然后,您的自定义发布可能会跳过那些早于该日期的发布。通过您的出版物发送消息后,请更新该用户的上次消息日期。