2011-07-04 7 views
2

現在、Node.jsを使用してチャットシステムを開発中です。私の質問は、Node.jsで複数のチャットセッションを処理する方法です。これはやや曖昧なので説明します...Node.jsで複数のチャットセッションを処理する方法

たとえば、2人がチャットセッションに参加する可能性があります。 Node.jsは、数秒ごとに新しいメッセージをチェックします。これは、以下のコードを使用してうまく動作するようになるので、十分に簡単です。

私の問題は、同時に別の2人が別のチャットセッションに参加したときです。

現在、「chat_id」と「check_date」という2つのクエリ文字列を送信しているため、特定の日時以降に新しいチャットメッセージがないかどうかを確認できます。

問題は、サーバーが両方のチャットルームで使用されているため、新しいチャットが開始されるたびに「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のようなメモリ内のデータベースを使用してメッセージを保存してください。このようなコードを記述すると、サイトのパフォーマンスが向上し、リアルタイムになるようになります。 wを開発するフレームワークとしてexpressを使用するモジュールの代わりにhttpモジュールを使用します。私はあなたがすでにnpmについて知っているかどうかはわかりませんが、それを使ってあなたの依存関係を管理するべきです。

+0

素晴らしい!私はまだMySQLに保存したいので、PHPからチャットメッセージにアクセスできます。 NodeJSがより効果的に動作するように複数のデータストレージを使用するのは簡単ですか?それ以上の提案はありますか?それ以外は、あなたの反応は大いに役立ちます! –

+0

@Benまた、redisは非常に速いproduct => https://github.com/nrk/predis/であるため、特にチャットメッセージを保存したい場合は、predisを使用してPHPからredisを使用することもできます。 – Alfred

2

あなたがメッセージキューとしてMySQLを使用しようとしているように見えます。 RabbitMQ

4

var chat_id、check_date;

グローバル変数です。すべての接続でchat_idをオーバーライドしようとしています(createServer)。ユーザーとそのチャットを関連付けるために、何らかのセッションストレージが必要になる場合があります。

+0

驚くばかり、それはいくつかの指導を与える:)それをありがとう! –