Я пытаюсь создать приложение для чата в стиле WhatsApp, используя socket.io в метеоре.
Проблема, с которой я сталкиваюсь, связана с личными сообщениями один на один, и я попытался решить эту проблему, создав комнатудля каждого подключения пользователя.
приложение выглядит следующим образом =>
На изображении выше радость и sj связаны вта же комната через уникальный номер room_id, а также тот же случай с радостью и 846.
вот мой код =>
сначала на стороне клиента, когда пользователь нажимает на любое из его соединений, этокод выполняется =>
let connected_room_id = connections.find({
user_id: currUser[0].user_id,
connected_to: connectedUser[0].user_id
}).fetch();
socket.emit('join', {
room_id: connected_room_id[0].room_id
});
теперь на стороне сервера, чтобы перехватить событие соединения =>
socket.on('join', function(data) {
socket.join(data.room_id);
});
теперь, когда радость хочет отправить сообщение в sj, этот код запускается =>
Meteor.call('addNewMessage', e.currentTarget.id, msgContent);
socket.emit('send message', {
msg: msgContent,
room_id: connected_room_id[0].room_id,
name: currUser[0].name,
message_id: currUser[0].user_id
});
теперь на стороне сервера для перехвата события отправки сообщения =>
socket.on('send message', data => {
io.to(data.room_id).emit('connectToRoom', {
msg: data.msg,
name: data.name,
msg_id: data.message_id
});
});
теперь на стороне клиента для перехвата события connectToRoom =>
socket.on('connectToRoom', function(data) {
const currUser = Meteor.users.find({ _id: Meteor.userId() }).fetch();
if (currUser[0].user_id === data.msg_id) {
document.getElementById('chatBox').insertAdjacentHTML(
'beforeend',
`<li class="chat-right">
<div class="chat-hour">
08:56 <span class="fa fa-check-circle ml-2"></span>
</div>
<div class="chat-text">
${data.msg}
</div>
<div class="chat-avatar">
<img
src="https://www.bootdey.com/img/Content/avatar/avatar3.png"
alt="Retail Admin"
/>
<div class="chat-name">${data.name}</div>
</div>
</li>`
);
} else {
document.getElementById('chatBox').insertAdjacentHTML(
'beforeend',
`
<li class="chat-left">
<div class="chat-avatar">
<img
src="https://www.bootdey.com/img/Content/avatar/avatar3.png"
alt="Retail Admin"
/>
<div class="chat-name">${data.name}</div>
</div>
<div class="chat-text">
${data.msg}
</div>
<div class="chat-hour">
08:55 <span class="fa fa-check-circle ml-2"></span>
</div>
</li>
`
);
}
});
ПРОБЛЕМА =>
когда радость отправляет сообщение sj, оно также получает отправку на другие соединения sjкак 846. Что я хочу, так это то, что когда радость отправляет сообщение sj, оно должно быть видно только в комнате, где sj и радость соединены, а не с остальными. 1037 *https://github.com/sjcodebook/chat-app-in-meteor
Спасибо за чтение и ответ на вопрос.