Chỉ một tháng rưỡi trước, tôi đã giải quyết vấn đề tương tự và sau đó đã viết một bài đăng blog mở rộng về chủ đề này cùng với một ứng dụng demo hoạt động hoàn toàn được lưu trữ trên GitHub. Giải pháp dựa trên các mô-đun nút express-session , cookie-parser và connect-redis để kết nối mọi thứ. Nó cho phép bạn truy cập và sửa đổi các phiên từ cả ngữ cảnh REST và Sockets, khá hữu ích.
Hai phần quan trọng là thiết lập phần mềm trung gian:
app.use(cookieParser(config.sessionSecret));
app.use(session({
store: redisStore,
key: config.sessionCookieKey,
secret: config.sessionSecret,
resave: true,
saveUninitialized: true
}));
... và thiết lập máy chủ 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();
});
});
});
Chúng đi cùng nhau với một mô-đun sessionService đơn giản mà tôi đã tạo cho phép bạn thực hiện một số thao tác cơ bản với các phiên và mã đó trông giống như sau:
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);
}
};
Vì có nhiều mã hơn cho toàn bộ điều này (như khởi tạo mô-đun, làm việc với các ổ cắm và lệnh gọi REST trên cả phía máy khách và phía máy chủ), tôi sẽ không dán tất cả mã ở đây, bạn có thể xem nó trên GitHub và bạn có thể làm bất cứ điều gì bạn muốn với nó.
{ path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } }
Nhưng nếu tôi in phiên trong các tuyến đường của mình, tôi sẽ nhận được tất cả các biến phiên mà tôi đã thiết lập (tên người dùng, id, v.v.)