我想显示日志客户端 json 数组。
服务器
io.on('connection', function (socket) {
socket.emit('startsocket', 'welcome to timeserver');
socket.on('timestart', function (data) {
if (data == "start") {
test();
}
});
function test() {
var ss = [];
var str = 'SELECT * FROM tb_realtime_data'
db.query(str, function (err, rows, fields) {
if (err) throw err;
rows.forEach(function (data) {
ss.push(data);
console.log(JSON.stringify(ss));
});
})
socket.emit('testnow', ss);
setTimeout(test, 1000);
}
});
客户端
var socket = io('http://127.0.0.1');
socket.on('startsocket', function (data) {
console.log(data);
socket.emit('timestart', 'start');
});
socket.on('testnow', function (data) {
console.log(data);
});
日志服务器正常,但日志客户端不工作。请帮助我。
它显示array[0]
最佳答案
db.query 是一个异步调用,这意味着您在参数中指定的最后一个函数将在查询执行后获取数据库结果时被调用。
db.query(str, function (err, rows, fields) {
if (err) throw err;
rows.forEach(function (data) {
ss.push(data);
console.log(JSON.stringify(ss));
});
})
您在注册回调后在 socket.io 上发送事件,因此当从数据库中获取数据时, Node 将 testnow 事件发送到客户端,此时您的数组为空。
socket.emit('testnow', ss);
您需要在从数据库接收到结果后发送事件,因此将上面的语句放在 db.query 的回调函数中。
db.query(str, function (err, rows, fields) {
if (err) throw err;
socket.emit('testnow', JSON.stringify(rows));
})
要获得有关异步设计模式的更多信息,请查看 chapter在 Mixu 的 Node Book 中。
编辑 如果要在 rows.forEach 方法中处理完所有行后发出数据,可以使用计数器,然后在计数器达到总行数时将事件发送到服务器。 SetTimeout 不会确保处理所有行。
db.query(str, function (err, rows, fields) {
if (err) throw err;
var ctr = 0
rows.forEach(function (data) {
ss.push(data);
ctr++;
// This will show your array on every forEach call
console.log(JSON.stringify(ss));
if (ctr === rows.length -1) {
// This will emit the event only when all the forEach calls are completed
socket.emit('testnow', ss);
}
});
})
关于javascript - nodejs socket.io mysql 在套接字引用上缺少错误处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32820334/