0

我对 node.js 相当陌生,我正在尝试 ping 我的 mysql 数据库以从表中获取信息并将其放置在多个浏览器可以实时查看的套接字中。我最初是通过对 Ruby 生成的页面的 AJAX 请求获取 mysql 信息,但是当我有很多用户时(调用每秒发生 1 次),我的服务器开始运行。这就是为什么我要继续使用这个 node.js 解决方案,以便服务器可以每秒运行 1 次请求,而无需每个浏览器每秒都发出相同的请求。如果我可以让服务器迭代并 ping mysql 数据库并允许浏览器通过管道将信息传输到套接字 - 我相信我的服务器负载会很好。

我的代码如下:

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]));”中的“广播”时 我在浏览器中看到了 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' 事件来显示你从 Node 收到的任何内容,这将用于测试目的。

请记住这一点:带有 socket.io 的 Node.js 基本上依赖于事件和事件侦听,其中好的部分是您可以设置任何您希望它使用的事件名称。

希望我能有所帮助。

于 2012-05-11T15:52:06.687 回答