2016-09-13 43 views
0

我正在嘗試構建一個簡單的聊天服務器。目前的主要目標是將消息從一個客戶端發送到另一個客戶端,而不保存到數據庫中,消耗更少的內存。
我正在使用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是,如果它不存在,最後出現,只有這些記錄纔會發送給收件人客戶端。

回答

1

您正在嘗試使Meteor pub/sub工作不符合設計要求。當您創建訂閱時,Meteor將立即創建一個mini-mongo數據庫來保存所述訂閱的信息。從發佈中添加的發送將被添加到所有訂閱的客戶端,修改將應用於所有訂閱的客戶端,並從所有訂閱的客戶端中刪除刪除。

我認爲你需要做的是跟蹤每個用戶的最後一條消息的日期。然後您的自定義出版物可以跳過那些比那個日期更早的出版物。一旦消息通過您的發佈發送,請更新該用戶的最後消息日期。

+0

所以你基本上的意思是不要使用迷你mongo,以防萬一我如何將來自一個用戶sendMessage方法調用的消息同步到另一個客戶端。 我是否需要爲每個用戶創建一個數組並存儲它? –

+0

我認爲使用sockjs/socket.io的普通nodejs完全可以做到這一點。 –

+0

我的意思是你在你的例子中劫持了正常的流星發佈/訂閱流程,但在你的例子中,你正在向所有的客戶發送所有的消息。如果根據客戶端已經看到的消息過濾消息,您需要做什麼。有幾種方法可以做到這一點,但最簡單的方法是跟蹤郵件的發佈日期,然後將郵件過濾爲僅在用戶上次檢查後發送的郵件。然後,您將在客戶端上使用正常的minimongo進程,並在服務器上自定義發佈。 – CodeChimp