Node.js和node-mysql - 无法直播/发送到网站

时间:2012-05-11 15:33:27

标签: mysql sockets node.js websocket socket.io

我是node.js的新手,我正在尝试ping我的mysql数据库以从表中获取信息并将其放在多个浏览器可以实时查看的套接字中。我最初通过AJAX请求获取mysql信息到Ruby生成的页面,但是当我有很多用户时,我的服务器开始突然显示(呼叫每秒发生一次)。这就是为什么我正在推进这个node.js解决方案,以便服务器可以每秒运行请求,而不是每个浏览器每秒都发出相同的请求。如果我可以让服务器迭代并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数据?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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基本上依赖于事件和事件监听,这很好的部分是你可以设置你想要的任何事件名称。

希望我能提供帮助。