2011-06-18 14 views
19

मुझे पता है कि मैंreq के बाहर एक्सप्रेस में सत्र का उपयोग कैसे करें?

function(req, res) { 
    req.session 
} 

एक्सप्रेस का उपयोग कर उपयोग कर सकते हैं। हालांकि मुझे प्रतिक्रिया फ़ंक्शन के बाहर सत्र तक पहुंचने की आवश्यकता है। मुझसे यह कैसे होगा?

मैं पोस्ट और टिप्पणियां जोड़ने के लिए जानकारी पास करने के लिए socket.io का उपयोग कर रहा हूं। तो जब मुझे सर्वर-साइड पर socket.io संदेश प्राप्त होता है, तो मुझे सत्र का उपयोग करके जानकारी पोस्ट करने वाले व्यक्ति को सत्यापित करने की आवश्यकता होती है। हालांकि चूंकि यह सॉकेट के माध्यम से किया जा रहा है। कोई req/res नहीं है।

+0

मैं जो कर रहा हूं वह सिर्फ प्रत्येक उपयोगकर्ता को लॉगिन पर और इसे काफी बार बदल रहा था, फिर सॉकेट संदेशों में इसका उपयोग करके यह सत्यापित करने के लिए कि वे वास्तव में थे जिन्होंने कहा था कि वे थे। – MrBojangles

उत्तर

7

सॉकेट.io का उपयोग करके, मैंने इसे सरल तरीके से किया है। मुझे लगता है आप अपने आवेदन के लिए एक वस्तु है के MrBojangle मान लीजिए, मेरा के लिए यह Shished कहा जाता है:

/** 
* Shished singleton. 
* 
* @api public 
*/ 
function Shished() { 
}; 


Shished.prototype.getHandshakeValue = function(socket, key, handshake) {       
    if(!handshake) { 
     handshake = socket.manager.handshaken[ socket.id ];           
    } 
    return handshake.shished[ key ];                 
};                         

Shished.prototype.setHandshakeValue = function(socket, key, value, handshake) {     
    if(!handshake) { 
     handshake = socket.manager.handshaken[ socket.id ];           
    } 
    if(!handshake.shished) { 
     handshake.shished = {};                  
    } 
    handshake.shished[ key ] = value;                
}; 
आपके प्राधिकरण की पद्धति पर

फिर, मैं सत्र के भंडारण के लिए MongoDB उपयोग कर रहा हूँ:

io.set('authorization', function(handshake, callback) { 
    self.setHandshakeValue(null, 'userId', null, handshake); 
    if (handshake.headers.cookie) { 
     var cookie = connect.utils.parseCookie(handshake.headers.cookie); 
     self.mongoStore() 
     .getStore() 
     .get(cookie['connect.sid'], function(err, session) { 
      if(!err && session && session.auth && session.auth.loggedIn) { 
       self.setHandshakeValue(null, 
          'userId', 
          session.auth.userId, 
          handshake); 
      } 
     }); 
    } 

फिर से पहले मॉडल में एक रिकॉर्ड की बचत, आप कर सकते हैं:

model._author = shished.getHandshakeValue(socket, 'userId');

+0

यह वास्तव में लगभग वही है जो हम कर रहे हैं! – MrBojangles

+0

मुझे खुशी है कि यह मदद मिली। – vimdude

+0

parseCookie अब और काम नहीं करेगा – UpTheCreek

0

अपने socket.io कोड मान लिया जाये कि इस तरह थोड़े दिखता है:

io.on('connection', 
function(client) { 
    console.log(client.request) 
}); 

अनुरोध client.request है के रूप में ऊपर के उदाहरण में दिखाया गया है।

संपादित करें: एक अलग बात के रूप में, हो सकता है इस में मदद मिलेगी: https://github.com/aviddiviner/Socket.IO-sessions

+0

जब मैं आपकी प्रतिक्रिया पढ़ता हूं, लेकिन "क्लाइंट" की सामग्री को प्रिंट करने के बाद मैं वास्तव में उत्साहित था।अनुरोध "चर मैंने पाया कि किसी कारण से वे सत्र सब कुछ अन्य तो के बारे में अभी से गुजर रहे हैं। सुनिश्चित नहीं हैं कि क्यों सत्र जानकारी शामिल नहीं है, यह जहां यह होना चाहिए की तरह लगता है। किसी भी अन्य विचार? – MrBojangles

+1

@ user776796 आपको चाहिए कुकी 'client.request.headers.cookie' तक पहुंचने में सक्षम हो, और अपने सत्र स्टोर की जांच के लिए इसका उपयोग करें। – Harry

+0

दुर्भाग्य से नहीं। "हेडर्स.cookie" मेरी कुकीज़ सूचीबद्ध है, हालांकि मेरी सत्र जानकारी इसमें शामिल नहीं है – MrBojangles

0

मैं socket.handshake जाँच आप सत्र मिलना चाहिए विश्वास करते हैं:

io.sockets.on('connection', function(socket) { 
    console.log(socket.handshake.sessionID); 
}); 

ग्राहक अपने सॉकेट के साथ एक सॉकेट कनेक्शन स्थापित करता है जब .io सर्वर, क्लाइंट वेबस्केट हैंडशेक अनुरोध भेजता है। मैं ऊपर क्या कर रहा हूं हैंडशेक से सत्र आईडी पकड़ रहा है।

6

मुझे लगता है कि मैं एक अलग जवाब दिया है।

कोड:

var MongoStore = require('connect-mongo')(session); 
var mongoStore = new MongoStore({ 
    db:settings.db,   //these options values may different 
    port:settings.port, 
    host:settings.host 
}) 
app.use(session({ 
    store : mongoStore 
    //here may be more options,but store must be mongoStore above defined 
})); 

तो आप अनुरोध पर एक सत्र कुंजी परिभाषित करना चाहिए, जैसे:

कोड:

req.session.userEmail; 

अंत में, आप इसे इस तरह प्राप्त कर सकते हैं:

कोड:

var cookie = require("cookie"); //it may be defined at the top of the file 
io.on("connection",function(connection){ 

var tS = cookie.parse(connection.handshake.headers.cookie)['connect.sid']; 
var sessionID = tS.split(".")[0].split(":")[1]; 
mongoStore.get(sessionID,function(err,session){ 
     console.log(session.userEmail); 
}); 
} 

मैंने कल इसका परीक्षण किया था, यह अच्छी तरह से काम करता था।

+0

ग्रेट समाधान – jordajm

+0

पवित्र बकवास, यह काम करता है! 3 साल बाद और यह अभी भी एक ठोस जवाब है। किक ऐस। –

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