Socket IO делает несколько подключений при обновлении страницы — Node JS

Я разработал инструмент для очистки, который удаляет задания со всех веб-сайтов и сохраняет их в базе данных. Я сделал свой собственный журнал по умолчанию, где я получаю сообщения (ошибки, информацию) и т. д. Я использую socket.io для обновления своего представления в режиме реального времени, а также для базы данных.

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

Ниже приведен журнал, который показывает это:

введите здесь описание изображения

Я загрузил это видео, проверьте и его. Попробуйте посмотреть в самом начале, а потом на 01:41 и 03:06, перед запуском разборки первого сайта соединение устанавливается, но при запуске разборки второго сайта дважды выдается сообщение Internet Connection, и то же самое при разборке третьего сайта запускается, количество сообщений каждый раз удваивается. Я не знаю почему.

Я попытался выполнить ответ на этот вопрос, но все же нет успеха. Код составляет 600+ строк в server файле и 150+ строк во втором файле и столько же на стороне клиента, поэтому я не могу загрузить все, и это немного конфиденциально.

А вот сокетное соединение на клиенте и сервере такое:

На стороне сервера

const express              =    require("express");
const app                  =    express();
const scrap                =    require("./algorithm");
const event = scrap.defEvent;//imported from another file 
const ms_connect = scrap.ms_connect;
const server = app.listen(8000, function(){ console.log('Listening on 8000'); });
const io                   =    require("socket.io").listen(server);
const internetAvailable    =    require("internet-available");
app.use(express.static(__dirname + "/"));


app.get("/scrap",function(req,res){
    res.sendFile(__dirname+"/index.html");//Set the Default Route
    io.on("connection",function(socket){ //On Socket Connection
        socketSameMess("Socket",'Sockets Connection Made on ID : <span style="color:#03a9f4;">'+socket.id+'<span>');
        ms_connect.connect(function(err){//On Connection with Database
            if(err) socketSameMess("database_error",err+" "); // If any error in database connection
            socketSameMess("Database ",'Connected to MYSQL Database Successfully...');
        })
    })
})

function eventSameMess(auth,mess){
    //hits the custom console
    defEvent.emit("hitConsole",{a:auth,m:mess});
}

Клиентская сторона

var socket = io.connect('http://localhost:8000');
socket.on('connect',function(){
    if(socket.connected){
        initDocument();
    }
})  


person Nadeem Ahmad    schedule 02.09.2018    source источник


Ответы (2)


Получение нескольких сообщений

Вот несколько эмпирических правил для socketio

  1. если вы прослушаете какое-либо событие один раз, вы получите сообщение один раз в обратном вызове

  2. если вы прослушаете какое-либо событие дважды, вы дважды получите сообщение в обратном вызове

  3. если вы прослушаете какое-либо событие nth раз, вы получите сообщение nth в обратном вызове

  4. Если вы прослушиваете какое-либо событие при загрузке страницы, не забудьте listen off это событие перед тем, как покинуть страницу (если событие не является глобальным)

    • If you forgot to listen off and if you again re-visit page. you'll start listening to events multiple times. because on page load you're listening to the event. and the previous event is not yet stopped by listen off
  5. Не прослушивайте никакое событие в loop, оно может прослушивать его несколько раз, и вы получите несколько сообщений об одном изменении.

подключить розетку

const socket = io('http://localhost', {
  transports: ['websocket'], 
  upgrade: false
});

слушать и слушать событие

let onMessage = (data) => {
  console.log(data);
}
//listen message
socket.on('message', onMessage);

//stop listening message
socket.off('message', onMessage);    

удалить всех слушателей при отключении

socket.on('disconnect', () => {
   socket.removeAllListeners();
});

Используйте Firecamp для визуального тестирования/отладки событий SocketIO.

person Nishchit    schedule 05.09.2018
comment
Спасибо, это очень помогло, но проблема в том, что если у меня есть событие, которое я хочу запускать снова и снова, и хочу слушать его в разных ситуациях, как я могу это сделать? - person Nadeem Ahmad; 05.09.2018

у меня была проблема, что каждый клиент получал два соединения сокета. Я думал что-то не так с сокетами. но проблема была

  • Фронтенд -> Реагировать
  • Создал шаблон с помощью приложения create-реагировать
  • В файле index.js используется что-то под названием React.StrictMode.
  • В этом режиме некоторые компоненты App.js отображаются дважды.
  • Просто удалите этот React.StrictMode и попробуйте решить, решена ли ваша проблема.
person djgarg7    schedule 04.06.2021
comment
Я решил это, выполнив соединение в методе componentDidMount(). - person Sam; 23.06.2021