У меня проблемы с этим, и мне нужны идеи.
Мой код пока работает ... один раз для одного пользователя. Если другой пользователь переходит на страницу или даже на другую вкладку, она перестает работать. Я предполагаю, что это потому, что 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 пройти через него, отправив сообщение каждому из них. И при отключении удалите их из массива. Сработает ли это, или есть способ лучше?
Спасибо.





Чтобы отправить его всем подключенным в данный момент сокетам, вам необходимо отслеживать, какие сокеты в настоящее время подключены, и они перемещают вашу перезапись функций консоли за пределы события подключения следующим образом:
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);
});
})
@TrevorD - Да, извините за опечатку. Отредактировал, чтобы исправить. В любом случае, рад, что это сработало для вас.
Спасибо! Мне пришлось добавить () в конец функции переопределения консоли, и она отлично сработала. Также никогда раньше не видел объект
Set()или стиль"${style}", так что узнайте больше.