เพียงหนึ่งเดือนครึ่งที่ผ่านมาฉันได้จัดการกับปัญหาเดียวกันและหลังจากนั้นก็เขียนบล็อกโพสต์มากมายในหัวข้อนี้ซึ่งใช้ร่วมกับแอปสาธิตที่ใช้งานได้อย่างสมบูรณ์ซึ่งโฮสต์บน GitHub โซลูชันนี้อาศัยโมดูลโหนดExpress-session , cookie-parserและconnect-redisเพื่อรวมทุกอย่างเข้าด้วยกัน ช่วยให้คุณสามารถเข้าถึงและแก้ไขเซสชันจากทั้งบริบท REST และ Sockets ซึ่งมีประโยชน์มาก
สองส่วนที่สำคัญคือการตั้งค่ามิดเดิลแวร์: 
app.use(cookieParser(config.sessionSecret));
app.use(session({
    store: redisStore,
    key: config.sessionCookieKey,
    secret: config.sessionSecret,
    resave: true,
    saveUninitialized: true
}));
... และการตั้งค่าเซิร์ฟเวอร์ SocketIO:
ioServer.use(function (socket, next) {
    var parseCookie = cookieParser(config.sessionSecret);
    var handshake = socket.request;
    parseCookie(handshake, null, function (err, data) {
        sessionService.get(handshake, function (err, session) {
            if (err)
                next(new Error(err.message));
            if (!session)
                next(new Error("Not authorized"));
            handshake.session = session;
            next();
        });
    });
});
พวกเขาทำงานร่วมกับโมดูล sessionService แบบง่ายที่ฉันสร้างขึ้นซึ่งช่วยให้คุณสามารถดำเนินการขั้นพื้นฐานกับเซสชันได้และรหัสนั้นมีลักษณะดังนี้:
var config = require('../config');
var redisClient = null;
var redisStore = null;
var self = module.exports = {
    initializeRedis: function (client, store) {
        redisClient = client;
        redisStore = store;
    },
    getSessionId: function (handshake) {
        return handshake.signedCookies[config.sessionCookieKey];
    },
    get: function (handshake, callback) {
        var sessionId = self.getSessionId(handshake);
        self.getSessionBySessionID(sessionId, function (err, session) {
            if (err) callback(err);
            if (callback != undefined)
                callback(null, session);
        });
    },
    getSessionBySessionID: function (sessionId, callback) {
        redisStore.load(sessionId, function (err, session) {
            if (err) callback(err);
            if (callback != undefined)
                callback(null, session);
        });
    },
    getUserName: function (handshake, callback) {
        self.get(handshake, function (err, session) {
            if (err) callback(err);
            if (session)
                callback(null, session.userName);
            else
                callback(null);
        });
    },
    updateSession: function (session, callback) {
        try {
            session.reload(function () {
                session.touch().save();
                callback(null, session);
            });
        }
        catch (err) {
            callback(err);
        }
    },
    setSessionProperty: function (session, propertyName, propertyValue, callback) {
        session[propertyName] = propertyValue;
        self.updateSession(session, callback);
    }
};
เนื่องจากมีโค้ดมากกว่านี้ทั้งหมด (เช่นการเริ่มต้นโมดูลการทำงานกับซ็อกเก็ตและการเรียก REST ทั้งฝั่งไคลเอนต์และฝั่งเซิร์ฟเวอร์) ฉันจะไม่วางโค้ดทั้งหมดที่นี่คุณสามารถดูได้ใน GitHub และคุณสามารถทำอะไรก็ได้ที่คุณต้องการ 
     
              
{ path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } }แต่ถ้าฉันพิมพ์เซสชันในเส้นทางของฉันฉันจะได้รับตัวแปรเซสชันทั้งหมดที่ฉันตั้งค่าไว้ (ชื่อผู้ใช้ id ฯลฯ .. )