gpt4 book ai didi

session - 如何使用 redis、express 和 socket.io 让 session 工作?

转载 作者:IT王子 更新时间:2023-10-29 05:55:47 26 4
gpt4 key购买 nike

所以我试图让 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 需要共享 session 数据,我想知道此设置是否会正确使用 session ? session 存储是否需要与 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 会提示:这个.store.subscribe(...TypeError 对象 # 没有方法 'subscribe'

如果我使用 socketio.RedisStore 然后 express/node_modules/connect/lib/middleware/session.js 提示:TypeError: 对象 # 没有方法 'get'

*注意我宁愿让 session.socket.io 插件工作,但是当我用那个插件做同样的设置时,express(也)提示:TypeError: 对象 # 没有方法 'get'

那么我可以为 session 使用 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 session 链接。

这是一段提取 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);
}
});

然后您可以使用以下方式访问 session :

socket.on("selector", function(data, reply) {
var session = this.handshake.session;
...
}

这还有一个额外的好处,它会检查是否存在有效 session ,因此只有您的登录用户才能使用套接字。不过,您可以使用不同的逻辑。

关于session - 如何使用 redis、express 和 socket.io 让 session 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15169418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com