如何与Socket.IO1.x和Express 4.x共享会话?

如何与Socket.IO1.x和Express 4.x共享会话?

如何与Socket.io 1.0和Express 4.x共享会话?我使用Redis商店,但我相信这不重要。我知道我必须使用中间件来查看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'));
        }
    });


幕布斯6054654
浏览 600回答 3
3回答

阿波罗的战车

就在一个半月前,我处理了同样的问题,后来写了一篇广泛的文章。博客帖子在这个问题上,它与一个充分发挥作用的问题结合在一起演示应用程序托管在GitHub上。解决方案依赖于特快会议, cookie解析器和连红节点模块来连接所有的东西。它允许您访问和修改来自REST和Socket上下文的会话,这是非常有用的。中间件设置是两个关键部分: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上查看它,您可以使用它做任何事。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Node.js