แก้ไข:หลังจากลองใช้โมดูลบางตัวที่ใช้งานไม่ได้ฉันได้ไปและเขียนไลบรารีของตัวเองเพื่อทำสิ่งนี้ เสียบด้านหน้า: ไปตรวจสอบออกที่https://github.com/aviddiviner/Socket.IO-sessions ฉันจะทิ้งโพสต์เก่าไว้ด้านล่างเพื่อวัตถุประสงค์ทางประวัติศาสตร์:
ผมได้งานนี้ค่อนข้างเรียบร้อยโดยไม่ต้องบายพาสflashsocketขนส่งตามpr0zac 's วิธีการแก้ปัญหาดังกล่าวข้างต้น ฉันยังใช้ Express กับ Socket.IO นี่คือวิธีการ
ขั้นแรกส่งรหัสเซสชันไปยังมุมมอง:
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);
});
});
});
ในกรณีของฉันฉันsession_store
คือ Redis โดยใช้redis-connect
ห้องสมุด
var RedisStore = require('connect-redis');
var session_store = new RedisStore;
app.use(express.session({ store: session_store }));
หวังว่านี่จะช่วยคนที่พบโพสต์นี้ขณะค้นหา Google (เหมือนที่เคยทำ;)