我已经阅读并复制了很多关于使用socket.io,express和会话存储的会话的例子。但是,每次拨打sessionStore.get()
(或sessionStore.load()
)时,我都会回复undefined
。为什么呢?
这是我的代码(简化):
var app = require('express')(),
session = require('session'),
MongoStore = require('connect-mongostore')(session);
app.use(session({
store: new MongoStore({ 'db': 'sessions' });
}));
io.use(function(socket, next) {
var req = socket.request,
reqCookie = cookie.parse(req.headers.cookie),
sessid = reqCookie['connect.sid']; // == actual session ID
sessionStore.get(sessid, function(err, session) {
err // == undefined
session // == undefined
});
next() ;
});
我还尝试使用session.MemoryStore
代替connect-mongostore
,结果相同。我修改了
node_modules/express-session/session/memory.js
尝试注销sessionStore中的会话:
MemoryStore.prototype.get = function(sid, fn){
var self = this;
console.log(self.sessions); // Output: {}
对于会议等我来说,我是一个新手,所以,谢谢你对我的支持。
更新:我在两个不同的系统和网络上尝试过代码,但我仍然得到相同的结果。
答案 0 :(得分:3)
所以我终于想出了如何解决这个问题。事实证明,从套接字ios socket.request.headers.cookie
返回的会话ID与从nodejs'req.sessionID
返回的会话ID不完全相同。
以下是我在两种情况下获取会话ID的方法,以及它们返回的示例。
正常的http请求
app.get('/', function(req, res) {
req.sessionID; // == LMKJxTssmDgf8IxwijbC9G6LtDBuTQWX
});
Socket.io
io.use(function(socket, next) {
var req = socket.request;
if (req.headers.cookie) {
req.cookie = cookie.parse(req.headers.cookie);
req.cookie['express.sid']; // == s:LMKJxTssmDgf8IxwijbC9G6LtDBuTQWX.ApVkBxAEf4o3Pdgo0PWDRHi+GvBaSdcK7q1pO4xslZ0
正如您所看到的,会话ID在两种情况下都存在,我们只需删除一个socket.io给我们的东西。 解决方案: req.cookie['express.sid'].split('.')[0].split(':')[1];
。