編集:機能しなかったいくつかのモジュールを試した後、私は実際に行って、これを行うために独自のライブラリを作成しました。恥知らずなプラグイン: https://github.com/aviddiviner/Socket.IO-sessionsでチェックしてください。歴史的な目的のために、古い投稿を以下に残しておきます。
上記のpr0zacのソリューションのように、フラッシュソケットトランスポートをバイパスすることなく、この作業を非常にうまく行うことができました。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 }));
これがGoogleの検索中にこの投稿を見つけた人に役立つことを願っています(私がしたように;)