代码之家  ›  专栏  ›  技术社区  ›  Trevor

如何在nodejs中设置websocket向浏览器发送console.logs

  •  0
  • Trevor  · 技术社区  · 6 年前

    我对这个有点问题,需要一些想法。

    到目前为止我的代码工作。。。一次,一个用户。如果另一个用户转到页面,甚至另一个选项卡,则它将停止工作。我认为这是因为console.log是全局的,所以不能一直被覆盖。所以我需要知道怎么做。

    到目前为止我所拥有的

    wss.on('connection', function (ws) {
        const _privateLog = console.log;
        const _privateError = console.error;
        const _privateInfo = console.info;
        const _privateWarn = console.warn;
        const _privateDebug = console.debug;
        (function(){
            console.log = function (message) {
                ws.send('<span style="color:lightgreen">' + message + '</span>');
                _privateLog.apply(console, arguments);
            };
        })();
        (function(){
            console.error = function (message) {
                ws.send('<span style="color:red">' + message + '</span>');
                _privateError.apply(console, arguments);
            };
        })();
        (function(){
            console.info = function (message) {
                ws.send('<span style="color:cyan">' + message + '</span>');
                _privateInfo.apply(console, arguments);
            };
        })();
        (function(){
            console.warn = function (message) {
                ws.send('<span style="color:yellow">' + message + '</span>');
                _privateWarn.apply(console, arguments);
            };
        })();
        (function(){
            console.debug = function (message) {
                ws.send('<span style="color:white">' + message + '</span>');
                _privateDebug.apply(console, arguments);
            };
        })();
    });
    

    每个新连接都会使以前的连接停止获取更新。

    我拥有代码,这样我就可以更改console.log、error等的所有实例来调用函数,但我不确定如何使该函数从不同的角度通知每个活动连接,从而从不同的角度通知相同的问题。我的第一个猜测是创建一个ws-connections数组,然后每个console.log循环发送消息给它们。断开连接后,将它们从阵列中移除。这样行吗,还是有更好的办法?

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   jfriend00    6 年前

    要将其发送到当前连接的所有套接字,您需要跟踪当前连接的套接字,并将控制台功能的覆盖移动到connect事件之外,如下所示:

    let activeSockets = new Set();
    
    // override console functions
    (function() {
        const _privateLog = console.log;
        const _privateError = console.error;
        const _privateInfo = console.info;
        const _privateWarn = console.warn;
        const _privateDebug = console.debug;
    
        function send(style, data) {
            // send to all currently connected webSockets
            if (typeof data === "object") {
                data = JSON.stringify(data);
            }
            for (let ws of activeSockets) {
                ws.send(`<span style="${style}">${data}</span>`);
            }
        }
    
        console.log = function (message) {
            send('color:lightgreen', message);
            _privateLog.apply(console, arguments);
        };
        console.error = function (message) {
            send('color:red', message);
            _privateError.apply(console, arguments);
        };
        console.info = function (message) {
            send('color:cyan', message);
            _privateInfo.apply(console, arguments);
        };
        console.warn = function (message) {
            send('color:yellow', message);
            _privateWarn.apply(console, arguments);
        };
        console.debug = function (message) {
            send('color:white', message);
            _privateDebug.apply(console, arguments);
        };
    })();
    
    wss.on('connection', function (ws) {
        // maintain list of activeSockets
        activeSockets.add(ws);
        ws.on('close', function() {
            activeSockets.delete(ws);
        });
    })