Session Express-socket.io-读取会话
我使用express和socket.io 当您使用express-post创建会话时。单击按钮并使用Ajax和POST方法(登录),我保存了一个会话Session Express-socket.io-读取会话,session,node.js,socket.io,Session,Node.js,Socket.io,我使用express和socket.io 当您使用express-post创建会话时。单击按钮并使用Ajax和POST方法(登录),我保存了一个会话 app.post('/login', function(req, res){ req.session.loginid = req.body.lgnid; }); 在socket.io中,它无法读取 谢谢你的建议 我的源代码: var express = require('express'); var app = exp
app.post('/login', function(req, res){
req.session.loginid = req.body.lgnid;
});
在socket.io中,它无法读取
谢谢你的建议
我的源代码:
var express = require('express');
var app = express.createServer();
var io = require('socket.io').listen(app);
var MemoryStore = express.session.MemoryStore;
var sessionStore = new MemoryStore();
var parseCookie = require('connect').utils.parseCookie;
var Session = require('connect').middleware.session.Session;
var stylus = require('stylus');
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({store: sessionStore
, secret: 'secret'
, key: 'express.sid'}));
app.use(stylus.middleware({ src: __dirname + '/public', compile: compile }))
app.use(express.static(__dirname + '/public'));
app.set('views', __dirname);
// disable layout
app.set("view options", {layout: false});
// make a custom html template
app.register('.html', {
compile: function(str, options){
return function(locals){
return str;
};
}
});
function compile (str, path) {
return stylus(str)
.set('filename', path)
.use(nib());
};
var Session = require('connect').middleware.session.Session;
sio.set('authorization', function (data, accept) {
if (data.headers.cookie) {
data.cookie = parseCookie(data.headers.cookie);
data.sessionID = data.cookie['express.sid'];
// save the session store to the data object
// (as required by the Session constructor)
data.sessionStore = sessionStore;
sessionStore.get(data.sessionID, function (err, session) {
if (err || !session) {
accept('Error', false);
} else {
// create a session object, passing data as request and our
// just acquired session data
data.session = new Session(data, session);
accept(null, true);
}
});
} else {
return accept('No cookie transmitted.', false);
}
});
如何从sessionStore加载和保存数据?
io.sockets.on('connection', function (socket) {
var hs = socket.handshake;
console.log('Session : ' + hs.session.loginid + '); //Session : undefined
});
实际实现这一点的推荐方法(至少在我的经验中)是放弃
sessionStore.get
函数,转而使用sessionStore.load
——不同之处在于,使用load时,回调会被赋予一个会话实例,而不必自己创建一个。不同之处在于,只需获取您的代码片段:
sessionStore.get(data.sessionID, function (err, session) {
if (err || !session) {
accept('Error', false);
} else {
// create a session object, passing data as request and our
// just acquired session data
data.session = new Session(data, session);
accept(null, true);
}
});
并将其更改为:
sessionStore.load(data.sessionID, function(err, session) {
if (err || !session) {
accept("Error", false);
} else {
data.session = session;
accept(null, true);
}
});
从那里,您应该能够在尝试时访问会话,例如socket.handshake.session
,但是在处理会话时,如果您在socket事件中进行了更改,您必须自己手动保存会话。如果添加/删除内容,则必须:session.save([callback])
我意识到这不是一个很好的答案,因为我告诉你大致做你已经做的事情,但这对我来说现在使用Express
2.5.8
和Socket.IO0.9.6
是实现这一目标的推荐方法(至少在我的经验中)就是放弃sessionStore.get
函数,转而使用sessionStore.load
——不同之处在于,使用load时,回调会被赋予一个会话实例,而不必自己创建一个。不同之处在于,只需获取您的代码片段:
sessionStore.get(data.sessionID, function (err, session) {
if (err || !session) {
accept('Error', false);
} else {
// create a session object, passing data as request and our
// just acquired session data
data.session = new Session(data, session);
accept(null, true);
}
});
并将其更改为:
sessionStore.load(data.sessionID, function(err, session) {
if (err || !session) {
accept("Error", false);
} else {
data.session = session;
accept(null, true);
}
});
从那里,您应该能够在尝试时访问会话,例如socket.handshake.session
,但是在处理会话时,如果您在socket事件中进行了更改,您必须自己手动保存会话。如果添加/删除内容,则必须:session.save([callback])
我意识到这不是一个很好的答案,因为我告诉你大致做你已经做的事情,但这对我来说现在使用Express2.5.8
和Socket.IO0.9.6