我正在嘗試構建一個簡單的聊天服務器。目前的主要目標是將消息從一個客戶端發送到另一個客戶端,而不保存到數據庫中,消耗更少的內存。
我正在使用Meteor 1.4.1
。到目前爲止,我可以藉助pub-sub數據加載服務發送和接收消息。從內存中移除已發送的消息流星的Minimongo
// 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
函數,我不知道這是如何實現的。請指向正確的方向。
在此先感謝,評論也將不勝感激。
UPDATE
從@CodeChimp,我已經更新如下收集查詢:
return Messages.find({
rid: Meteor.users.findOne({_id: this.userId}).username,
ls: {$exists: false}
},{
sort: {ts: -1}
})
其中rid
是接收方用戶名和ls
是,如果它不存在,最後出現,只有這些記錄纔會發送給收件人客戶端。
所以你基本上的意思是不要使用迷你mongo,以防萬一我如何將來自一個用戶sendMessage方法調用的消息同步到另一個客戶端。 我是否需要爲每個用戶創建一個數組並存儲它? –
我認爲使用sockjs/socket.io的普通nodejs完全可以做到這一點。 –
我的意思是你在你的例子中劫持了正常的流星發佈/訂閱流程,但在你的例子中,你正在向所有的客戶發送所有的消息。如果根據客戶端已經看到的消息過濾消息,您需要做什麼。有幾種方法可以做到這一點,但最簡單的方法是跟蹤郵件的發佈日期,然後將郵件過濾爲僅在用戶上次檢查後發送的郵件。然後,您將在客戶端上使用正常的minimongo進程,並在服務器上自定義發佈。 – CodeChimp