就在一個(gè)半月前,我處理了同樣的問(wèn)題,后來(lái)寫了一篇廣泛的文章。博客帖子在這個(gè)問(wèn)題上,它與一個(gè)充分發(fā)揮作用的問(wèn)題結(jié)合在一起演示應(yīng)用程序托管在GitHub上。解決方案依賴于特快會(huì)議, cookie解析器和連紅節(jié)點(diǎn)模塊來(lái)連接所有的東西。它允許您訪問(wèn)和修改來(lái)自REST和Socket上下文的會(huì)話,這是非常有用的。
中間件設(shè)置是兩個(gè)關(guān)鍵部分:
app.use(cookieParser(config.sessionSecret));app.use(session({
store: redisStore,
key: config.sessionCookieKey,
secret: config.sessionSecret,
resave: true,
saveUninitialized: true}));
.和SocketIO服務(wù)器設(shè)置:
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();
});
});});
它們與我創(chuàng)建的一個(gè)簡(jiǎn)單的sessionService模塊一起使用,它允許您對(duì)會(huì)話執(zhí)行一些基本操作,代碼如下所示:
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);
}};
因?yàn)檎麄€(gè)過(guò)程中有更多的代碼(比如初始化模塊,在客戶機(jī)和服務(wù)器端使用套接字和REST調(diào)用),所以我不會(huì)在這里粘貼所有的代碼,您可以在GitHub上查看它,您可以使用它做任何事。