1. ホーム
  2. node.js

[解決済み] Socket.IO 1.xとExpress 4.xでセッションを共有するには?

2023-01-17 20:45:53

質問

Socket.io 1.0 と Express 4.x でセッションを共有するにはどうしたらよいですか。Redis Store を使用していますが、問題ないはずです。Cookie を参照し、セッションを取得するためにミドルウェアを使用しなければならないことは分かっていますが、その方法が分かりません。検索してみましたが、動作するものは見つかりませんでした。

    var RedisStore = connectRedis(expressSession);
    var session = expressSession({
        store: new RedisStore({
            client: redisClient
        }),
        secret: mysecret,
        saveUninitialized: true,
        resave: true
    });
    app.use(session);

    io.use(function(socket, next) {
        var handshake = socket.handshake;
        if (handshake.headers.cookie) {
            var str = handshake.headers.cookie;
            next();
        } else {
            next(new Error('Missing Cookies'));
        }
    });

どのように解決するのですか?

解決方法は驚くほど簡単です。ただ、あまり文書化されていないだけです。このような小さなアダプタを使用することで、express セッション ミドルウェアを Socket.IO ミドルウェアとしても使用することができます。

sio.use(function(socket, next) {
    sessionMiddleware(socket.request, socket.request.res, next);
});

express 4.x、Socket.IO 1.x、Redisを使用した完全な例です。

var express = require("express");
var Server = require("http").Server;
var session = require("express-session");
var RedisStore = require("connect-redis")(session);

var app = express();
var server = Server(app);
var sio = require("socket.io")(server);

var sessionMiddleware = session({
    store: new RedisStore({}), // XXX redis server config
    secret: "keyboard cat",
});

sio.use(function(socket, next) {
    sessionMiddleware(socket.request, socket.request.res || {}, next);
});

app.use(sessionMiddleware);

app.get("/", function(req, res){
    req.session // Session object in a normal request
});

sio.sockets.on("connection", function(socket) {
  socket.request.session // Now it's available from Socket.IO sockets too! Win!
});


server.listen(8080);