Express – socket.io – 读取会话

我使用express和socket.io。

当你创build一个与快递的会话。 点击button,使用Ajax和POST方法(login),我保存一个会话。

app.post('/login', function(req, res){ req.session.loginid = req.body.lgnid; }); 

在socket.io中它无法读取。

感谢您的build议。

我的源代码:

 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 }); 

一个推荐的方法实际上(至less在我的经验),是放弃sessionStore.get函数,而不是去sessionStore.load – 不同的是,与负载callback给了一个会话实例,而不是必须自己创build一个。 不同的是简单地采取你的片段:

 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 ,但是当处理会话时,如果你在套接字事件中进行了更改,则必须自己手动保存会话。 如果你添加/删除的东西,你必须: session.save([callback])

我意识到这不是一个很大的答案,因为我告诉你大致做你已经是,但现在使用Express 2.5.8和Socket.IO 0.9.6这个工作。