0

私はnode.jsにかなり慣れていないので、mysqlデータベースにpingを実行してテーブルから情報を取得し、複数のブラウザーがリアルタイムで表示できるソケットに配置しようとしています。私はもともと、Rubyで生成されたページへのAJAXリクエストを介してmysql情報を取得していましたが、ユーザーが多いとサーバーがチャグし始めました(呼び出しは1秒に1回発生していました)。そのため、このnode.jsソリューションを進めて、各ブラウザーが毎秒同じリクエストを行うことなく、サーバーが1秒に1回リクエストを実行できるようにしています。サーバーにmysqlデータベースを反復してpingを実行させ、ブラウザーが情報を含むソケットにパイプできるようにすることができれば、サーバーの負荷は問題ないと思います。

私のコードは次のとおりです。

var http = require('http');
var mysqlClient = require('mysql').createClient({'user':'root','password':'tester123'});

mysqlClient.query('USE conferenceLine');
var mysqlData = [];

setInterval(function(){
mysqlClient.query(
  'SELECT number, page_id FROM callers',
  function selectCb(err, results, fields) {
    if (err) {
      throw err;
    }

    //if there are callers log all the callers
    for(var i = 0; i < results.length; i++){
        mysqlData[i] = results[i];
        console.log(mysqlData[i]);
    }

 });
}, 1000);


var io = require('socket.io').listen(12003);

io.sockets.on('connection', function(client) {

    console.log("New Connection: ", client.id); //log new connection

    client.emit('connection', client.id);//emit to let site know its connected

    //broadcast latest mysql response as json
    for(var i=0; i<mysqlData.length; i++){
        client.broadcast.emit('init', JSON.stringify(mysqlData[i]));
        console.log("this just happend");
    }

    client.on('disconnect', function() {
    console.log("Disconnected: ", client.id);
    });
});

「client.broadcast.emit('init'、JSON.stringify(mysqlData [i]));」の「broadcast」を削除すると ブラウザにmysqlリクエストの結果が表示されますが、ライブ/リアルタイムではありません。つまり、結果を表示するには、毎回ブラウザを更新する必要があります。この接続を永続的にして、mysqlデータをソケットにパイプするようにするにはどうすればよいですか?どんな助けでも大歓迎です。

4

1 に答える 1

2

クライアント側には、initイベントを処理するイベントがすでにあります。基本的に、実行する必要があるのは次のとおりです。

クライアント側にボタンを作成します(少なくともテスト用):

HTML:

<input type="button" id="testButton" onClick="requestData();">

クライアントのJavaScript側で、次を追加します。

function requestData(){
    socket.emit("requestNewData", {"nothing":"here"});
}

ノード側で以下を追加します。

socket.on("requestNewData", function(data){
    client.emit('init', JSON.stringify(mysqlData[i]));
});

ノードから受け取ったものをすべて表示するために「init」イベントがすでにバインドされているため、これはテスト目的で機能します。

これを覚えておいてください:socket.ioを使用するNode.jsは、基本的にイベントとイベントリスニングに依存しています。これの良い部分は、使用するイベント名を設定できることです。

お役に立てば幸いです。

于 2012-05-11T15:52:06.687 に答える