チャット機能を持つ Node (Express) と Socket.IO を使用して Web アプリケーションを構築しています。ページで新しいタブを開くと新しいソケット接続が確立されるため、単一ユーザーのすべてのインスタンスを Express セッション ID に基づいて独自のルームにグループ化し、そのユーザー宛てのすべてのメッセージがすべての重複タブに表示されるようにする必要があります。これは、すでにログインしている可能性のある他のルーム/チャネルに追加されます。少なくとも、ユーザーは 2 つのチャットルームにサブスクライブします。実際の「実際の」ルームと、sessionID を使用する独自のチャネルです。
問題は、私の sessionID のすべてのソケットがより一般的な部屋にもあることです (そして、他のユーザーからメッセージを取得する必要があります)。一般的なチャット メッセージを送信するときは、送信ユーザーに対応するソケットを省略したいと思います。ユーザーは既に独自のチャネルを通じてメッセージを受信しているためです。私は先に進み、そのセッションのソケット ID のリストを含む配列のハッシュを作成し、sessionID をキーにしました。例外リストを指定するためのいくつかの異なる構文を見てきましたが、どれもうまくいかないようです。
簡潔にするために特定の部分を省略した関連コード:
var sessionSockets = {};
io.sockets.on('connection', function(socket){
if(!io.sockets.manager.rooms["/" + sessionID]) {
sessionSockets[sessionID] = [];
//send message indicating log on to all sockets except for my session
}
socket.join(sessionID); //create private channel for all sockets of the same sessionID
sessionSockets[sessionID].push(socket.id);
socket.on('chat', function(data){
var payload = {
message: data.msg,
from: data.user
};
//send back as personal message to all sockets for this session
io.sockets.in(sessionID).emit('me',payload);
//send to everyone else as regular message; WHAT SYNTAX?
io.sockets.in('').except(sessionSockets[sessionID]).emit('chat', payload);
}
}
tl;dr: アレイの比較を手動で行わずに、チャネル/ルーム内のユーザーのサブセットにメッセージを送信するにはどうすればよいですか?