web-dev-qa-db-ja.com

Firebaseでチャットチャネルを管理する最良の方法

メインページにユーザーのリストがあり、そのうちの1人とチャットするチャネルを選択して開きたいのですが。

IDを使用するのが最善の方法であり、USERID1-USERID2のようなチャネルのアクセスを制御するかどうかを考えています。

もちろん、ユーザー2も同じチャネルを開くことができるので、もっと簡単に制御できるものを見つけたいと思います。

私を助けたい場合は、firebase url/arrayを使用したJavaScriptの例を教えてください。

ありがとうございました!

22
Eusthace

このような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
  }
}
41

典型的なデータベーススキーマでは、各チャネル/チャットグループには、一意の$ key(Firebaseによって作成)を持つ独自のノードがあります。どのユーザーが最初にチャネルを開いたかは関係ありませんが、ノード(および対応する$ key)が作成されたら、それをチャネルIDとして使用できます。

もちろんハッシュ/ MD5戦略はそれを行う別の方法ですが、その場合は「ルート」情報と$ keyを同じノードに保存する必要があります-これはIMOの複製です(Imに何かが欠けている場合を除く)。

2
Neo Split

Js-sha256モジュールでのハッシュは、フランク・ファン・プフェレンとエデュアルドの指示で私のために働きました。

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