2012-04-24 10 views
5

मेरे पास एक रेल 3.2 एप्लिकेशन है जो रेडिस का सत्र स्टोर के रूप में उपयोग करता है। अब मैं Node.js में नई कार्यक्षमता का एक हिस्सा लिखने वाला हूं, और मैं दो ऐप्स के बीच सत्र जानकारी साझा करने में सक्षम होना चाहता हूं।क्या रेल और नोड.जेएस आवेदन के बीच रेडिस में संग्रहीत सत्र डेटा साझा करने का कोई आसान तरीका है?

क्या मैं मैन्युअल रूप से कर सकते हैं _session_id कुकी पढ़ने के लिए है, और फिर rack:session:session_id नाम के एक Redis कुंजी से पढ़ते हैं, लेकिन इस तरह के एक हैक-ish समाधान की तरह दिखता है।

क्या नोड.जेएस और रेल के बीच सत्र साझा करने का कोई बेहतर तरीका है?

+0

रेल/रूबी कभी-कभी वस्तुओं को क्रमबद्ध करने के लिए मार्शलिंग का उपयोग करता है। यदि ऐसा है, तो आप उन्हें आसानी से नोड में पुनर्प्राप्त नहीं कर पाएंगे ... – sailor

+0

@ सेलर अगर ऐसा होता है, तो मैं सिर्फ JSON को सहेज सकता हूं :) –

उत्तर

1

यदि आप इसका उपयोग करने की योजना नहीं बना रहे हैं तो यह पूरी तरह से अनुपयोगी हो सकता है, लेकिन नोड के साथ मेरे सभी सत्र अनुभव कनेक्ट का उपयोग कर है। आप कनेक्ट सत्र middlewhere का उपयोग करें और कुंजी आईडी को बदल सकता है:

http://www.senchalabs.org/connect/session.html#session

और अपने सत्र की दुकान के रूप redis उपयोग करने के लिए इस मॉड्यूल का उपयोग:

https://github.com/visionmedia/connect-redis

मैं की तरह कभी नहीं सेटअप कुछ है यद्यपि आपका वर्णन क्या है, कुछ आवश्यक हैकिंग हो सकती है।

2

मैंने यह किया है, लेकिन यह बातें

की अपनी कांटे बनाने की आवश्यकता होती है सबसे पहले आप सत्र कुंजी एक ही नाम बनाने की जरूरत है। यह सबसे आसान काम है।

अगला मैंने रेडिस-स्टोर मणि का एक कांटा बनाया और जहां मार्शलिंग संशोधित हुई। मुझे दोनों तरफ जेसन से बात करने की ज़रूरत है क्योंकि जावास्क्रिप्ट के लिए रूबी स्टाइल मार्शल मॉड्यूल ढूंढना आसान नहीं है। The file where I alter marshalling

मुझे कनेक्ट के सत्र मिडलवेयर हिस्से को प्रतिस्थापित करने की भी आवश्यकता है। बनाया गया हैश बहुत विशिष्ट है और एक रेल बनाता है जो मेल नहीं खाता है। मुझे इसे काम करने के लिए आपको छोड़ना होगा क्योंकि एक अच्छा तरीका हो सकता है। मैं कनेक्ट फोर्क हो सकता था, लेकिन इसके बजाय मैंने कनेक्ट> मिडलवेयर> सत्र आउट की एक प्रति निकाली और मुझे अपना खुद का उपयोग करना पड़ा।

आप देखेंगे कि मूल चर में मूल जोड़ता है जो रेल संस्करण में मौजूद नहीं है। इसके अलावा आपको उस मामले को संभालने की आवश्यकता है जब रेल ने नोड के बजाय सत्र बनाया है, यही जेनरेटर कुकी काम करता है।

/***** ORIGINAL *****/ 
// session hashing function 
store.hash = function(req, base) { 
    return crypto 
    .createHmac('sha256', secret) 
    .update(base + fingerprint(req)) 
    .digest('base64') 
    .replace(/=*$/, ''); 
}; 

// generates the new session 
store.generate = function(req){ 
    var base = utils.uid(24); 
    var sessionID = base + '.' + store.hash(req, base); 
    req.sessionID = sessionID; 
    req.session = new Session(req); 
    req.session.cookie = new Cookie(cookie); 
}; 

/***** MODIFIED *****/ 
// session hashing function 
store.hash = function(req, base) { 
    return crypto 
    .createHmac('sha1', secret) 
    .update(base) 
    .digest('base64') 
    .replace(/=*$/, ''); 
}; 

// generates the new session 
store.generate = function(req){ 
    var base = utils.uid(24); 
    var sessionID = store.hash(req, base); 
    req.sessionID = sessionID; 
    req.session = new Session(req); 
    req.session.cookie = new Cookie(cookie); 
}; 

// generate a new cookie for a pre-existing session from rails without session.cookie 
// it must not be a Cookie object (it breaks the merging of cookies) 
store.generateCookie = function(sess){ 
    newBlankCookie = new Cookie(cookie); 
    sess.cookie = newBlankCookie.toJSON(); 
}; 

//... at the end of the session.js file 
    // populate req.session 
    } else { 
    if ('undefined' == typeof sess.cookie) store.generateCookie(sess); 
    store.createSession(req, sess); 
    next(); 
    } 

मुझे आशा है कि यह आपके लिए काम करता है। यह मुझे बात करने के लिए चारों ओर खोदने के लिए काफी कुछ ले गया।

मुझे जेसन में संग्रहीत फ़्लैश संदेशों के साथ-साथ एक समस्या भी मिली। उम्मीद है कि आपको वह नहीं मिला है। फ्लैश संदेशों में एक विशेष ऑब्जेक्ट संरचना होती है जो सीरियलाइजिंग करते समय जेसन उड़ जाती है। जब सत्र से फ़्लैश संदेश बहाल किया जाता है तो आपके पास उचित फ़्लैश ऑब्जेक्ट नहीं हो सकता है। मुझे इसके लिए पैच करने की भी आवश्यकता थी।

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