【发布时间】:2017-10-13 15:23:53
【问题描述】:
我不知道为什么会发生这种情况,因为它之前运行良好。
我正在使用以下库:
"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 文件已创建。
=> Socket 连接:fiaejgieofaekofek 是同一登录流程中的会话 id但文件不存在在 user_sessions 中(注意会话 id 不一样)
知道为什么会这样吗?我完全不知道。
谢谢
【问题讨论】:
-
var e_session = e_session({ ... })不好,我会将 var 重命名为session以便清楚并且您不会覆盖导入引用(它实际上可能是您问题的根源)。跨度> -
@James 已经这样做了,但问题仍然存在。
-
@James 没有其他想法?仍然卡住:(
-
我的意思是有明显的问题可能是我不想一直问的问题,请提供一个小而完整的代码示例,以便我可以正确诊断.
-
“不工作”的代码正好在上面......控制台日志不一样,会话ID不一样尽管用户正确登录http,是返回前端,然后前端发送socket请求...
标签: node.js sockets session cookies socket.io