我对node相当陌生.js并且正在尝试ping我的mysql数据库以从表中获取信息并将其放置在多个浏览器可以实时查看的套接字中。 我最初是通过对 Ruby 生成的页面的 AJAX 请求获取 mysql 信息,但是当我有很多用户时,我的服务器开始嘀咕叫(调用每秒发生 1 次(。 这就是为什么我要推进这个节点.js解决方案,以便服务器可以每秒运行 1nce 请求,而无需每个浏览器每秒发出相同的请求。 如果我可以让服务器迭代并pingmysql数据库,并允许浏览器通过管道将信息传送到套接字中 - 我相信我的服务器负载会很好。
我的代码如下:
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 数据通过套接字管道传输? 任何帮助将不胜感激。
已经有一个处理 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 收到的任何内容,因此这将用于测试目的。
请记住这一点:Node.js socket.io 基本上依赖于事件和事件侦听,这样做的好处是您可以设置您想要的任何事件名称。
希望我能有所帮助。