处理此类1:1聊天室的常用方法是根据用户ID生成会议室URL。正如您已经提到的,问题在于任何一个用户都可以发起聊天,并且在两种情况下都应该在同一个房间中。
您可以通过按字母顺序在复合键中排序用户ID来解决此问题。例如,使用用户名而不是ID:
var user1 = "Frank"; // UID of user 1var user2 = "Eusthace"; // UID of user 2var roomName = 'chat_'+(user1<user2 ? user1+'_'+user2 : user2+'_'+user1);console.log(user1+', '+user2+' => '+ roomName);user1 = "Eusthace";user2 = "Frank";var roomName = 'chat_'+(user1<user2 ? user1+'_'+user2 : user2+'_'+user1);console.log(user1+', '+user2+' => '+ roomName);<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
常见的后续问题似乎是如何显示当前用户的聊天室列表。上面的代码没有解决这个问题。在NoSQL数据库中很常见,您需要扩展数据模型以允许这种用例。如果要显示当前用户的聊天室列表,则应对数据进行建模以允许该操作。最简单的方法是将每个用户的聊天室列表添加到数据模型:
"userChatrooms" : { "Frank" : { "Eusthace_Frank": true }, "Eusthace" : { "Eusthace_Frank": true }}如果您担心键的长度,可以考虑使用组合UID的哈希码,而不是完整的UID。



