Здравствуйте.
Работаю в WebStorm.
Делаю сайт с использованием пакета express и socket.io.
Вот так выглядит базовая конфигурация обыкновенной пустой страницы моего сайта:
var express = require('express');
var network = require('../lib/socket.js');
var users = require('../lib/users.js');
var log = require('../lib/log.js');
var router = express.Router();
router.get('/', function(req, res, next) {
if(req.user !== undefined) {
var token = req.cookies.token;
log.Debug("[LawsPage] Connected token: {0} ", [token]);
users.getDBUserByToken(token, function (user) {
if(user === undefined) {
res.redirect('/');
} else {
res.render('laws', {
username: user.name,
useravatar: user.avatar,
userbalance: user.balance
});
}
});
} else {
res.redirect('/');
}
});
network.io.on('connection', function (socket) {
var token = socket.handshake.query.token;
users.onConnectSocket(socket, token);
log.Debug("[Laws -> Socket.IO] New user connected! Token: {0} Socket ID: {1}", [token, socket.id]);
socket.on('disconnect', function() {
users.onDisconnectSocket(socket);
log.Debug("[Socket.IO] User disconnected! Token: {0} Socket ID: {1}", [token, socket.id]);
});
});
module.exports = router;
Проблема в том, что чем больше страниц на сайте, тем больше раз определяется socket.io on connection event. И тогда когда какой-нибудь пользователь отправляет любой event через socket.io - он выполняется столько раз, сколько страниц на сайте у которых есть on connect callback, даже если инициализация socket.io listener`a происходит в отельном скрипте который выполняется точно ровно 1 раз и выглядит так:
var io = require('socket.io');
//Инициализация экспрессом
module.exports = function(server) {
var listener = io.listen(server);
console.log("[Socket.IO] Listening...");
module.exports.io = listener;
};
Это разумеется наталкивает на мысль что нужно перенести connection callback так же в этот скрипт инициализации socket.io. Сегодня я это сделал, но столкнулся с другой проблемой:
Весь функционал страницы остался в скрипте страницы и разумеется, когда пользователь отправляет пакет, он приходит в тот скрипт где инициализирован socket.io, затем он должен получить доступ к скрипту страницы где находится пользователь и нужный функционал. Сделал я это через require. Просто подключил страницу в скрипт инициализации socket.io и все, теперь я могу спокойно использовать функционал разных страниц по запросу пользователя из скрипта инициализации socket.io. Но когда страница сама хочет отправить пакет пользователю, без его запроса, мне выходит нужно подключить страницу инициализации socket.io в скрипт страницы сайта что бы получить доступ к объекту io и соответственно функции emit. Но это судя по всему называется кольцевая зависимость и так делать нельзя.
Как мне быть в этой ситуации? Как мне правильно построить древо модулей?