亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何與Socket.IO1.x和Express 4.x共享會話?

如何與Socket.IO1.x和Express 4.x共享會話?

幕布斯6054654 2019-07-15 10:14:03
如何與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'));         }     });
查看完整描述

3 回答

?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

就在一個半月前,我處理了同樣的問題,后來寫了一篇廣泛的文章。博客帖子在這個問題上,它與一個充分發揮作用的問題結合在一起演示應用程序托管在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上查看它,您可以使用它做任何事。


查看完整回答
反對 回復 2019-07-15
  • 3 回答
  • 0 關注
  • 645 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號