javascript - nodejs socket.io mysql 在套接字引用上缺少错误处理程序

标签 javascript mysql node.js sockets express

我想显示日志客户端 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/

相关文章:

javascript - 向旋转木马内部添加填充时 Bootstrap 旋转木马元素跳跃

javascript - 你能解释一下错误处理是如何与 Express 中间件一起工作的吗?

javascript - Marker 的 Z-index 高于 Infobox

mysql - Qt 不加载任何数据库驱动程序

node.js - Nodejs Swagger 无法向请求添加授权 header

JavaScript 正则表达式 : Is there a way to match slash after slash char in URL without negative lookbehind?

c# - 如何在mysql中一行执行多条语句并将结果存入数据集

mysql - 左外连接和求和问题

javascript - NodeJS session 认证

node.js - eonasdan-bootstrap-datetimepicker v4.17.37 小部件未使用 common.js 加载