Очищение сообщений при смене сервера



Обрабатываем логику КЛИЕНТСКОЙ ЧАСТИ приложения в файле script.js

message = $(".message"); message . remove ();


Подстраиваем логику обработки сообщений клиентом

Для того, чтобы реализовать сохранение в файл истории сообщений нужно изменить логику обработки входящих и исходящих сообщений. Мы обрабатывает всегда 1 объект, то есть 1 сообщение, которое пришло от сервера, мы выводим в блок в области чата, а будем обрабатывать массив объектов, то есть сразу много сообщений. Заодно добавим имя сервера, с которого пришло сообщение перед именем пользователя.

Пробегаемся в цикле и обрабатываем ВСЕ входящие сообщения, их теперь много:

message_in.forEach(element => { let message_field = `<div class="message alert alert-light ${element.name == name.val() ? "message-right" : "message-left"}"> <div class="username">${element.server}: ${element.name}</div> <div class="usertext">${element.text}</div> </div>`; chat.append(message_field); });

Также обрабатываем ВСЕ исходящие сообщения, то есть вместо одного объекта передаём на сервер массив объектов:

let message_out = [{ server: $("#chatname option:selected").text(), name: name.val(), text: text.val(), }];

Добавили имя сервера, с которого получаем сообщения, т.к. они все приходят в одну область страницы. Обращаемся к jQuery-объекту, а не через переменную, потому что в переменную мы бы записали значение при создании страницы, то есть все имена чатов, конкатенированные в одну строку, при изменении сервера не будет меняться его имя, считываемое из переменной jQuery-объекта, поэтому jQuery-объект надо перезаписывать каждый раз.

Добавляем новые возможности для нашего сервера

Вся дальнейшая логика записи и чтения файла с историей сообщений обрабатывается НА СЕРВЕРЕ. Каждый сервер хранит историю сообщений, которые обрабатывал именно он.

Далее мы будем работать с файлом index.js

Подключаем модуль fs для работы с файлами. Встроен – установки не требует:

let fs = require("fs");

Меняем логику обработки сообщений на сервере – работаем с массивом сообщений. Массив с сообщениями заполняем из файла history.json, который нужно предварительно создать:

let messages = JSON.parse(fs.readFileSync("history.json","utf-8"));

При первом подключении или смене сервера чата выводим на страницу сообщения из истории:

socket.send(JSON.stringify(messages));

Добавляем в массив сообщений новые сообщения. Через присвоение, потому что messages.concat породит в памяти новый массив в котором будет хранится результат конкатенации двух массивов, а старый массив, записанный в переменную messages останется неизменной. Это так называемые мутирующие функции. Функции, которые пораждают новое состояние объектов или переменных:

messages = messages.concat(JSON.parse(message));

После получения каждого нового сообщения сохраняем массив сообщений в файл

fs.writeFileSync("history.json", JSON.stringify(messages));

Хранение истории сообщений в файле для чата – это плохое решение, т.к. файл физически хранится и занимает пространство на жёстком диске компьютера, его объёмы не безграничны, а операции чтения и записи работают в понимании машинного времени долго, поэтому чем больше сообщений будет хранится в файле, тем медленнее будет работать наше приложение и тем больше файл будет занимать место на жёстком диске, но это только верхушка айсберга, каждый раз, когда мы отправляем сообщения наш файл с историей считывается в оперативную память компьютера, большой объём файла рано или поздно вызовет переполнение оперативной памяти, что приведёт к отказу работоспособности нашего сервера. Самое простое решение при такой реализации хранения истории – это хранить только часть сообщений, например, последние 100:

messages = messages.slice(Math.max(messages.length-100, 0));

               


Дата добавления: 2020-11-23; просмотров: 87; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!