2011-07-04 18 views
2

我目前正在使用Node.js開發聊天系統。我的問題是,我如何處理Node.js的多個聊天會話。這有點含糊,所以我會解釋...如何使用Node.js處理多個聊天會話

因此,例如,兩個人可能參與聊天會話。 Node.js每隔幾秒檢查一次新消息。這很簡單,因爲我可以使用下面的代碼正常工作。

我的問題是當另外兩個人在同一時間在另一個聊天會話。

目前我發送兩個名爲「chat_id」和「check_date」的查詢字符串,以便它可以在特定的日期和時間後檢查新的聊天消息。

問題是,由於聊天室正在使用服務器,因此每次開始新聊天時都會覆蓋「chat_id」和「check_date」。

我有道理嗎?

我下面的代碼:

var chat_id, check_date; 

var sys = require("sys"), 
    http = require("http"), 
    url = require("url"), 
    path = require("path"), 
    fs = require("fs"), 
    events = require("events"); 

// Conntect to database 
var Client = require('mysql').Client; 
var client = new Client(); 
client.host = 'localhost'; 
client.port = 3306; 
client.database = '****'; 
client.user = '****'; 
client.password = '****'; 
client.connect(function(error, results) { 
    if(error) { 
    console.log('Connection Error: ' + error.message); 
    return; 
    } 
    console.log('Connected to MySQL'); 
}); 

// Check for chat updates 
function getChatUpdates() { 

    if (typeof(check_date) == 'undefined') 
     return; 

    client.query('SELECT name, message FROM chat WHERE chat_id = "' + chat_id + '" AND date_entered > "' + check_date + '"', 
    function selectCb(error, results, fields) { 
     if (error) { 
      console.log('GetData Error: ' + error.message); 
      client.end(); 
      return; 
     } 

     if (results.length > 0) { 
      for(var i = 0;i<results.length;i++) { 
       console.log('Name: ' + results[i]['name']); 
       console.log('Message: ' + results[i]['message']); 
      } 
     } 

    }); 

} 

// Set interval to check for chat updates every 2 seconds 
setInterval(getChatUpdates, 2000); 

http.createServer(function(request, response) { 

    // Get the query strings 
    var uri = url.parse(request.url, true); 
    chat_id = uri.query.chat_id; 
    check_date = uri.query.check_date; 
    console.log('Chat ID: ' + chat_id); 
    console.log('Last Check: ' + check_date); 

    // we'll do something here later. 

}).listen(8080); 

sys.puts("Server running at http://localhost:8080/"); 

回答

7

看起來像你有一個PHP背景,在node.js中編程時,你應該有一個完全不同的思維模式,你不應該爲消息輪詢(setInterval(getChatUpdates, 2000);
),而是在事件中推送(回調/事件)消息給用戶。看看socket.io並使用像redis這樣的內存數據庫(而不是mysql)來存儲你的消息。當你這樣編寫代碼時,你的網站會表現得更好,並且將會是實時的(更多)。同時我會建議你使用express作爲您開發w的框架而不是使用原始http模塊。我不知道你是否已經知道npm,但是你應該用它來管理你的依賴關係。

+0

太棒了!我仍然希望存儲在MySQL中,以便我可以訪問來自PHP的聊天消息。使用多個數據存儲是否夠容易,以便NodeJS更有效地工作?還有什麼建議?除此之外,您的迴應會有很大幫助! –

+0

@你可以也應該使用preis的PHP使用redis,特別是當你想存儲聊天消息時,因爲redis是非常快的產品=> https://github.com/nrk/predis/ – Alfred

2

它看起來像你想使用MySQL作爲消息隊列。 RabbitMQ

4

var chat_id,check_date;

是全局變量。您將在每個連接上重寫chat_id(在createServer中,您可能需要某種會話存儲(以關聯用戶和他們的聊天),例如Array,Redis等。

+0

太棒了,這給了一些指導:)欣賞它! –