Проблема с роутингом express+socket.io

276
01 мая 2017, 02:48

Всем привет. Вот такая задача стоит.

Есть сервер на экспресс где инициируется сокет. server.js:

...
var app = express();
var initSocket = require('./models/chats');
var groupchat = require('./models/chats/routerMiddle');
var server = http.createServer(app);
var io = initSocket(server);
groupchat = groupchat(io);
app.use('/user-groupchat', groupchat);
...

routerMiddle.js

var express = require('express');
var router = express.Router();
var controllerIO = require('./io');

module.exports = function (io) {
    router.get('/', function (req, res, next) {
        controllerIO(req.user, io);

        res.render('user');
    });
    return router;
}

initsocket.js

module.exports = function (server) {
    var io = require('socket.io')(server);

    return io;
};

и в роутере есть подключение файла io:

module.exports = function (user, io) {
    io.on('connect', (socket) => {
         console.log('connect');
    });
}

Идея заключается в том, что при авторизации в req.user лежат данные авторизованного юзера, и их частично нужно передать в реализацию сокета.

например,

socket.emit('update', req.user.username);

Описанный кусок кода - работает. Только при первом заходе на роутер, в консоль кидается имя юзера один раз. Если обновить страницу - в косоль летит два раза имя юзера. А потом три. В общем, при исполнении в роутере функции controllerIO(req.user, io); они множатся.

Подскажите пожалуйста, как оптимизировать всю эту историю? Может кто сталкивался? Или хотябы избежать дублирование ивентов в сокете при обновлении страницы.

Answer 1

нашел вот такое решение: Создается отдельный модуль для сокета -

function SocketIO(io) {
    this.io = io;
    this.socket = null;
}
SocketIO.prototype.connect = function () {
    var that = this;
    return new Promise(function (resolve, reject) {
        that.io.on('connect', (socket) => {
            that.socket = socket;
            resolve(that.socket);
        });
    });
};
SocketIO.prototype.emit = function (event, data) {
    this.socket.emit(event, data);
};

SocketIO.prototype.on = function (event, callback) {
    console.log(event, callback);
   this.socket.on(event, callback);
};

module.exports = SocketIO;

Далее, он инициируется и вызывается в роуете -

module.exports = function (io) {
    router.get('/', function (req, res, next) {
        let chat = new SocketIO(io);
        chat.connect().then((data)=>{
            controllerIO(req.user, data, chat.io);
        });
        res.render('user', {
            user: req.user
        });
   });
    return router;
}

Пока все живо и работает, мб ктото пытался так сделать, рад буду услышать советы по оптимизации.

READ ALSO
не отправляются переменные формы

не отправляются переменные формы

Прошу прощения, господа, что отвлекРешение своего вопроса нашел сам после долгих исканий

238
Как вставить в HTML блок стиль полученный из JS?

Как вставить в HTML блок стиль полученный из JS?

В блок с классомheader вставляется текст с размером текущей высоты браузера, а мне надо, что бы эти цифры в стили шли:

332
Хешировать в SHA512 без гемороя в jQuery

Хешировать в SHA512 без гемороя в jQuery

Можно ли получить SHA512 хеш строки в jQuery без огромных функции, циклов и прочегоНапример мне надо хешировать строку:

262
Ошибка в скрипте при переходе на якоря в HTML документе

Ошибка в скрипте при переходе на якоря в HTML документе

Вот есть рабочий скрипт для якорей на странице:

257