Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Firebase中管理聊天频道的最佳方法_Javascript_Arrays_Firebase_Chat - Fatal编程技术网

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

Javascript 在Firebase中管理聊天频道的最佳方法,javascript,arrays,firebase,chat,Javascript,Arrays,Firebase,Chat,在我的主页中,我有一个用户列表,我想选择并打开一个频道与其中一个用户聊天 我在想,如果使用id是控制像USERID1-USERID2这样的通道访问的最佳方式 当然,用户2也可以打开相同的频道,所以我想找到更容易控制的频道 如果您想帮助我,请给我一个使用firebase url/数组的javascript示例 谢谢大家! 处理此类1:1聊天室的常用方法是根据用户ID生成聊天室URL。正如您已经提到的,这样做的一个问题是,任何一个用户都可以发起聊天,在这两种情况下,他们应该在同一个房间结束 可以通过

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

我在想,如果使用id是控制像USERID1-USERID2这样的通道访问的最佳方式

当然,用户2也可以打开相同的频道,所以我想找到更容易控制的频道

如果您想帮助我,请给我一个使用firebase url/数组的javascript示例


谢谢大家!

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

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

var user1=“Frank”//用户1的UID
var user2=“Eusthace”//用户2的UID

var roomName='chat_'+(user1使用js-sha256模块进行哈希运算在Frank van Puffelen和Eduard的指导下对我有效

import SHA256 from 'crypto-js/sha256'
let agentId = 312
let userId = 567
let chatHash = SHA256('agent:' + agentId + '_user:' + userId)

在典型的数据库模式中,每个频道/聊天组都有自己的节点,该节点具有唯一的$key(由Firebase创建)。首先打开频道的用户应该不重要,但一旦创建了节点(&对应的$key),您就可以将其用作频道id


散列/MD5策略当然是另一种方法,但是你还必须在同一个节点上存储“路由”信息和$key,这是重复的(除非我遗漏了什么)。

我们决定对用户uid进行散列,这意味着如果你知道其他人的uid,你可以查找任何现有的对话


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

我知道这很旧,但我只是在寻找一些想法。您可以通过将用户放入一个数组并对其进行排序来灵活处理。然后,为了便于使用并防止其他人轻易猜测房间名称,JU不要用它来制作MD5,或者以某种方式对它进行散列。这样你可以扩大房间中的用户数量。我已经用了一段时间了,这很好。谢谢你的观点。使用js-sha256模块进行散列对我来说很有效。“让chatHash=sha256('agent:'+agentId+'\u user:'+userId)“这是一个很好的回答,谢谢。但是我想知道如何确保这个聊天室的名称是唯一的。特别是对于更常见的名称。即使我将聊天存储在两个用户节点中,我也可以与两个Frank聊天。现在我正在考虑只使用FB键进行聊天,在每个用户的/对话中存储一个对它的引用,其中包含user:r。”ecipientUid,然后当其中一个用户启动聊天时,只需检查以确保另一个用户不存在聊天室。但这似乎不是最好的设计。有什么想法吗?Thx!如果您还想保留每个用户聊天室(在每个用户的上下文中)的未读计数,您会在每个聊天室对象中保留一个lastRead和LastUpdate时间戳吗?@Frank van Puffelen如果有人离开该组怎么办?聊天室名称更改?如果是这样,其他人将失去与以前对话的链接。通过将聊天室推到聊天室集合并将生成的id添加到所有成员来生成聊天室id有什么害处吗d你提供了一些关于你是如何做到这一点的更多信息吗?我一直在尝试不同的事情,但我不能对它掉以轻心。这里的要点是创建一个带有ID的发送方和接收方字符串。因此在我的示例中,我们创建一个字符串为:“代理:142_用户:5346”这意味着代理id为142,用户id为5346。您还可以使用字符串中的两个用户,如“user:123_user:312”。然后,为了使其难以读取,我们使用哈希算法。它会转换为类似“e769925f0d2068d6280e3a61b6”的内容。我在这里使用SHA256,但您可以使用不同的算法,如MD5等。这是生成长度为64的字符串。所有聊天室都维护一个参与者数组,这样我们就可以轻松查询是否存在任何数量的用户进行过聊天的聊天室。通常情况下,它也可以适合任何数量的用户。在这个散列用例你必须记住你放置字符串的模式,如果你与100多个用户进行群聊,这也不好。然后你将循环,这肯定会使代码更复杂??我认为他们这样做是为了保留用户开始聊天的信息。尽管创建散列你需要ort用户名,因此最终你真的不知道是谁启动了该频道。如果你真的需要这些信息,你可以在聊天频道节点下创建属性。通常,如果该频道有多个用户,你应该让某个人成为该频道的“管理员”,并给予一些特殊的“权限”但是,是的,这取决于你的应用程序的需要。不要将用户ID 1和服务2结合起来,如果谷歌改变新用户的UID长度会发生什么?他们没有承诺一个大小