При обновлении страницы io.on('connection') запускается несколько раз. Почему?

const models = require('../models/models.js');
const path = require('path');
let user = false;




module.exports = function (app,passport,io, req, res) {
    let users={};
    let keys={};


    io.on('connection', function(socket){
        user = req.user;

        console.log('Пользователь ' + user.email + ' подключился!');

        users[user.email] = socket.id;
        keys[socket.id] = user.email;

        //Отлючение пользователя
        socket.on('disconnect', function(){
            console.log('Отлючение ' + user.email);
            delete users[keys[socket.id]];
            delete keys[socket.id];
        });
    });

};


То есть при открытии страницы я вижу в консоли:
Пользователь user подключился!


При обновлении страницы:

Отключение user


Пользователь user подключился!
Пользователь user подключился!


При повторном обновлении 2 отключения, 3 подключения,
потом 3 отключения 4 подключения. и тд

Контроллер в котором у меня io.connect я подключил так:
app.get('/chat', isLoggedIn, function(req, res) {
        require('./controller/controller.js')(app,passport,io, req, res);
        res.render('chat.ejs');
    });


Почему после перезагрузки страницы socket.io вызывает connect callback несколько раз?
Вот тоже самое. Но ответа там нет
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ответы на вопрос 1
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Каждый раз при коннекте создаётся новый прослушивальщик дисконнекта.
Как минимум его надо вытащить из on('connection').

На клиенте аналогично проверить чтобы не было никаких on() в других.

require('./controller/controller.js')(app,passport,io, req, res);

И конечно же подключение модуля при каждом запросе добавляет каждый раз прослушку событий.
Очень странный код, почему всё в кучу смешано и сокет сервер и обычный сервер.

Выносите сокет сервер отдельно. По роуту только верстку со скриптами отдавайте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы