@joknife
учусь

Как в node правильно хранить промежуточные данные?

В рамках изучения node.js написал многопользовательский сетевой морской бой.
Если объяснять упрощенно, то -
под данные о текущих боях (расположение кораблей, ходы) сделал просто глобальный объект с массивами.
var battles ={},
matrix =[]; // заготовка для двумерного массива
for (let i = 0; i < 10; i++) {
matrix[i] = Array('','','','','','','','','',''); // заполняю заготовку пустыми строками
}
...
battles[username] = JSON.parse(JSON.stringify(matrix)); // вот так каждому юзеру под бой свой двумерный массив
А после боя делаю так delete battles[username];
Проблема в том что иногда при обращении например battles[username][5][5], получаю Can not read property '5' of undefined.
На мой взгляд ошибки происходят рандомно, иногда бой полностью проходит без ошибок иногда ошибка на ситадии расстановки, иногда в бою. На разных строках, причем вывод массива в консоль перед самыми ошибками показывает инициализированный массив.
Я не понимаю что происходит.
Соедениние с клиентами socket.io.

Сервер запускается так :
require('babel-core/register');
require('./server'); // то есть через babel

Может с соедениями что-то, с асинхронностью, может babel, не могу понять. Причем на локалке никогда не возникает подобных ошибок, только на хостинге. Там и там одна система, все настройки почти идентичны.
Подскажите как правильно будет в моем случае хранить такие данные? Если бд то какая лучше? Я в ноде совсем новичек, может есть лучшее решение просто, или кто то знает в какую сторону копать.
Был бы благодарен за любые ответы, тк пробовать разные решения наобум отнимает много времени из-за рандомной воспроизводимости ошибки.
  • Вопрос задан
  • 366 просмотров
Решения вопроса 1
dummyman
@dummyman
диссидент-схизматик
под данные о текущих боях (расположение кораблей, ходы) сделал просто глобальный объект с массивами

Я бы так не делал. Во первых, по хорошему, на каждый бой должен запускаться отдельный процесс. Чтобы процесс боя падая не убивал с собой весь стек сервисов. Хранить данные можно в памяти, можно файлом на разделе tmpfs.
Не забывайте, важно не допускать race conditions.
Если у вас используется express/connect, сведите к минимуму обращения middleware к глобальным объектам, и ни в коем случае не сохраняйте ничего в глобальных из middleware. Есть объекты для общих данных, например, app.locals, res.locals; есть много реализаций сессий.

Позже заметил
matrix[i] = Array('','','','','','','','','','');
наверное, правильнее так
matrix[i] = ['','','','','','','','','',''];

Да и еще один тонкий момент. Здесь по коду у вас этого нет, но про это вам никто не скажет. Но вы обязательно посчитаете должным так делать. Во избежание утечек не изменяйте структуру объектов после их создания. Вся структура, прототип, все параметры объектов должны определяться до создания и в конструкторе.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы