7

Express.js と socket.io セッションを一緒にマージしたいと考えています。以下は私のコードです(socket.io部分)

var io = require('socket.io').listen(app);
io.set('log level', 1);

io.sockets.on('connection', function (socket) {
    console.log('client connected');
client.send(client.id);//send client id to client itself
socket.on('connect', function(){
    console.log(socket.id + ' connected');
});
socket.on('disconnect', function(){
    console.log(socket.id + ' disconnected');
});
});

私のexpress.jsセッション設定:

app.configure(function() {
  //app.use(express.logger());
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.static(__dirname + '/static'));
  app.use(express.cookieParser());
  app.use(express.session({store: MemStore({
    reapInterval: 60000 * 10
  }), secret:'foobar', key: 'express.sid'
}));

私の主な問題は、ユーザーが 1 つの URL から別の URL に移動したときに端末にあることです。セッション ID も変更されます。しかし、変更したくありません。

info  - socket.io started
client connected
client connected
4Z0bYHzfWCEFzbbe4WUK disconnected
e_uSvxhSLbLAC9-F4WUL disconnected
client connected
bKDy90gsrWWTRJDD4WUM disconnected
client connected
RJ5qqCL2wfmXbd7U4WUN disconnected
client connected
wjN5Sqx4rucRtWL_4WUO disconnected
4

1 に答える 1

6

express.jsからのセッションIDではなく、ソケットIDを出力しています。

イベントを使用する必要がありますauthorization。その最初のパラメーターは、というエントリを持つオブジェクトsessionIDです。この値はCookie(またはRedisデータベースなど)に保存されるため、ページの再読み込み間で変更しないでください。

これがどのように機能するかを説明する良い記事です:http ://www.danielbaulig.de/socket-ioexpress/ 、しかしそれは少し時代遅れです。基本的な原則は同じですが、いくつかの詳細が変更されています。たとえば、彼がサーバーを作成する方法は機能しなくなり、接続開発者はを削除しましparseCookie()た。ユーザーはその決定に満足していませんが、回避策は次の覚えやすいコード行です。

connect.utils.parseSignedCookies(cookie.parse(decodeURIComponent(data.headers.cookie)), secret);

私が言ったように、上記の記事はあなたが必要とするすべての基本をあなたに与えるはずです、あなたが実際の実装を見たいならば、これを見てください:https ://github.com/vortec/lolbr/blob/master/lib/ lolbr.js

authorizationイベントハンドラー内で、オブジェクトを変更し、data後でオブジェクトにアクセスできます。socket.handshakeこの場合は、を使用しますsocket.handshake.sessionID

お役に立てば幸いです。

于 2012-08-06T12:59:11.983 に答える