불과 한 달 반 전에 나는 같은 문제를 다루었 고 그 후 GitHub에서 호스팅 되는 완전히 작동하는 데모 앱 과 함께이 주제에 대한 광범위한 블로그 게시물 을 작성했습니다 . 이 솔루션은 모든 것을 묶기 위해 express-session , cookie-parser 및 connect-redis 노드 모듈에 의존 합니다. 매우 유용한 REST 및 소켓 컨텍스트에서 세션에 액세스하고 수정할 수 있습니다.
두 가지 중요한 부분은 미들웨어 설정입니다.
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에서 볼 수 있습니다. 원하는 것은 무엇이든 할 수 있습니다.
{ path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } }
하지만 내 경로에 세션를 인쇄하면 내가 설정 한 모든 세션 변수 (사용자 이름, ID, 등) 취득