【问题标题】:Handle chat system with socket.io, nodejs and mongodb使用 socket.io、nodejs 和 mongodb 处理聊天系统
【发布时间】:2018-07-23 09:37:36
【问题描述】:

我必须为我们的客户在线商店创建一个聊天系统,我们使用 nodejs/mongodb/socket.io。

我刚刚测试了我的 nodejs 和一个简单的 html 页面之间的实时对话是否正常工作:

const server = app.listen(app.get('port'), () => {
    console.log("working");

});

var io = require('socket.io').listen(server);
io.on('connection', function(socket){

    socket.on('chat message', function(msg){
    console.log('message: ' + msg);

});

    socket.emit('I just emit here for test', 'hello');
});

这段代码刚刚工作,现在有趣的部分是能够让店长与客户讨论,但客户不应该能够在他们之间讨论(我已经有一个“客户”和“店经理”集合) 喜欢 下图:

那么,有人能告诉我实现这一目标的最佳工作流程是什么吗?这意味着如何识别客户?并开始与他交谈?我对socket.io有点迷失......

感谢您的帮助。

【问题讨论】:

标签: node.js mongodb socket.io


【解决方案1】:
  1. 创建一个消息架构,用于存储客户和经理之间的对话。
  2. 创建一个包含房间或通信 ID 的架构。

每当客户登录您的系统时,向他显示房间列表,当客户选择任何房间时,向他显示对话。

现在,如何创建房间? 每当客户想要与经理沟通时(让我们使用 ClientA 和 ManagerA),检查对话是否已经存在。如果已经存在通信,请创建一个独特的房间,例如 "clientA-room-managerA",并将双方都添加到该房间,将所有对话存储在现有消息架构中。

如果通讯不存在,则创建一个类似"clientA-room-managerA"的房间,然后在保存通讯ID的schema中创建一个聊天记录,然后像之前"clientA-room-managerA"一样启动房间

通过这种方式,您应该能够为客户和经理创建多个聊天记录。

一个客户端将无法与其他客户端通信

经理可以与各种客户进行交流

考虑一个用户 id 为 123456789 的经理和一个客户为 0987654321 的客户,那么您可以创建一个如下所示的房间:

var room = manager.user_id + "-room-" + client.user_id;
// room = 123456789-room-0987654321
//then join the client and manager to the room
manager_socket.join(room);
client_socket.join(room);

//you can send a message in a room:
io.sockets.in(room).emit('new_message',{"msg":"hi there"});

PS: 这是一种群聊,该群包含 2 个成员,即客户和经理。作为参考,您可以查看以下链接:

http://psitsmike.com/2011/10/node-js-and-socket-io-multiroom-chat-tutorial/ https://github.com/jgonera/socket.io-multichat

【讨论】:

  • 您好,感谢您的明确回复,我已经有一个消息架构,然后我将为房间创建另一个架构。我不明白的是如何创建一个动态的房间?我的意思是,如果客户的 ID 为“789878985s29287a”,我可以用它创建一个动态房间名称(或 ID)吗?
  • @ikalangita 我们如何将消息保存在数据库中?
【解决方案2】:

在 socket.io 中,每个套接字都有一个单独的 ID,您可以使用它在特定套接字之间进行通信。您可以根据需要为 ID 分配特定值,例如用户的 MongoDB _id,例如:

this.userEmit(userID).emit('got user settings', settings);
// where userEmit is a custom function that will handle an error case when the id can't be found

您还可以向特定的“房间”广播,只有属于该房间成员的套接字才能接收消息,例如:

        io.sockets.in(groupID).emit('update group status', {
            groupID: groupID,
            onlineMembers: x.length
        });

请参阅他们的文档以获取一些示例:https://socket.io/docs/rooms-and-namespaces/

【讨论】:

  • 谢谢,很有帮助,
猜你喜欢
  • 1970-01-01
  • 2013-08-08
  • 2012-01-29
  • 2015-05-22
  • 1970-01-01
  • 2013-04-04
  • 2016-10-02
  • 2016-12-20
  • 2023-04-06
相关资源
最近更新 更多