14

私はこのガイドに従っています: http://www.danielbaulig.de/socket-ioexpress/ to link express.js to socket.io 見事に動作します。

ユーザーが1つのページ(セッションオブジェクトを設定するexpress.js POSTリクエスト)にログインし、認証されると、socket.ioがロードされ、サーバー上でsocket.ioがセッションを取得できる新しいページに誘導しますエクスプレスから設定されました。すべてが正常に機能するように。

現在、socket.io を使用するページにユーザーがいて、そのページが更新されると、socket.io 接続がまだ存在することがあります (つまり、切断されません)。私がやろうとしているのは、io.set('authorization')関数を変更して、ユーザーが接続したときに、そのクライアントに対してまだ開いているすべての既存の socket.io インスタンスを切断することです。

現時点での様子は次のとおりです。

//socket.io connect to express
var parseCookie = require('connect').utils.parseCookie;
io.set('authorization', function (data, accept) {
    if (data.headers.cookie) 
    {
        data.cookie = parseCookie(data.headers.cookie);
        data.sessionID = data.cookie['express.sid'];
        // (literally) get the session data from the session store
        sessionStore.get(data.sessionID, function (err, session) 
        {
            if (err || !session) 
            {
                // if we cannot grab a session, turn down the connection
                //note: a session is created when the user logs in
                accept('Error', false);
            } 
            else 
            {
                //TODO something here before we accept the connection
                //??

                // save the session data
                data.session = session;
                //accept the connection
                accept(null, true);
            }
        });
    } 
    else 
    {
        return accept('No cookie transmitted.', false);
    }
});

受け入れようとしているクライアントに以前の接続があり、それがまだ開いているかどうかを確認するにはどうすればよいですか (したがって、その古い接続を切断する必要があります)。

エクスプレスセッションには「ユーザー名」が含まれているため、セッションオブジェクトを取得してユーザー名を取得できます。すべてのsocket.ioクライアントのリストを調べてエクスプレスを見る方法がわかりませんそれぞれのセッションを調べて、現在認証しているユーザーと同じかどうかを確認します。

4

2 に答える 2

7

私のアプリケーションでは、socket.io セッションを明示的に管理します。サーバー側では、新しい接続が確立されるたびに、次のようなことを行いますsocketio_session[user_id].push(session)。これにより、特定のユーザーに接続されているすべてのセッションにアクセスできます。あなたの場合、ユーザーごとにセッションのリストを保存する必要はありませんがonconnect、新しいセッションを保存する前に、最新のセッションのみを保存し、既存のセッションがあれば強制的に切断します。

于 2012-05-09T06:02:00.217 に答える
0

Socket.IO は古いコードがたくさんあります。

新しいドキュメント (現在 Socket.IO 1.3.6) には次のように書かれています。

「古い io.set () および io.get () メソッドは非推奨であり、下位互換性のためにのみサポートされています。これは、古いスタイルの承認の例をミドルウェアに変換したものです。」「0.9からの移行」セクションで

新しいバージョンの Socket.IO を使用している場合。必要なコードは次のようなものです。

    var sessionStore    = new MongoStore({ url: config.db });
    var cookie          = require('cookie-parser')("SECRET");
    io.use(function(socket, callback) {
        if (socket.request.headers.cookie) {
            cookie(socket.request, null, function(err) {
                sessionStore.get(socket.request.signedCookies["connect.sid"], function(err, session) {
                    if (err || !session) {
                      callback('Session error', false);
                    } else {
                      socket.request.sessionID = socket.request.signedCookies["connect.sid"];
                      console.log(socket.request.sessionID);
                      callback(null, true);
                    }
                  });
            });
        }
        else {
            return callback('No session.', false);
        }
    });
    io.on('connection', function(socket) {
        console.log(socket.request.sessionID);
    });
于 2015-09-22T04:55:34.190 に答える