编辑:在尝试了一些不起作用的模块之后,我实际上已经编写了自己的库来执行此操作。无耻的插件:去https://github.com/aviddiviner/Socket.IO-sessions看看吧。出于历史目的,我将在下面留下我的旧帖子:
根据上面pr0zac的解决方案,我非常巧妙地完成了这项工作,而无需绕过flashsocket传输。我也在 Socket.IO 中使用 express。就是这样。
首先,将会话 ID 传递给视图:
app.get('/', function(req,res){
res.render('index.ejs', {
locals: {
connect_sid: req.sessionID
// ...
}
});
});
然后在您看来,将其与 Socket.IO 客户端链接:
<script>
var sid = '<%= connect_sid %>';
var socket = new io.Socket();
socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>
然后在您的服务器端 Socket.IO 侦听器中,将其拾取并读取/写入会话数据:
var socket = io.listen(app);
socket.on('connection', function(client){
client.on('message', function(message){
session_store.get(message.sid, function(error, session){
session.pings = session.pings + 1 || 1;
client.send("You have made " + session.pings + " pings.");
session_store.set(message.sid, session); // Save the session
});
});
});
就我而言,我session_store
是 Redis,使用该redis-connect
库。
var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));
希望这可以帮助在搜索谷歌时找到这篇文章的人(就像我一样;)