2015-11-05 9 views
12

私のメインページにはユーザーのリストがあり、その1つとチャットするチャンネルを選択して開きたいと思います。Firebaseのチャットチャンネルを管理する最善の方法

IDを使用するのが最善の方法で、USERID1-USERID2のようなチャンネルへのアクセスを制御すると思っています。

もちろん、ユーザー2も同じチャンネルを開くことができるため、より簡単に制御できるものを探したいと思います。

私を助けたい場合は、firebaseのurl/arrayを使用してjavascriptで例を挙げてください。

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

答えて

30

このような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データベースでは一般的ですが、このユースケースを可能にするためにデータモデルを拡張する必要があります。現在のユーザのチャットルームのリストを表示したい場合は、それを可能にするようにデータをモデル化する必要があります。これを行う最も簡単な方法は、データモデルに各ユーザーのチャットルームのリストを追加することです:JS-SHA256モジュールでハッシュ

"userChatrooms" : { 
    "Frank" : { 
    "Eusthace_Frank": true 
    }, 
    "Eusthace" : { 
    "Eusthace_Frank": true 
    } 
} 
+1

私はこれが古いと知っていますが、ちょうどいくつかのアイデアを探していました。これを柔軟にするには、配列内のユーザーをソートしてソートします。次に、使いやすさと他の人がルーム名を簡単に推測できないようにするために、MD5を作成するか、何らかの方法でハッシュします。この方法で、部屋のユーザー数を拡大できます。私はこれをしばらく使用してきました。 – Eduard

+0

ポイントありがとうございました。 js-sha256モジュールをハッシュしてくれました。 'let chatHash = SHA256('エージェント: '+ agentId +' _user: '+ userId) –

+0

これは素晴らしい回答です。ありがとうございます。しかし、このチャットルームの名前が一意であることを確認する方法が不思議です。特に一般的な名前の場合。チャットを両方のユーザーノードに保存しても、私は2人のフランクとチャットをすることができます。今私はチャットのFBキーを使用して、withUser:recipientUidを持つ各ユーザーの/会話にrefを格納し、ユーザーの1人がチャットを開始したときに、他のユーザーとの間に存在します。しかし、これは最高のデザインではないかもしれないようです。何かご意見は?どうも! –

1

はフランク・バンPuffelenとエドゥアルドの方向で私のために働きました。

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

あなたはこれをやっている方法についていくつかの情報を提供できますか?私は別のものを試していて、その周りに頭を包むことはできません。 – texas697

+0

ここでの主なポイントは、IDを使用して送信者と受信者の文字列を作成することです。だから私の例では、 "agent:142_user:5346"という文字列を作成します。これは、エージェントIDが142で、ユーザーIDが5346であることを意味します。また、 "user:123_user:312"のように文字列で2人のユーザーを使用できます。 次に、読みにくくするためにハッシュアルゴリズムを使用します。そして、それは "e769925f0d2068d6280e3a61b6"のようなものに変換されます。私はここでSHA256を使用していますが、あなたはMD5などのような別のアルゴリズムを使用することができます –

1

一般的なデータベーススキーマでは、各チャンネル/チャットグループに固有の$キー(Firebaseで作成)を持つノードがあります。どのユーザーが最初にチャネルを開いたのかは問題ではありませんが、ノード(&相当の$キー)が作成されたら、それをチャネルIDとして使用できます。

ハッシング/ MD5戦略はこれを行う他の方法ですが、同じノードに$キーだけでなくその "ルート"情報も保存する必要があります。

+0

私は彼らがチャットを開始した情報を保存するためにそれをやっていると思います。 –

+1

実際には、ユーザー名をソートするハッシュを作成するのは本当です。だから、最終的に誰がそのチャンネルを開始したのかは分かりません。この情報が本当に必要な場合は、chat-c​​hannel-nodeの下にプロパティを作成するだけです。通常、チャンネルに複数のユーザーがいる場合は、そのチャンネルの誰かを "管理者"にして、特別な "権限"を与えないでください。ただし、アプリケーションのニーズによって異なります。 –

関連する問題