我对 Node.js 相当陌生,正在尝试 ping 我的 mysql 数据库以从表中获取信息并将其放入多个浏览器可以实时查看的套接字中。我最初是通过对 Ruby 生成的页面发出 AJAX 请求来获取 mysql 信息,但是当我有很多用户时,我的服务器开始出现问题(调用每秒发生 1 次)。这就是为什么我正在推进这个 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]));”中的“broadcast”时我在浏览器中看到 mysql 请求结果,但它不是实时/实时的。即我每次都必须刷新浏览器才能查看结果。我怎样才能使这个连接持久并让 mysql 数据通过套接字进行管道传输?任何帮助将不胜感激。
最佳答案
您在客户端已经有一个处理 init 事件的事件,基本上您需要执行以下操作:
在客户端创建一个按钮(至少用于测试):
HTML:
<input type="button" id="testButton" onClick="requestData();">
在客户端的 JavaScript 方面添加以下内容:
function requestData(){
socket.emit("requestNewData", {"nothing":"here"});
}
在 Node 端添加以下内容:
socket.on("requestNewData", function(data){
client.emit('init', JSON.stringify(mysqlData[i]));
});
由于您已经绑定(bind)了“init”事件来显示从 Node 收到的任何内容,因此这将用于测试目的。
请记住这一点:带有 socket.io 的 Node.js 基本上依赖于事件和事件监听,其中好的部分是您可以设置您想要它使用的任何事件名称。
希望可以帮到你。
关于mysql - Node.js 和 node-mysql - 无法实时广播/发送到站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10554419/