【问题标题】:Socket.io, Mongodb - Right way to implement chatroom and organise databaseSocket.io, Mongodb - 实现聊天室和组织数据库的正确方法
【发布时间】:2019-02-08 07:32:10
【问题描述】:

我是 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 字段吗?

【问题讨论】:

    标签: node.js mongodb socket.io


    【解决方案1】:
    1. 您可以创建一个变量 lastId ,然后将 lastId++ 分配给每个新房间,这样每个房间的 id 都会比上一个大 1。

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

    3. 不要在 .on("connect") 中创建房间,不要制作按钮或其他创建房间的东西,并且可能只有在 localStorage 中找到 id 时才会自动加入房间

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

    有用的链接:

    【讨论】:

    • 您的意思是服务器创建房间然后客户端保存它们? lastId var 会在服务器宕机时被删除 如果一个用户给另一个用户发消息,服务器应该自动为他们创建一个房间,但是如果我使用localStorage,因为lastId 增加了值,每个用户都有不同的 id!跨度>
    • 不要在连接时创建房间。开始时,如果在本地存储中找不到任何内容,则用户不需要在任何房间内。仅在用户想要时才创建房间(例如按钮或其他东西)
    猜你喜欢
    • 2012-01-29
    • 2011-10-06
    • 2013-11-12
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多