所以我试图让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会话链接。
这是一段提取Cookie的代码(这是使用socket.io和xhr-polling
,我不知道这是否适用于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;
...
}
这还具有另一个好处,即它检查是否存在有效的会话,因此只有您登录的用户才能使用套接字。但是,您可以使用其他逻辑。
我将express与socket.io一起使用,将express-session与Express-socket.io-session一起使用,这有助于将会话连接到我的套接字实例。 Deploy函数运行诸如会话、路由等内容。 POST http://localhost:8080/socket.io/?eio=3&transport=polling&t=lz9ey8p 404(未找到)
问题内容: 如何与Socket.io 1.0和Express 4.x共享会话?我使用Redis商店,但我认为这没有关系。我知道我必须使用中间件来查看cookie和获取会话,但是不知道如何。我搜索了但找不到任何工作 问题答案: 解决方案非常简单。它只是没有很好的记录。也可以通过如下所示的小型适配器将快速会话中间件用作Socket.IO中间件: 这是Express 4.x,Socket.IO 1.x和
问题内容: 如果一个用户已经登录并尝试在新实例中再次登录,我希望它注销另一个用户实例。我不希望同一用户在我的应用程序上登录两次。 当前会话存储在Redis存储中,我正在使用express / connect处理会话存储。可以用来破坏会话的可用功能之一如下: 但是,我需要在调用.destroy()之前找到该会话ID。在Redis中,用户名存储为会话的一部分。 问题:是否可以查询Redis以基于用户名
问题内容: 我想在用户输入应用程序时创建用户评论。并在需要时阅读会话。这是我的尝试 问题答案: 我需要在这里指出您错误地将中间件添加到应用程序中。该电话不应该内完成的请求处理程序,但它的外面。只需在之后直接调用它们,或查看文档中的其他示例。 您传递给的机密应该是字符串常量,或者应该是从配置文件中获取的机密。不要喂它客户可能知道的东西,这实际上很危险。只有服务器应该知道的秘密。 如果要在会话中存储电
问题内容: 我正在使用快速框架。我想从socket.io访问会话数据。我尝试使用client.listener.server.dynamicViewHelpers数据来表达dynamicHelpers,但无法获取会话数据。有没有简单的方法可以做到这一点?请看代码 问题答案: 这不适用于通过flashsocket传输的套接字(它不会向服务器发送所需的cookie),但可以可靠地用于其他所有事务。我只
问题内容: 注意对于那些使用Redis挣扎的人,必须启动Redis服务器。 在Windows上,有一个redis发行版,请查看以下链接:https : //github.com/dmajkic/redis/downloads,然后通过启动“ redis-server.exe”来启动服务器。 我正在遵循有关node.js的教程。本教程使用Express和Redis。我安装了redis和connect