Имеется приложение, в котором активно используются глобальные переменные. Есть опасения, что это будет сильно нагружать систему.
Касаемо того, что при рестарте приложения глобальные переменные обнуляются - ничего страшного.
К примеру, можно ли экспортировать сокеты пользователей таким образом:
module.exports = function(server) {
var io = require('socket.io').listen(server);
const users = {};
global.io = io;
io.set('origins', 'localhost:*');
io.on('connection', function (socket) {
users[socket.handshake.user._id] = {
user: socket.handshake.user,
socket: socket
};
//listeners...
});
return {
users: users
};
};
;
let io_substation;
io_substation = require('../socket')(server);
app.set('io_users', io_substation.users);
А после использовать таким образом:
var users = req.app.get('io_users');
if(users[req.body.id])
users[req.body.id].socket.emit('test', 'test');
Глобальный io используется же в тех случаях, когда никакой сокет не передаётся, к примеру, когда пользователь отправляет сообщение, но в нём был обнаружен запрещённый контент - текст сообщения пересылается модерации, которая, если одобряет сообщение, то оно обязано быть отправлено заново от имени первоначального юзера в общий чат броадкастом, но без сокета:
if(data.specialKey == "key") {
delete data.specialKey;
global.io.sockets.emit('chat', data);
}
Или стоит передавать в функцию отправки сообщения io таким образом:
start_listeners(socket, io);
;
socket.on('chat_msg', () => {
if(data.specialKey == "key") {
delete data.specialKey;
io.sockets.emit('chat', data);
}
}
Также, можно ли использовать глобальные переменные в качестве временного хранилища переменных? Пример - пользователь отправляет какой-то 15-секундный запрос другому и он записывается в глобальную переменную. По истечению времени эта переменная очищается, но покуда она есть - другой пользователь может ответить на запрос:
global.requests.friends[this.user._id] = [this.friend, Date.now() + 15000];
Контроллер времени, подключаемый при запросах:
module.exports = function (req, res, next) {
if(JSON.stringify(global.requests) != "{}"){
Object.keys(global.requests).forEach(function (type) {
Object.keys(global.requests[type]).forEach(function (requestID) {
if(global.requests[type][requestID][1] < Date.now()) delete global.requests[type][requestID];
});
});
}
if(typeof next == "function") next();
};
Также приложу полный список глобальных переменных в приложении:
var antiDDos = require('rate-limiter-flexible');
global.cfg = {
server: {
secretHash: "1",
secretHashTwo: "2",
env: 'development', //В каком состоянии находится сервер. production || development
},
sessions: {
key: 'sid',
secret: '3', //Секретный дешифратор серверных куки.
cookie: {
path: '/',
httpOnly: true,
maxAge: 1000 * 60 * 60 * 24 * 7 //Максимальный срок хранения сессии. Сейчас: 7 дней.
}
}
};
global.hashAlgorithms = {
"sha1": [],
"sha256": [],
"md5": [],
"test": [],
"salt": []
};
global.extensionUrls = []; //Дополнительные пути, которые будут приоритетнее(помогает при ручном добавлении).
//Example: ["someWay", function(req, res, next){}]. Support formats: /someWay, /someWay/. Не поддерживаются глобальные роуты, вроде *.
global.countErrors = 0; //Количество ошибок в текущей сессии приложения.
global.initAntiDdosSocket = new antiDDos.RateLimiterMemory({
points: 5,
duration: 2,
blockDuration: 120
});
global.antiDdosParser = function(key) {
return initAntiDdosSocket.consume(key);
};
global.versionApp = "3.0.0"; //Версия приложения.
global.openProject = 1; //Переменная, обозначающая статус доступности /game . 0 = Тех. работы.
global.MAXLOGINLENGTH = 15; //Максимальная длина логина юзера.
global.MINPASSWORDLENGTH = 16; //Минимальная длина пароля юзера.
global.MAXPASSWORDLENGTH = 80; //Максимальная длина пароля юзера.
global.messagesTemplates = {}; //Переменная - хеш, хранящая в себе сообщения в течение временного промежутка.
global.messagePreModeration = {}; //Переменная - хеш, хранящая в себе подозрительные сообщения со ссылками до проверки модератором.
global.chatIds = 0; //Текущий id сообщения в чате. Обнуляется при перезапуске приложения.
global.requests = { //Переменная - хеш, хранящая в себе запросы пользователей на дружбу/приглашение в клан от лидера/подачи заявки в клан.
friends: {}, //В друзья
};
global.streamSubscribers = { //Переменная - хеш, хранящая в себе текущую информацию о стримах.
radio: {},
video: {}
};
global.streamersAccess = { //Переменная - дата, хранящая в себе права доступа стримеров на комнаты стримов.
1: [1]
};
//yaCaptcha и yaCaptchaTrue используются в процессе проверки привязанности номера телефона к почте при регистрации.
global.yaCaptcha = {};
global.yaCaptchaTrue = {};
global.captcha = {};
Хочется узнать - действительно правильно ли использованы глобальные переменные и переменные, получаемые через app.get. Если нет - то как, собственно, исправить ситуацию.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть код, который при вводе в input прерывает вызов функции callSearch, если после последнего ввода символа не прошло 2х секунд, помогите разобраться...
Необходимо, что бы при клике на ссылку вырисовывалась линия, попытался менять ширину линии с помощью JS, предварительно установив элементу...
У меня есть буфер входящих аудио фреймов в wasm модуль