Правильно ли в приложении используются глобальные переменные?

92
10 декабря 2021, 20:00

Имеется приложение, в котором активно используются глобальные переменные. Есть опасения, что это будет сильно нагружать систему.

Касаемо того, что при рестарте приложения глобальные переменные обнуляются - ничего страшного.

К примеру, можно ли экспортировать сокеты пользователей таким образом:

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. Если нет - то как, собственно, исправить ситуацию.

READ ALSO
Что значит строчка кода?

Что значит строчка кода?

Есть код, который при вводе в input прерывает вызов функции callSearch, если после последнего ввода символа не прошло 2х секунд, помогите разобраться...

189
Как реализовать анимацию css через JS

Как реализовать анимацию css через JS

Необходимо, что бы при клике на ссылку вырисовывалась линия, попытался менять ширину линии с помощью JS, предварительно установив элементу...

170
Как получить значения семплов в audioWorklet?

Как получить значения семплов в audioWorklet?

У меня есть буфер входящих аудио фреймов в wasm модуль

175