Node.js Socket.io、Mongodb—实现聊天室和组织数据库的正确方法

Node.js Socket.io、Mongodb—实现聊天室和组织数据库的正确方法,node.js,mongodb,socket.io,Node.js,Mongodb,Socket.io,我是Node.js新手,想用Socket.io构建一个聊天室。我可以实现简单的聊天功能,并希望对此进行改进。 为了便于想象,我想建立一个类似Facebook Messenger的聊天室,人们可以在其中与他人交谈或创建群聊。 我研究了很多话题,但不知道如何解决我的问题 有些人给了我一些这样的方法: 客户: socket.on('connect', () => { socket.emit('join', roomId); // don't know how to create uniq

我是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);
    });
});
现在我坚持:

  • 如何管理那里的房间和人员?如何创建动态
    roomId
    Socket.io具有
    Socket.rooms
    (包含
    Socket.id
    roomId
    ),但每次用户加载或重新加载页面时,都会生成一个新的
    Socket.id
    ,因此我无法使用它。当用户与某人交谈时,他们会创建一个新房间。我不知道如何通知服务器创建roomId
  • 示例:有三个客户机:A、B、C

    A想要与B对话,因此服务器必须为A和B创建一个房间

    A想要与C对话,因此服务器必须为A和C创建一个房间

    当有人断开连接,然后再次连接时,如何将其连接到现有房间?使用会话、变量或db存储
    房间ID
    ?但当服务器关闭时,如何恢复它们

  • 我使用Mongodb作为我的数据库,它包含两个集合:
    user
    dialog
    。我停留在
    对话框
    的Organize db结构上。我用
    
    {
    _id:string,
    发件人:{id:string,name:string},
    接收人:[
    {id:string,name:string},
    {id:string,name:string},
    ...
    ],
    msg:string,
    创建:时间
    }
    
    但是现在人们可以在一个组中,我应该添加
    group
    字段吗
  • 您可以创建一个变量,
    lastId
    ,然后向每个新房间分配一个
    lastId++
    ,这样每个房间的id都比上一个房间大1

  • 客户机可能会将其加入的roomId存储在
    本地存储中
    ,因此它会被记住

  • 不要在中创建房间。在(“连接”)上,制作一个按钮或其他创建房间的东西,如果在
    localStorage

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

  • 有用链接:

    • 本地存储:
  • 您可以创建一个变量,
    lastId
    ,然后向每个新房间分配一个
    lastId++
    ,这样每个房间的id都比上一个房间大1

  • 客户机可能会将其加入的roomId存储在
    本地存储中
    ,因此它会被记住

  • 不要在中创建房间。在(“连接”)上,制作一个按钮或其他创建房间的东西,如果在
    localStorage

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

  • 有用链接:

    • 本地存储:

    您的意思是服务器创建房间,然后客户端保存它们
    lastId
    var将被删除如果服务器关闭如果一个用户向另一个用户发送消息,服务器应该自动为他们创建一个房间,但是如果我使用
    localStorage
    ,因为
    lastId
    增加了值,每个用户都有不同的id!不要在connect上创建房间。一开始,如果在本地存储中找不到任何内容,用户不需要在任何房间。只有当用户想要创建房间时才创建房间(比如一个按钮或其他东西),你的意思是服务器创建房间,然后客户端保存它们
    lastId
    var将被删除如果服务器关闭如果一个用户向另一个用户发送消息,服务器应该自动为他们创建一个房间,但是如果我使用
    localStorage
    ,因为
    lastId
    增加了值,每个用户都有不同的id!不要在connect上创建房间。一开始,如果在本地存储中找不到任何内容,用户不需要在任何房间。仅在用户需要时创建房间(如按钮或其他)