Всем привет. Вот такая задача стоит.
Есть сервер на экспресс где инициируется сокет. 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); они множатся.
Подскажите пожалуйста, как оптимизировать всю эту историю? Может кто сталкивался? Или хотябы избежать дублирование ивентов в сокете при обновлении страницы.
нашел вот такое решение: Создается отдельный модуль для сокета -
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;
}
Пока все живо и работает, мб ктото пытался так сделать, рад буду услышать советы по оптимизации.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Прошу прощения, господа, что отвлекРешение своего вопроса нашел сам после долгих исканий
В блок с классомheader вставляется текст с размером текущей высоты браузера, а мне надо, что бы эти цифры в стили шли:
Можно ли получить SHA512 хеш строки в jQuery без огромных функции, циклов и прочегоНапример мне надо хешировать строку:
Вот есть рабочий скрипт для якорей на странице: