Очищение сообщений при смене сервера
Обрабатываем логику КЛИЕНТСКОЙ ЧАСТИ приложения в файле 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!