2012-07-18 17 views
15

के लिए (एक्सप्रेस) सत्र आईडी कैसे प्राप्त कर सकता हूं, मैं उसी पोर्ट पर वेबस्केट npm install ws का उपयोग कर रहा हूं जैसे एक्सप्रेस चल रहा है।मैं वेबस्केट कनेक्शन

मैं HTTP कनेक्शन से संबंधित 'sessionID' को चुनना चाहता हूं जिसे अभी बनाया गया है और वेबसॉकेट में अपग्रेड किया गया है।

// start express listening 
server.listen(conf.server.port, conf.server.host); 

var WebSocketServer = require('ws').Server 
    , wss = new WebSocketServer({server: server}); 

wss.on('connection', function(ws) { 
    var sessionID = // how do I get this? 
    ws.on('message', function(message) { 
     console.log('received: %s', message); 
    }); 
    ws.send('something'); 
}); 

यह कैसे किया जा सकता है?

(मैं वर्तमान में पेज में sessionID भेजकर समस्या को हल करने के लिए, लेकिन यह बदसूरत है।)

उत्तर

14
  1. पार्स कुकी
  2. सत्र id सत्र डेटा
  3. जाओ

    var express = require('express'); 
    var parseCookie = express.cookieParser(); 
    var MemoryStore = express.session.MemoryStore; 
    
    var store = new MemoryStore(); 
    
    app.configure(function() { 
        app.use(express.session({ store: store, secret: '123456', key: 'sid' })); 
    }); 
    
    wss.on('connection', function(ws) { 
        parseCookie(ws.upgradeReq, null, function(err) { 
         var sessionID = ws.upgradeReq.cookies['sid']; 
         store.get(sessionID, function(err, session) { 
          // session 
         }); 
        }); 
    
        ws.on('message', function(message) { 
         console.log('received: %s', message); 
        }); 
        ws.send('something'); 
    }); 
    
    जाओ
+1

यह सही ट्रैक पर है, लेकिन कोई 'सिड' कुकी नहीं है। वहाँ हैं: 'connect.sid: n8Pbh5hPhNNC3B6PAkyuaRgv.o9wnmI3fiJ47kJMUfW0xVcMRkhjFkMbgvki/CTtemvU' और 'sessionid: 12d2b0c6f3c3eb661215a401d1942122'। इनमें से कौन सा सत्र की कुंजी है, और दूसरा क्या है? – fadedbee

+0

'connect.sid' एक्सप्रेस कुकी के लिए डिफ़ॉल्ट कुंजी है। उपरोक्त कोड एक्सप्रेस में सत्र कुंजी के साथ कॉन्फ़िगर किया गया था 'sid' ... यदि आप इसे कस्टमाइज़ नहीं करते हैं, तो कुंजी 'connect.sid' है। – nguyenkha

+0

आह, मेरी गलती केवल आपके कोड के आधे चिपकाने के लिए है। – fadedbee

5

यह एक दुःस्वप्न था, आखिर में यह हस्ताक्षरित कुकीज़ का उपयोग कर अपने लिए काम कर रहा था!

अपनी दुकान (उदाहरण के स्मृति की दुकान) सेट करें:

var MemoryStore = express.session.MemoryStore; 
store = new MemoryStore(); 

parseCookie वैश्विक रूप में बेनकाब (यदि आप इसे अन्य मॉड्यूल में की जरूरत है) इस तरह एप्लिकेशन/सर्वर js फ़ाइलों में:

app.use(parseCookie = express.cookieParser('secret')); 

अब सॉकेट सेट करें:

//this method gets called later 
var ensureAuthenticatedSocket = function(handshake, callback) { 
    cookie = cookieParser(handshake, null, function(err) { 
     var sessionID = handshake.signedCookies['sid']; 
     store.get(sessionID, function(err, session) { 
      callback(err, session); 
     }); 
    }); 
}; 
//listen time 
io = io.listen(server); 
//configure authentication 
io.configure(function() { 
    io.set('authorization', function(handshake, callback) { 
     //call the method with handshake as parameter, wait for callback 
     ensureAuthenticatedSocket(handshake, function(err, session) { 
      if (!err && session) { 
       //no error + found session = wicked! 
       callback(null, true); 
      } else { 
       callback(null, false); 
      } 
     }); 
    }); 
}); 
... 
//more socket code 
+5

नोड के बारे में सबकुछ वर्तमान में एक दुःस्वप्न है। सभी जानकारी में इतनी आवश्यक सामग्री की कमी है .. हर जगह स्पष्टीकरण की कमी, चीजों को मंजूरी के लिए लिया जाता है। – vsync

+0

@vsync एल 2 वेब ऐप सर। –

+0

मुझे लगता है कि यह अभी भी php से बेहतर है और चूंकि मैं बहुत सारी परियोजनाएं करता हूं और सामान्य भाषा का बैकएंड मेरे लिए बहुत बेहतर है। – mattdlockyer

संबंधित मुद्दे