Socket IO устанавливает несколько соединений при обновлении страницы - Node JS - PullRequest
0 голосов
/ 02 сентября 2018

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

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

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

enter image description here

Я загрузил это видео, пожалуйста, проверьте это. Попробуйте посмотреть в самом начале, а затем в 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();
    }
})  

1 Ответ

0 голосов
/ 05 сентября 2018

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

Вот несколько правил большого пальца для сокета

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

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

    • Если вы забыли listen off и снова заходите на страницу. вы начнете слушать события несколько раз. потому что при загрузке страницы вы слушаете событие. и предыдущее событие еще не остановлено на 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();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...