Mus*_*afa 82 session node.js express socket.io
如何与Socket.io 1.0和Express 4.x共享会话?我使用Redis商店,但我认为这无关紧要.我知道我必须使用中间件来查看cookie和获取会话,但不知道如何.我搜索但找不到任何工作
var RedisStore = connectRedis(expressSession);
var session = expressSession({
store: new RedisStore({
client: redisClient
}),
secret: mysecret,
saveUninitialized: true,
resave: true
});
app.use(session);
io.use(function(socket, next) {
var handshake = socket.handshake;
if (handshake.headers.cookie) {
var str = handshake.headers.cookie;
next();
} else {
next(new Error('Missing Cookies'));
}
});
Run Code Online (Sandbox Code Playgroud)
Epe*_*eli 198
解决方案非常简单.它没有很好的记录.也可以使用快速会话中间件作为Socket.IO中间件,使用这样的小型适配器:
sio.use(function(socket, next) {
sessionMiddleware(socket.request, socket.request.res, next);
});
Run Code Online (Sandbox Code Playgroud)
这是Express 4.x,Socket.IO 1.x和Redis的完整示例:
var express = require("express");
var Server = require("http").Server;
var session = require("express-session");
var RedisStore = require("connect-redis")(session);
var app = express();
var server = Server(app);
var sio = require("socket.io")(server);
var sessionMiddleware = session({
store: new RedisStore({}), // XXX redis server config
secret: "keyboard cat",
});
sio.use(function(socket, next) {
sessionMiddleware(socket.request, socket.request.res, next);
});
app.use(sessionMiddleware);
app.get("/", function(req, res){
req.session // Session object in a normal request
});
sio.sockets.on("connection", function(socket) {
socket.request.session // Now it's available from Socket.IO sockets too! Win!
});
server.listen(8080);
Run Code Online (Sandbox Code Playgroud)
就在一个半月前,我处理了相同的问题,然后写了一篇有关该主题的广泛博客文章,并与托管在GitHub上的完全正常的演示应用程序一起使用。该解决方案依赖于express-session,cookie-parser和connect-redis节点模块来捆绑一切。它允许您从REST和Sockets上下文访问和修改会话,这非常有用。
两个关键部分是中间件设置:
app.use(cookieParser(config.sessionSecret));
app.use(session({
store: redisStore,
key: config.sessionCookieKey,
secret: config.sessionSecret,
resave: true,
saveUninitialized: true
}));
Run Code Online (Sandbox Code Playgroud)
...和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();
});
});
});
Run Code Online (Sandbox Code Playgroud)
它们与我制作的一个简单的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);
}
};
Run Code Online (Sandbox Code Playgroud)
由于整个代码比这更多(例如初始化模块,在客户端和服务器端使用套接字和REST调用),因此我不会在此处粘贴所有代码,您可以在GitHub上查看您可以随心所欲地做任何事情。
小智 5
是针对您的问题的现成解决方案。通常在 socket.io 端创建的会话与在 express.js 中创建的会话具有不同的 sid
在知道这个事实之前,当我努力寻找解决方案时,我发现了一些奇怪的东西。从 express.js 实例创建的会话可以在 socket.io 端访问,但相反的情况则不可能。很快我就知道我必须通过管理 sid 来解决这个问题。但是,已经有一个包可以解决这个问题。它有据可查,可以完成工作。希望能帮助到你
| 归档时间: |
|
| 查看次数: |
42615 次 |
| 最近记录: |