@nikitafrolov132

Создание диалогов Node.js и Socket.io?

У меня есть простенький чат с регистрацией и авторизацией, написанный на Node.js и на Socket.io. В данный момент у меня реализован только общий чат для всех зарегистрировавшихся пользователей. Все сообщения и пользователи хранятся в PostgreSQL. Сейчас мне нужно сделать приватные диалоги между двумя пользователями.

Пока что я придумал только одну идею, как это можно реализовать. При переходе по определенному URL, к примеру: localhost:8080/im${id} и при отправлении сообщения, в БД в таблице "dialogues" создаётся диалог между двумя пользователями, куда передаётся первый собеседник, второй собеседник и ID последнего сообщения в этом диалоге:

INSERT INTO "public"."dialogues"("first_user", "second_user", "last_message") VALUES('3', '5', '24') RETURNING "id", "first_user", "second_user", "last_message";


Как мне получить/узнать URL, по которому перешёл пользователь и обработать этот запрос? Как мне обработать у второго пользователя получение диалога/сообщения через Socket.io? Для каждого такого диалога мне придётся создавать отдельную комнату или можно сделать как-то по-другому?
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
@de1m
У socket.io есть же rooms/namespaces. Нельзя разве их использовать?

Или что-то такое( с той же страницы)
Клиент
socket.on('connect', function () {
  socket.emit('join', {email: user@example.com});
});


Сервер
io.on('connection', function (socket) {
   socket.on('join', function (data) {    
    socket.join(data.email);
  });
});


Посылаем сообщение со стороны сервера
io.to('user@example.com').emit('message', {msg: 'hello world.'});


Получаем у клиента
socket.on("message", function(data) {
  alert(data.msg);
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MagicMight
В объекте сокета подключенного пользователя можно хранить массив объектов {roomid, talkwith}.
roomid хранит идентификатор комнаты в бд, talkwith - ссылку на объект сокета-собеседника.
При создании комнаты или отправке сообщения в конкретный чат, сокету-собеседнику в массив прослшушиваемых чатов так же надо прописать пару {roomid, talkwith}, где в качестве talkwith будет ссылка на сокет-инициатор диалога
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы