所以我试图让 Sessions 在我的 socket.on('connection', ...) 中工作的其他模块。
无论如何,我已经尝试使用两个模块“ 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 # has no method 'subscribe'
如果我使用 socketio.RedisStore 然后 express/node_modules/connect/lib/middleware/session.js 抱怨: TypeError: Object # has no method 'get'
*注意我宁愿让 session.socket.io 插件工作,但是当我用那个插件做同样的设置时,表达(也)抱怨: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...');