在我的主页中,我有一个用户列表,我想选择并打开一个频道与其中一个人聊天。
我在想是否使用 id 是最好的方法并控制对像 USERID1-USERID2 这样的通道的访问。
但是当然,用户 2 也可以打开相同的频道,所以我想找到更容易控制的东西。
如果你想帮助我,请给我一个使用 firebase url/array 的 javascript 示例。
谢谢!
在我的主页中,我有一个用户列表,我想选择并打开一个频道与其中一个人聊天。
我在想是否使用 id 是最好的方法并控制对像 USERID1-USERID2 这样的通道的访问。
但是当然,用户 2 也可以打开相同的频道,所以我想找到更容易控制的东西。
如果你想帮助我,请给我一个使用 firebase url/array 的 javascript 示例。
谢谢!
处理这种 1:1 聊天室的常用方法是根据用户 ID 生成聊天室 URL。正如您已经提到的,一个问题是任何一个用户都可以发起聊天,在这两种情况下,他们都应该在同一个房间里结束。
您可以通过在复合键中按字典顺序对用户 ID 进行排序来解决此问题。例如使用用户名而不是 id:
var user1 = "Frank"; // UID of user 1
var user2 = "Eusthace"; // UID of user 2
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
}
}
如果您担心键的长度,您可以考虑使用组合 UID 的哈希码而不是完整 UID。
在典型的数据库模式中,每个频道/聊天组都有自己的节点,带有唯一的 $key(由 Firebase 创建)。哪个用户首先打开频道无关紧要,但是一旦创建了节点(和相应的 $key),您就可以将其用作频道 ID。
散列/ MD5 策略当然是另一种方法,但是您还必须将“路由”信息以及 $key 存储在同一节点上 - 这是重复的 IMO(除非我遗漏了一些东西)。
我们决定散列用户的 uid,这意味着你可以查找任何现有的对话,如果你知道其他人的 uid。
每个对话还存储了其安全规则的 uid 列表,因此即使您能猜出哈希值,您也会受到保护。
在 Frank van Puffelen 和 Eduard 的指导下,使用 js-sha256 module进行散列对我有用。
import SHA256 from 'crypto-js/sha256'
let agentId = 312
let userId = 567
let chatHash = SHA256('agent:' + agentId + '_user:' + userId)