📑

http サーバーにsocket.ioを統合した時のセッションの共有について

2024/02/22に公開

セッションの共有

Httpサーバーとsocket.ioを統合し、かつ、httpサーバーのセッション情報をsocket.ioでも共有しようと考えた時、以下のようなコードを書くことになる。

var sessionMiddleWare = session({
  ...
});

...

app.use(sessionMiddleWare);
var server = app.listen(port, function(){
    console.log('Express listening on port', port);
});
var listen = require('socket.io');
var io = listen(server);
io.use(function(socket, next){
  sessionMiddleWare(socket.request, socket.request.res, next);
});

以前は上記のようなコードで正しく動作したのだが、現在のバージョン(Ver4以降)のsocket.ioではsocket.io.resの値がnullとなっていて、下記のコードが正しく動作しない。

sessionMiddleWare(socket.request, socket.request.res, next);

対処方法

セッションをhttpサーバーとWebSokcetで共有するためには次のように修正する必要がある。

修正前

io.use(function(socket, next){
  sessionMiddleWare(socket.request, socket.request.res, next);
});

修正後

io.engine.use(sessionMiddleware);

socket.ioをver4にアップデートしてセッション共有が動作しなくなった場合はこのような修正を行うことで、以前と同じようにセッションの共有が実現できる。

参考資料

https://socket.io/how-to/use-with-express-session

Discussion