Отладка, почему не срабатывает socket.on - PullRequest
0 голосов
/ 03 апреля 2019

Эта проблема возникает на стороне клиента моего приложения.Я столкнулся с проблемой, при которой событие socket.on не срабатывает в моем приложении Node.Обычно это происходит, когда клиент впервые загружает сайт.При загрузке вкладки обычно содержат данные, которые были динамически сгенерированы в Javascript, однако, поскольку событие socket.on не попадает, это содержимое не загружается, в результате чего вкладки остаются пустыми (базовый файл Pug / Jade все еще рендерится- просто нет динамического контента).Обновление страницы обычно устраняет проблему, и сокеты снова начинают получать данные.

Прямое сообщение об ошибке не выводится, событие socket.on просто не срабатывает.Это также, кажется, решает себя, как только страница была перезагружена и не происходит 100% времени.

Это еще более необычно, так как при запуске моего Node-сервера в режиме отладки он показывает socket.io-parser, кодирующий данные, и socket.io-client, записывающий данные, что означает, что они испускаются,просто не был обнаружен socket.on на моей стороне клиента.

Обратите внимание, что это было упрощено до

io.sockets.on('connection', function (client) {
    sendExampleData();
});
function sendExampleData() {
    mysqlFunc.getOrderData(function(rows){
        io.emit('example_data', rows);
    })
}
socket.on('example_data', function (rows) {
    console.log(rows);
}

Iожидайте, что при загрузке страницы данные будут отправлены, и событие socket.on получит эти данные, готовые к обработке.В настоящее время, хотя и происходит не каждый раз, socket.on не используется, а данные не собираются.

Нет ничего необычного, пока сервер работает в режиме отладки, и любые идеи будут чрезвычайно полезны.Если есть какая-либо другая информация, которая будет полезна для устранения этой проблемы, пожалуйста, дайте мне знать.

Заранее спасибо!

1 Ответ

0 голосов
/ 04 апреля 2019

Мне наконец удалось выяснить, в чем проблема. Мои слушатели событий socket.on находились внутри моего $ (document) .ready и не вызывались при первой загрузке страницы. Я предполагаю, что прослушиватели событий не были определены достаточно рано, и поэтому, когда я подключаю socket.emit'd, прослушиватели событий фактически не загружались.

Я переместил всю логику, которая была внутри $ (document) .ready out, и переместил моих слушателей событий в событие подключения (спасибо за подсказку, Марк).

socket.on('connect', function(){
    socket.on('data_1', funcOne);
    socket.on('data_2', funcTwo);
    socket.on('data_3', funcThree);
    socket.on('data_4', funcFour);
    socket.on('data_5', funcFive);
});

Это исправило проблему, и теперь socket.on срабатывает каждый раз при загрузке страницы. Спасибо за помощь, ребята, и, надеюсь, это может помочь кому-то, также с этой проблемой!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...