nodjs socket.io mysql缺少套接字引用上的错误处理程序

时间:2015-09-28 10:03:48

标签: 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]

1 个答案:

答案 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);
        }
    });
})