Hanya satu setengah bulan yang lalu saya menangani masalah yang sama dan setelah itu menulis posting blog ekstensif tentang topik ini yang sejalan dengan aplikasi demo yang berfungsi penuh yang dihosting di GitHub. Solusinya bergantung pada modul node sesi-ekspres , cookie-parser, dan connect-redis untuk mengikat semuanya. Ini memungkinkan Anda untuk mengakses dan memodifikasi sesi dari konteks REST dan Sockets yang cukup berguna.
Dua bagian penting adalah pengaturan middleware:
app.use(cookieParser(config.sessionSecret));
app.use(session({
store: redisStore,
key: config.sessionCookieKey,
secret: config.sessionSecret,
resave: true,
saveUninitialized: true
}));
... dan pengaturan server 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();
});
});
});
Mereka pergi bersama dengan modul sessionService sederhana yang saya buat yang memungkinkan Anda melakukan beberapa operasi dasar dengan sesi dan kode itu terlihat seperti ini:
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);
}
};
Karena ada lebih banyak kode untuk semuanya daripada ini (seperti menginisialisasi modul, bekerja dengan soket dan panggilan REST pada klien dan sisi server), saya tidak akan menempelkan semua kode di sini, Anda dapat melihatnya di GitHub dan Anda dapat melakukan apa pun yang Anda inginkan dengannya.
{ path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } }
Tetapi jika saya mencetak sesi di rute saya, saya mendapatkan semua variabel sesi yang telah saya siapkan (nama pengguna, id, dll ..)