我想显示日志客户端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]
答案 0 :(得分: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上发送事件,因此在从数据库中提取数据时,节点会将testnow事件发送到客户端,此时您的数组为空。
socket.emit('testnow', ss);
您需要在从数据库收到结果后发送事件,因此请将上述语句放在db.query的回调函数中。
db.query(str, function (err, rows, fields) {
if (err) throw err;
socket.emit('testnow', JSON.stringify(rows));
})
要获得有关异步设计模式的更多信息,请查看Mixu的Node Book中的chapter。
EDIT 如果要在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);
}
});
})