Socket.io,Mongodb-实现聊天室和组织数据库的正确方法

时间:2019-02-08 07:32:11

标签: node.js mongodb socket.io

我是Node.js的新手,想与Socket.io建立一个聊天室。我可以实现简单的聊天,并希望对此进行改进。 为了易于想象,我想建立一个像Facebook Messenger这样的聊天室,人们可以在其中聊天或建立群聊。 我研究了许多主题,但不了解如何解决我的问题。

有些人给我这样的方式:

客户:

socket.on('connect', () => {
    socket.emit('join', roomId); // don't know how to create unique roomId
    // that server can grab it
});

btnSend.addEventListener('click', () => {
    // data: { senderId: [string], receiverId: [array of receiver], msg: [string] }
    socket.emit('send message', data);
});

socket.on('new message', (data) => {
    // append to body
});

服务器:

socket.on('join', (roomId) => {
    socket.join(`room ${ roomId }`, () => {
       console.log(`in room ${ roomId }`);
    });

    socket.on('send message', (data) => {
        // save to db
        socket.in(roomId).emit('new message', data);
    });
});

现在我停留在:

  1. 如何管理其中的房间和人员?如何创建动态roomId Socket.io具有socket.rooms(包含socket.idroomId),但是每次用户加载或重新加载页面时,都会生成一个新的socket.id,所以我无法使用它。当用户与某人交谈时,他们会创建一个新房间。我不知道如何通知服务器创建roomId。

示例:有三个客户端:A,B,C。

A要与B交谈,因此服务器必须为A和B创建一个房间。

A要与C交谈,因此服务器必须为A和C创建一个空间。

当某人断开连接然后再次连接时,如何将他们连接到现有房间?使用会话,变量或数据库存储roomId?但是当服务器宕机时如何恢复它们?

  1. 我正在使用Mongodb作为数据库,其中包含两个集合:userdialog。我停留在dialog的组织数据库结构中。我用 { _id: string, sender: { id: string, name: string }, receiver: [ { id: string, name: string }, { id: string, name: string }, ... ], msg: string, created: time } 但现在人们可以分组了,我应该添加group字段吗?

1 个答案:

答案 0 :(得分:0)

  1. 您可以创建一个变量lastId,然后将lastId++分配给每个新房间,因此每个房间的ID都比上一个大1。

  2. 客户端可以将其加入的roomId存储在localStorage中,以便将其记住。

  3. 不要在.on(“ connect”)中创建会议室,不要创建按钮或创建会议室的内容,并且只有在localStorage中找到ID的情况下,才可能自动加入会议室

  4. 可能仅需要一个组字段来查询有用的消息

有用的链接: