2012-08-06 17 views
7

मैं express.js और socket.io सत्रों को एक साथ मर्ज करना चाहता हूं।सॉकेट.io और express.js सत्र मर्ज करें

app.configure(function() { 
    //app.use(express.logger()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.static(__dirname + '/static')); 
    app.use(express.cookieParser()); 
    app.use(express.session({store: MemStore({ 
    reapInterval: 60000 * 10 
    }), secret:'foobar', key: 'express.sid' 
})); 

मेरा मुख्य समस्या है जब उपयोगकर्ता एक से दूसरे यूआरएल, सत्र id से यात्रा करता है मेरी टर्मिनल में है: नीचे मेरी कोड (socket.io हिस्सा)

var io = require('socket.io').listen(app); 
io.set('log level', 1); 

io.sockets.on('connection', function (socket) { 
    console.log('client connected'); 
client.send(client.id);//send client id to client itself 
socket.on('connect', function(){ 
    console.log(socket.id + ' connected'); 
}); 
socket.on('disconnect', function(){ 
    console.log(socket.id + ' disconnected'); 
}); 
}); 

मेरे express.js सत्र सेटिंग है परिवर्तन भी: लेकिन मैं नहीं चाहता कि इसे बदला जाए।

info - socket.io started 
client connected 
client connected 
4Z0bYHzfWCEFzbbe4WUK disconnected 
e_uSvxhSLbLAC9-F4WUL disconnected 
client connected 
bKDy90gsrWWTRJDD4WUM disconnected 
client connected 
RJ5qqCL2wfmXbd7U4WUN disconnected 
client connected 
wjN5Sqx4rucRtWL_4WUO disconnected 

उत्तर

6

आप सॉकेट आईडी आउटपुट कर रहे हैं, एक्सप्रेस.जेएस से सत्र आईडी नहीं।

आपको authorization ईवेंट का उपयोग करना होगा, इसका पहला पैरामीटर एक ऑब्जेक्ट है जिसमें sessionID नामक प्रविष्टि है। उस मान को पृष्ठ रीलोड के बीच नहीं बदला जाना चाहिए, क्योंकि यह कुकी में संग्रहीत होता है (या रेडिस डेटाबेस या जो भी हो)।

यहां एक अच्छा लेख है जो यह बताता है कि यह कैसे काम करता है: http://www.danielbaulig.de/socket-ioexpress/, लेकिन यह थोड़ा पुराना है। बुनियादी सिद्धांत वही रहता है, लेकिन कुछ विवरण बदल गए हैं। उदाहरण के लिए जिस तरह से वह सर्वर बनाता है, अब और काम नहीं करता है, और कनेक्ट डेवलपर्स ने parseCookie() हटा दिया है। उपयोगकर्ता है कि निर्णय के साथ not happy रहे हैं, तथापि समाधान नहीं है यह आसानी से याद कोड की पंक्ति:

connect.utils.parseSignedCookies(cookie.parse(decodeURIComponent(data.headers.cookie)), secret); 

जैसा कि मैंने कहा, लेख ऊपर उल्लेख किया है कि आप सभी मूल बातें आप की जरूरत है, अगर आप देखना चाहते हैं देना चाहिए एक काम कार्यान्वयन, इस पर एक नज़र डालें: https://github.com/vortec/lolbr/blob/master/lib/lolbr.js

authorization ईवेंट हैंडलर के अंदर, आप data वस्तु संशोधित कर सकते हैं और इसे बाद में अपने मामले में, socket.handshake का उपयोग कर इसे उपयोग: socket.handshake.sessionID

उम्मीद है कि मदद करता है।

+0

कनेक्ट आपके उदाहरण में अपरिभाषित था। हल करने के लिए कोई विचार? – Yagiz

+0

@Alex यदि आप 'lolbr'' क्लोन करते हैं, तो सुनिश्चित करें कि आपके पास नीचे 'एक्सप्रेस' इंस्टॉल है। बस क्लोन करें, फिर उसमें '' cd'' टाइप करें और '' npm इंस्टॉल करें 'टाइप करें। यह काम करना चाहिए। – Fabian

+0

तो, parseSignedCookies अभी उपलब्ध नहीं हैं। कोड को दोबारा लिखने का सुझाव कैसे देते हैं? मैं socket.io में कुकीज़ से परिचित नहीं हूं, लेकिन मुझे "var कुकीज़ = cookie.parse ('foo = bar; cat = meow; dog = ruff') मिला है;" उदाहरण। मुझे इस उदाहरण में इसे कैसे लागू करना चाहिए? – Yagiz