在我的主页面中,我有一个用户列表,我想选择并打开一个频道与其中一个聊天。
我在想如果使用id是最好的方法并控制像USERID1-USERID2这样的频道的访问。
但当然,用户2也可以打开同一个频道,所以我想找一些更容易控制的东西。
如果你想帮助我,请使用firebase url / array在javascript中给我一个例子。
谢谢!
答案 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列表,因此,即使您可以猜测哈希值,也将受到保护。