【问题标题】:nodjs socket.io mysql missing error handler on socket reference节点 js socket.io mysql 在套接字参考上缺少错误处理程序
【发布时间】:2015-09-28 10:03:48
【问题描述】:

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

【问题讨论】:

    标签: javascript mysql node.js sockets express


    【解决方案1】:

    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 节点手册中的chapter

    编辑 如果要在 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);
            }
        });
    })
    

    【讨论】:

    • 但是我刷新页面socket.io没有发送数据
    • 您需要在页面刷新时在客户端发送一些事件,以告诉服务器获取列表并在“testnow”事件中将其发送回客户端。
    • 谢谢我部分设置超时 rows.forEach(function (data)
    • 请检查编辑。它可能会帮助您理解异步模式。
    猜你喜欢
    • 2016-06-27
    • 1970-01-01
    • 2022-11-11
    • 2021-11-15
    • 2013-01-29
    • 2014-12-20
    • 1970-01-01
    • 2011-05-22
    • 2018-07-03
    相关资源
    最近更新 更多