我无法弄清楚为什么会发生这种情况,因为它之前完美无缺。
我正在使用以下库:
"express-socket.io-session": "^1.3.2"
"socket.io": "^2.0.3"
"express": "^4.15.4"
"express-session": "^1.15.5"
1 - 我通过http请求登录用户并将cookie发送回前端。 http上的所有操作都与前端后端交换中的cookie完美配合。
2 - 在用户登录后,我告诉前端“确定,用户已登录,现在连接到套接字”:
io ( this.url );
以下是相关代码:
var io_session = require("express-socket.io-session");
var e_session = require("express-session");
var sessionFileStore = require('session-file-store')(e_session);
var ee_session = e_session({
store: new sessionFileStore({ path: './user_sessions' }),
secret: "something-random",
resave: true,
saveUninitialized: true
});
var enableCORS = function(req, res, next) {
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Origin, Accept, Content-Type, Authorization, Content-Length, X-Requested-With, *');
res.header('Access-Control-Allow-Credentials',true);
// intercept OPTIONS method
if ('OPTIONS' == req.method) {
res.sendStatus(200);
} else {
next();
};
};
app.use(function(req, res, next) {
///
next();
});
//app.use(cookieParser());
app.use(enableCORS);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(ee_session);
preparedApp = require("http").Server(app);
var io = require("socket.io")(preparedApp);
io.use(io_session(e_session,{
autoSave: true
}));
preparedApp.listen(8080, function(){});
io.on('connection', function(socket){
var socket_session = socket.handshake.session,
socket_session_id = socket.handshake.sessionID;
console.log("SOCKET_SESSION:",socket_session);
console.log("SOCKET_SESSION_ID:",socket_session_id);
(...)
3 - socket_session
为“空”,但常规http Cookie中的所有内容都有效。会议在那里进行。
我注意到的一件事是socket_session_id
指向文件夹user_sessions内的会话文件不存在。唯一存在的是在http登录中创建的。所以,基本上:
=>用户登录:创建了efihaeif939311kf3f3会话ID文件。
=>套接字连接:fiaejgieofaekofek是user_sessions中相同登录流但文件不存在的会话ID(请注意会话ID不相同)
有关为何发生这种情况的任何想法?我完全不知道。
由于
答案 0 :(得分:0)
尝试通过对会话json进行字符串化并在客户端检索和解析回会话对象来共享会话。
这可能有用。