2017-10-13 88 views
3

我不明白为什么这种情况发生的原因完全是因为之前完美的工作。Socket.io没有与快递分享会话

我使用下列库:

"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 - 用户登录后,在我告诉前台“OK,用户登录,现在连接到插座”:

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是相同的登录流程会话ID,但文件不user_sessions存在(注意,会话ID是不一样的)

为什么这个任何想法正在发生?我完全不知道。

感谢

+1

'VAR e_session = e_session({...})'是坏的,我的VAR重命名为'session'所以很显然,你不会覆盖进口REF(它实际上可能是来源你问题)。 – James

+0

@詹姆斯已经做到了,但问题依然存在。 – Fane

+0

@詹姆斯没有其他想法?仍然停留:( – Fane

回答

0

试图通过字符串化会话JSON和检索,并在客户端解析回会话对象共享会话。

这可能有效。

+0

它最有可能的工作是,但它也会使应用容易受到身份攻击,很可能... – Fane