所以我正在尝试在socket.on('connection', ...)中使用Sessions。
我正在尝试使用最新版本的模块:Socket.io - 0.9.13,Express - 3.1.0和其他模块的最新版本。
无论如何,我都尝试过使用两个模块 'connect-redis' 和 'session.socket.io',它们都有类似的问题。
在我的代码中,我有两个redis存储(socketio.RedisStore和 require('connect-redis')(express)),现在这个程序都可以正常运行,但是因为express和socket.io需要共享会话数据,所以我想知道这个设置是否会正确地使用sessions?对于express/socketio,会话存储需要是相同的对象吗?对我来说是一个有点模糊的领域,因为两个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 # has no method 'subscribe'
如果我使用socketio.RedisStore,那么express/node_modules/connect/lib/middleware/session.js会报错: TypeError: Object # has no method 'get'
*注意:我更愿意让session.socket.io插件工作,但是当我使用该插件进行相同的设置时,express也会报错: TypeError: Object # has no method 'get'
所以,我是否可以为会话使用2个不同的RedisStores,或者需要让其中一个适用于两者,并且如果需要的话,有什么解决方法?
我的当前代码如下:
无论如何,我都尝试过使用两个模块 'connect-redis' 和 'session.socket.io',它们都有类似的问题。
在我的代码中,我有两个redis存储(socketio.RedisStore和 require('connect-redis')(express)),现在这个程序都可以正常运行,但是因为express和socket.io需要共享会话数据,所以我想知道这个设置是否会正确地使用sessions?对于express/socketio,会话存储需要是相同的对象吗?对我来说是一个有点模糊的领域,因为两个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 # has no method 'subscribe'
如果我使用socketio.RedisStore,那么express/node_modules/connect/lib/middleware/session.js会报错: TypeError: Object # has no method 'get'
*注意:我更愿意让session.socket.io插件工作,但是当我使用该插件进行相同的设置时,express也会报错: TypeError: Object # has no method '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...');
express.io.RedisStore
,并将其设置为app.io.set('store', new express.io.RedisStore({
。谢谢! - ruffrey