7

(わかりやすくするために)チャットがあります。

ユーザーはログインしてメッセージを書くことができ、他のユーザーは[name]:[message].

冗長であるため、書き込むたびにユーザーの名前とIDを送信したくないsocket.emit('say', message);ので、サーバーで行っていることは次のようになります。

var io = require("socket.io").listen(server),
    sockets = {};

io.sockets.on('connection', function (socket){
    socket.on('savePersonToSocket', function(user){
        socket.user = user;
        sockets[user.id] = socket;
    }
    socket.on('doSomething', doSomething);
});

// must be outside of 'connection' since I have TONS of these in a much more 
//complex structure and I don't want to create them all per user connection.
function doSomething(){
    ...
    sockets[userID].emit('foo'); // how to get the userID at this point?
    ...
}

では、その時点でユーザー ID を取得するにはどうすればよいでしょうか。

ノート:

  • Facebook アカウントにログインして接続するユーザーごとに、クライアントはサーバーにその人の名前と ID を保存するように指示します。

私は、ユーザーの名前と ID を保存する Cookie を使用してそれを行うことを考えました。サーバーは Cookie を読み取ることでどのユーザーであるかを知ることができますが、これは少し見苦しい解決策です。その情報を毎回送信するのは冗長です。

また、「on」関数を (何らかの方法で) ハイジャックし、それがどのユーザーであるかを知る機能を追加することもできます。これは、すべての「on」リスナーがいずれにしても「connection」リスナー内に存在する必要があるためです。

4

6 に答える 6

2

おそらく起こっていることは、ユーザーがチャット アプリケーションに接続することです。

io.sockets.on('connection', function (s){
  socket = s; // cache for later usage

socketコンテキストからバインドされていない変数に「彼のソケット」を割り当てます。それはそれ自体です。ここで、2 番目のユーザーが到着し、2 番目のユーザーの 2 番目に再割り当てされるとしますが、イベントsocketを取得すると、それが使用されます。これはすべてのユーザーで同じであり、より詳細には、最後に接続したユーザーに関連しています。savePersonToSocketsocket

への参照を保持する必要はありませんs。多くのユーザーがアプリケーションに接続する場合は、おそらくそれに対処する必要がありますが、解決策はアプローチとは大きく異なります。

編集:別の方法は、ユーザーIDとsocketsをマッピングすることです:

// this assumes that the name of a user is unique
var userSocket = {};

io.sockets.on('connection', function (s){
  socket.on('savePersonToSocket', function(user){
    userSocket[user.name] = s;
  }

doSomethingつまり、基本的には、イベント ペイロードにuserID?を渡したくないということです。それは私にとって有効な解決策のように思えるので、冗長ではなく、サーバーが処理しているユーザーをサーバーに知らせる最も簡単な方法です。他のソリューションはもっと洗練されているかもしれませんが、これほどシンプルで簡単に保守できるとは思えません。

于 2013-05-18T17:55:33.627 に答える
1

接続を文字通り保存することはできません。かなり頻繁に変更されています。ただし、socket.id は保存できます。あなたは io.sockets.sockets[socketid] を持っています。これはおそらくあなたが探しているものです。

ID と名前の配列を保存して、必要に応じて再利用できます。

(プロセス関連の変数はそれほどスケーラブルではないことに注意してください。しかし、最初は長い間それを気にすることはできません:)

また、ソケット関連のストア オブジェクト socket.handshake socket.handshake.somevariable=simple_value_a_string_or_a_number があります。

于 2013-05-24T18:44:04.160 に答える
0

あなたがこれを尋ねてから長い時間が経っていることは知っていますが、ちょうど4日前に、まさにあなたが望んでいたものを管理するnode js、express、およびsocket.ioのモジュールを公開しました。使用法と例を確認してください。このモジュールが役立つことを願っています!

NPM socket.io.users 経由でインストールできます。これは、socket.io アプリケーション用のノード js モジュールです。クライアントごとに 1 ユーザー。

この回答で使用コードの一部を見ることができます

于 2015-06-20T19:31:01.313 に答える
0

これはどう:

var io = require("socket.io").listen(server),
    sockets = {};

io.sockets.on('connection', function (socket){
    socket.on('savePersonToSocket', function(user){
        socket.user = user;
        sockets[user.id] = socket;
    }
    socket.on('doSomething', function() { doSomething(socket.user) });
});

// must be outside of 'connection' since I have TONS of these in a much more 
//complex structure and I don't want to create them all per user connection.
function doSomething(user){
    ...
    sockets[user.id].emit('foo');
    ...
}
于 2013-05-29T23:31:22.473 に答える