所以我试图让Session在我的socket.on(’connection’,…)内部工作,我试图使用最新版本进行工作:Socket.io-0.9.13,Express-3.1.0和最新版本其他模块。
无论如何,我都尝试过使用两个模块’ connect-redis ‘和’ session.socket.io ‘,它们都有类似的问题。
在我的代码中,我有2个redis存储(socketio.RedisStore和require(’connect- redis’)(express)),现在此程序运行良好,但是由于express和socket.io需要共享会话数据,我想知道是否此设置将正确使用会话吗?会话存储区是否需要成为express / socketio的同一对象?对我来说有些灰色区域,因为2个RedisStore会在后台使用相同的数据库?
我尝试在两个地方都使用socket.io redisStore或connect-redis redisStore,但是socket.io不喜欢connect-redis redisStore,而express不喜欢socketio.redisStore。
如果我使用connect-redis RedisStore,则socket.io/lib/manager.js会抱怨:this.store.subscribe(… TypeError Object#没有方法’subscribe’
如果我使用socketio.RedisStore,则express / node_modules / connect / lib / middleware / session.js会抱怨:TypeError:Object#没有方法’get’
*请注意,我宁愿让session.socket.io插件正常工作,但是当我对该插件进行相同的设置时,express(也)抱怨:TypeError:Object#没有方法’get’
因此,我可以在会话中使用2个不同的RedisStores,还是我需要以某种方式使两者同时工作,如果可以的话,关于如何解决的想法?
我当前的代码如下所示:
var CONST = { port: 80, sessionKey: 'your secret sauce' }; var redis = require('redis'); var express = require('express'), socketio = require('socket.io'), RedisStore = require('connect-redis')(express); var redisStore = new RedisStore(), socketStore = new socketio.RedisStore(); var app = express(), server = require('http').createServer(app), io = socketio.listen(server); app.configure(function(){ app.use(express.cookieParser( CONST.sessionKey )); app.use(express.session({ secret: CONST.sessionKey, store: redisStore })); app.use(express.static(__dirname + '/test')); app.get('/', function (req, res) {res.sendfile(__dirname + '/test/' + 'index.htm');}); }); io.configure(function(){ io.set('log level', 1); io.enable('browser client minification'); io.enable('browser client etag'); io.enable('browser client gzip'); io.set('store', socketStore); }); io.sockets.on('connection', function(socket){ socket.emit('message', 'Test 1 from server') }); server.listen( CONST.port ); console.log('running...');
在中io.configure,您必须将套接字与http会话链接。
io.configure
这是一段提取Cookie的代码(这是使用socket.io和xhr-polling,我不知道这是否适用于websocket,尽管我怀疑它会起作用)。
xhr-polling
var cookie = require('cookie'); var connect = require('connect'); var sessionStore = new RedisStore({ client: redis // the redis client }); socketio.set('authorization', function(data, cb) { if (data.headers.cookie) { var sessionCookie = cookie.parse(data.headers.cookie); var sessionID = connect.utils.parseSignedCookie(sessionCookie['connect.sid'], secret); sessionStore.get(sessionID, function(err, session) { if (err || !session) { cb('Error', false); } else { data.session = session; data.sessionID = sessionID; cb(null, true); } }); } else { cb('No cookie', false); } });
然后,您可以使用以下方式访问会话:
socket.on("selector", function(data, reply) { var session = this.handshake.session; ... }
这还具有另一个好处,即它检查是否存在有效的会话,因此只有您登录的用户才能使用套接字。但是,您可以使用其他逻辑。