দেড় মাস আগে আমি একই সমস্যাটি মোকাবিলা করেছি এবং এরপরে এই বিষয়টিতে একটি বিস্তৃত ব্লগ পোস্ট লিখেছিলাম যা গিটহাবের উপর হোস্ট করা সম্পূর্ণরূপে কাজ করা ডেমো অ্যাপ্লিকেশনটির সাথে একসাথে চলেছে। সমাধান এক্সপ্রেস-সেশন , কুকি-পার্সার এবং কানেক্ট-রেডিস নোড মডিউলগুলিকে সবকিছু বেঁধে রাখার উপর নির্ভর করে । এটি আপনাকে আরইএসটি এবং সকেট উভয় প্রসঙ্গ থেকে সেশন অ্যাক্সেস এবং সংশোধন করতে দেয় যা বেশ কার্যকর।
দুটি গুরুত্বপূর্ণ অংশ হ'ল মিডলওয়্যার সেটআপ:
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);
}
};
যেহেতু এর চেয়ে পুরো বিষয়টিতে আরও কোড রয়েছে (যেমন মডিউলগুলি আরম্ভ করা, ক্লায়েন্ট এবং সার্ভার উভয় পক্ষেই সকেট এবং আরএসটি কলগুলির সাথে কাজ করা), আমি এখানে সমস্ত কোড পেষ্ট করব না, আপনি এটি গিটহাবে দেখতে পারেন এবং আপনি এটি দিয়ে যা করতে পারেন তা করতে পারেন।
{ path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } }
তবে আমি যদি আমার রুটে সেশনটি প্রিন্ট করি তবে আমি সেট করে রেখেছি সমস্ত সেশন ভেরিয়েবলগুলি (ব্যবহারকারীর নাম, আইডি, ইত্যাদি) পেয়েছি