डेढ़ महीने पहले मैंने उसी समस्या से निपटा और बाद में इस विषय पर एक व्यापक ब्लॉग पोस्ट लिखी, जो गीथहब पर होस्ट किए गए पूरी तरह से काम कर रहे डेमो ऐप के साथ जाती है। समाधान एक्सप्रेस-सत्र , कुकी-पार्सर और कनेक्ट-रेडिस नोड मॉड्यूल पर निर्भर करता है ताकि सब कुछ टाई हो सके। यह आपको REST और सॉकेट्स संदर्भ से सत्रों को एक्सेस और संशोधित करने की अनुमति देता है जो काफी उपयोगी है।
दो महत्वपूर्ण भाग मिडलवेयर सेटअप हैं:
app.use(cookieParser(config.sessionSecret));
app.use(session({
store: redisStore,
key: config.sessionCookieKey,
secret: config.sessionSecret,
resave: true,
saveUninitialized: true
}));
... और सॉकेटियो सर्वर सेटअप:
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();
});
});
});
वे एक साधारण सेशन सर्विस मॉड्यूल के साथ जाते हैं, जो मैंने बनाया है जो आपको सत्रों के साथ कुछ बुनियादी संचालन करने की अनुमति देता है और यह कोड इस तरह दिखता है:
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 } }
लेकिन अगर मैं अपने मार्गों में सत्र को प्रिंट करता हूं तो मुझे मेरे द्वारा सेट किए गए सभी सत्र चर मिलते हैं (उपयोगकर्ता नाम, आईडी, आदि)