Как настроить websocket в nodejs для отправки console.infos в браузер

У меня проблемы с этим, и мне нужны идеи.

Мой код пока работает ... один раз для одного пользователя. Если другой пользователь переходит на страницу или даже на другую вкладку, она перестает работать. Я предполагаю, что это потому, что console.info является глобальным, поэтому он не может перезаписываться. Итак, мне нужна идея, как это сделать.

Что у меня есть до сих пор

wss.on('connection', function (ws) {
    const _privateLog = console.info;
    const _privateError = console.error;
    const _privateInfo = console.info;
    const _privateWarn = console.warn;
    const _privateDebug = console.debug;
    (function(){
        console.info = 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.info, error и т. д., Чтобы вместо этого вызвать функцию, но я не уверен, как я могу заставить эту функцию уведомлять каждое активное соединение, так что та же проблема под другим углом. Мое первое предположение - создать массив соединений ws, а затем каждый console.info пройти через него, отправив сообщение каждому из них. И при отключении удалите их из массива. Сработает ли это, или есть способ лучше?

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
462
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы отправить его всем подключенным в данный момент сокетам, вам необходимо отслеживать, какие сокеты в настоящее время подключены, и они перемещают вашу перезапись функций консоли за пределы события подключения следующим образом:

let activeSockets = new Set();

// override console functions
(function() {
    const _privateLog = console.info;
    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.info = 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);
    });
})

Спасибо! Мне пришлось добавить () в конец функции переопределения консоли, и она отлично сработала. Также никогда раньше не видел объект Set() или стиль "${style}", так что узнайте больше.

Trevor 25.07.2018 19:41

@TrevorD - Да, извините за опечатку. Отредактировал, чтобы исправить. В любом случае, рад, что это сработало для вас.

jfriend00 25.07.2018 19:43

Другие вопросы по теме