Socket.io + node js Rooms Как разделить комнаты на стороне socket.io?

Всем привет, такая проблема, написал чат на socket.io + node js. Разделил на комнаты с помощью обычных проверок в blade. Все комнаты выводятся в site/chats Отдельная комната site/chats/номер_чата Проблема в том, что если любой пользователь будет писать в какой нибудь комнате, выводится будет во-всех комнатах. Все ID чатов и сообщений хранятся в базе, пытался делать проверку на ID, не получается. (Приложил скриншот на проверку которая работает!) + скрин пример поля из базы Но это не решение, т. к это сделано для единственного чата, мы проверили, что если chat_id который мы получаем по классу из блейда будет равняться этому ID чата, то есть 1 к 1, тогда пусть печатает, когда сокет хочет подгрузить это "Печатает..." в другом чате, проверка ему отказывает. И я не знаю как сюда подставлять, я не могу сделать просто chat_id === chat_id иначе будет подгружать из блейда одно и тоже и оно всё ровно везде будет выводить это слово и сообщения. Сижу второй день не могу решить.... Заранее Спасибо!

введите сюда описание изображения введите сюда описание изображения

Серверная часть:

const express = require("express")
const cors = require('cors')
const socket = require("socket.io")
const fs = require("fs")
const https = require('https')


// App setup
const PORT = 8443
const app = express()

app.use(cors())

const server = https.createServer(options, app).listen(PORT);

// Socket setup
const io = socket(server)

io.on('connection', (socket) => {
  let addedUser = false;

  // когда клиент выдает "новое сообщение", оно прослушивается и выполняется
  socket.on('new message', (data) => {
    // we tell the client to execute 'new message'
    socket.broadcast.emit('new message', {
      username: socket.username,
      message: data
    });
  });

  // когда клиент выдает команду "Добавить пользователя", он слушает и выполняет
  socket.on('add user', (username) => {
    if (addedUser) return;

    // мы сохраняем имя пользователя в сеансе сокета для этого клиента
    socket.username = username;
    // Эхо глобально (все клиенты), что человек подключился
    socket.broadcast.emit('user joined', {
      username: socket.username
    });
  });

  // когда клиент "печатает", мы передаем его другим
  socket.on('typing', () => {
    socket.broadcast.emit('typing', {
      username: socket.username
    });
  });

  // когда клиент издает команду "прекратить печатать", мы передаем ее другим
  socket.on('stop typing', () => {
    socket.broadcast.emit('stop typing', {
      username: socket.username
    });
  });

  // когда пользователь отключается.. выполните это
  socket.on('disconnect', () => {
    if (addedUser) {
      // Эхо глобально, что этот клиент ушел
      socket.broadcast.emit('user left', {
        username: socket.username
      });
    }
  });
});

Клиентская часть:

$(function() {
    var FADE_TIME = 150; // ms
    var TYPING_TIMER_LENGTH = 400; // ms
    var COLORS = [
      '#e21400', '#91580f', '#f8a700', '#f78b00',
      '#58dc00', '#287b00', '#a8f07a', '#4ae8c4',
      '#3b88eb', '#3824aa', '#a700ff', '#d300e7'
    ];
  
    // Initialize variables
    var $window = $(window);
    var $messages = $('.messages'); // Область сообщений
    var $userone = $('.userone'); // Область сообщений
    var $usertwo = $('.usertwo'); // Область сообщений
    var $authId = $('.authId'); // Область сообщений
    var $chat_id = $('.chat_id'); // Область сообщений
    var $buy_user = $('.buy_user'); // Область сообщений
    var $inputMessage = $('.inputMessage'); // Поле ввода сообщения
    let $enter = $('.enter');
    
    // Запрос на установку имени пользователя
    var username;
    var connected = true;
    var typing = false;
    var lastTypingTime;

    var socket = io.connect('https://site:8443');
    var chat_id = $chat_id.val();
    // Устанавливает имя пользователя клиента
      socket.emit('add user', username);

    // Для определения ID Чата
    var usertwo = $usertwo.val();
    var authId = $authId.val();
    var userone = $userone.val();
    var chat_id = $chat_id.val();
    var buy_user = $buy_user.val();

    // Отправляет сообщение в чат
    const sendMessage = () => {
      var message = $inputMessage.val();
    
      // Не допускайте введения разметки в сообщение
      message = cleanInput(message);
      // если есть непустое сообщение и соединение сокета
      if (message) {
        // Сохраняем в базу
        var request = new XMLHttpRequest();
        request.open("GET", "/send?text="+message+"&chat_id="+chat_id+"&buy_user="+buy_user);
        request.send();

        $inputMessage.val('');

        addChatMessage({
          username: username,
          message: message
        });

        // скажите серверу, чтобы он выполнил "новое сообщение" и отправил один параметр
        socket.emit('new message', message);
      }
    }

    // Зарегистрируйте сообщение
      const log = (message, options) => {
      var $el = $('<li>').addClass('log').text(message);
      addMessageElement($el, options);
    }
  
    // Добавляет сообщение визуального чата в список сообщений
    const addChatMessage = (data, options) => {
      var $messageBodyDiv = $('<span class="messageBody">')
      .text(data.message);
      var typingClass = data.typing ? 'typing' : '';
      var $messageDiv = $('<li class="message"/>')
        .data('username', data.username)
        .addClass(typingClass)
        .append($messageBodyDiv);
      addMessageElement($messageDiv, options);
    }

      // Добавляет визуальное сообщение ввода чата
    const addChatTyping = (data) => {

        data.typing = true;
        data.message = 'Печатает...';
        addChatMessage(data);
    
    }
  
    // Удаляет визуальное сообщение ввода чата
    const removeChatTyping = (data) => {
      getTypingMessages(data).fadeOut(function () {
        $(this).remove();
      });
    }
  
    const addMessageElement = (el, options) => {

      var $el = $(el);
  
      // Параметры настройки по умолчанию
      if (!options) {
        options = {};
      }
      if (typeof options.fade === 'undefined') {
        options.fade = true;
      }
      if (typeof options.prepend === 'undefined') {
        options.prepend = false;
      }
  
      // Применить параметры
      if (options.fade) {
        $el.hide().fadeIn(FADE_TIME);
      }
      if (options.prepend) {
        $messages.prepend($el);
      } else {
        $messages.append($el);
      }
      $messages[0].scrollTop = $messages[0].scrollHeight;
    }
  
    // Предотвращает вход от необходимости вводят разметки
    const cleanInput = (input) => {
      return $('<div/>').text(input).html();
    }
  
    // Обновляет событие ввода текста
    const updateTyping = () => {
        if (!typing) {
          typing = true;
          socket.emit('typing');
        }
        lastTypingTime = (new Date()).getTime();
    }
  
    // Получает сообщения пользователя "X is typing"
    const getTypingMessages = (data) => {
      return $('.typing.message').filter(function (i) {
        return $(this).data('username') === data.username;
      });
    }

    // События клавиатуры
    $window.keydown(event => {
      // Когда клиент нажимает ENTER на своей клавиатуре
      if (event.which === 13) {
          sendMessage();
          socket.emit('stop typing');
          typing = false;
      }
    });

      $enter.click(function() {
        sendMessage()
        socket.emit('stop typing')
        typing = false
      })
  
    $inputMessage.on('input', () => {
      updateTyping();
    });

// Фокус ввода при нажатии на границу ввода сообщения
    $inputMessage.click(() => {
      $inputMessage.focus();
    });
  
// События сокета
  
    // Всякий раз, когда сервер выдает "новое сообщение", обновляйте тело чата
    socket.on('new message', (data) => {
      addChatMessage(data);
    });

    socket.on('user joined', (data) => {
      // log('Онлайн');
      // addParticipantsMessage(data);
    });


    // Всякий раз, когда сервер выдает сообщение "пользователь ушел", регистрируйте его в теле чата
    socket.on('user left', (data) => {
      log(data.username + ' не в чате');
      // addParticipantsMessage(data);
      removeChatTyping(data);
    });
  
    // Всякий раз, когда сервер выдает "typing", покажите сообщение typing
    socket.on('typing', (data) => {
      addChatTyping(data);
    });
  
    // Всякий раз, когда сервер выдает "stop typing", убейте сообщение ввода
    socket.on('stop typing', (data) => {
      removeChatTyping(data);
    });
  
    socket.on('disconnect', () => {
      // log('you have been disconnected');
    });
  
  });

Ответы (0 шт):