因此,我正在尝试让会话在我的socket.on中工作(‘连接’,...)我正在尝试使用最近的版本: Socket.io - 0.9.13,Express - 3.1.0和其他模块的最新版本来实现这一点。
无论如何,我尝试使用了'connect-redis‘和'session.socket.io’这两个模块,它们都有类似的问题。
在我的代码中,我有两个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对象#没有方法“subscribe”
如果我使用socketio.RedisStore,express/node_modules/connect/lib/middleware/session.js就会报错: TypeError: Object #没有'get‘方法
*注意:我宁愿让session.socket.io插件工作,但当我对该插件执行相同的设置时,express (也)抱怨: TypeError: Object #没有方法' get‘
所以我可以使用两个不同的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...');发布于 2013-03-02 09:31:16
在io.configure中,您必须将套接字与http会话链接起来。
这是一段解压cookie的代码(这是在xhr-polling中使用socket.io,我不知道这是否适用于websocket,尽管我怀疑它会起作用)。
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;
...
}这也有一个额外的好处,它检查是否存在有效的会话,因此只有登录的用户才能使用套接字。不过,您可以使用不同的逻辑。
发布于 2013-11-16 11:46:20
看着你的上一个笔记(不能使用redis在多个进程上共享它的状态),我也遇到了同样的问题,并找到了解决方案:
var express = require("express.io");
var swig = require('swig');
var redis = require('redis');
var RedisStore = require('connect-redis')(express);
workers = function() {
var app = express().http().io();
app.use(express.cookieParser());
app.use(express.session({
secret: 'very cool secretcode',
store: new RedisStore({ client: redis.createClient() })
}));
app.io.set('store', new express.io.RedisStore({
redisPub: redis.createClient(),
redisSub: redis.createClient(),
redisClient: redis.createClient()
}));
app.get('/', function(req, res) {
res.render('index');
});
app.listen(3000);
app.io.route('ready', function(req){
//setup session stuff, use session stuff, etc. Or make new routes
});
};
cluster = require('cluster');
numCPUs = require('os').cpus().length;
if (cluster.isMaster)
{
for (var i = 0; i < numCPUs; i++)
{
cluster.fork();
}
}
else
{
workers();
}https://stackoverflow.com/questions/15169418
复制相似问题