在Firebase中管理聊天频道的最佳方式

时间:2015-11-05 09:13:20

标签: javascript arrays firebase chat

在我的主页面中,我有一个用户列表,我想选择并打开一个频道与其中一个聊天。

我在想如果使用id是最好的方法并控制像USERID1-USERID2这样的频道的访问。

但当然,用户2也可以打开同一个频道,所以我想找一些更容易控制的东西。

如果你想帮助我,请使用firebase url / array在javascript中给我一个例子。

谢谢!

4 个答案:

答案 0 :(得分:38)

处理此类1:1聊天室的常用方法是根据用户ID生成会议室URL。正如您已经提到的,这个问题是任何一个用户都可以发起聊天,在这两种情况下他们都应该在同一个房间里。

您可以通过在复合键中按字典顺序排序用户ID来解决此问题。例如,使用用户名而不是ID:

var user1 = "Frank";
var user2 = "Eusthace";

var 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
  }
}

答案 1 :(得分:2)

在典型的数据库模式中,每个Channel / ChatGroup都有自己的节点,其中包含唯一的$ key(由Firebase创建)。首先打开频道的用户并不重要,但是一旦创建了节点(和相应的$ key),您就可以将其用作频道ID。

Hashing / MD5策略当然是另一种方法,但是你还必须存储&#34;路由&#34;信息以及同一节点上的$ key - 这是复制IMO(除非我遗漏了某些东西)。

答案 2 :(得分:1)

使用js-sha256模块进行哈希,为我提供了Frank van Puffelen和Eduard的指示。

x

答案 3 :(得分:1)

我们决定对用户uid进行哈希处理,这意味着如果您知道其他人的uid,则可以查找任何现有对话。

每个会话还存储其安全规则的uid列表,因此,即使您可以猜测哈希值,也将受到保护。