我正在尝试使用流星中的socket.io制作类似于聊天应用程序的WhatsApp。
我面临的问题与一对一私人消息传递有关,为此,我试图通过为每个用户连接创建一个空间来解决此问题。
应用看起来像这样=>
在上图中,joy和sj通过唯一的room_id连接在同一个房间中,joy和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
});
现在在服务器端捕获发送消息event =>
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。 我想要的是,当joy向sj发送消息时,它应该仅在sj和joy连接的房间中可见,而不能在其他房间看到。
U可以在此处查看整个代码=> https://github.com/sjcodebook/chat-app-in-meteor
感谢您阅读和回答问题。