2012-10-05 11 views
6

पहली समस्या
मैं सत्र, स्टोर, प्राधिकरण और रेडिस को समझने की कोशिश कर रहा हूं। यदि यह महत्वपूर्ण है, तो मैं [email protected] का उपयोग कर रहा हूं। मैं समझता हूं कि मेरे पास RedisStore() डालने के लिए दो विकल्प हैं। मैं किस का उपयोग करता हूं? क्या मैं दोनों का उपयोग करता हूँ?node.js में, मैं socket.io और एक्सप्रेस के साथ redis कैसे सेटअप करूं? विशेष रूप से RedisStore()

express.session({secret: 'secret', key: 'key', store: new RedisStore()}); 
io.set('store', new RedisStore()); 

मैं पहले से ही node.js, express, और socket.io चल रहा है। तो अब मैं redis को लागू करने की कोशिश कर रहा हूं लेकिन मुझे नहीं पता कि सत्र/स्टोर का उपयोग करके प्राधिकरण को कैसे कार्यान्वित किया जाए और मुझे नहीं पता कि रेडिस डेटाबेस को कैसे लिखना है। मुझे इस पर कोई दस्तावेज नहीं मिला है। मैं एक साइट है कि सत्र और socket.io and express का उपयोग कर स्टोर लेकिन कोई redis, और एक और एक है कि सत्र और दुकानों using all three बारे में बात करती बारे में बात करती मिला, लेकिन यह io.set('store', ...) उपयोग नहीं करता।

मुझे यह भी नहीं पता कि मुझे दो अलग-अलग स्टोरों का उपयोग करना चाहिए, एक express और socket.io के लिए, या यदि मुझे केवल एक का उपयोग करना चाहिए। स्पष्टीकरण के लिए उदाहरण को देखो:

//Redis Variables 
var redis = require('socket.io/node_modules/redis'); 
var RedisStore = require('socket.io/lib/stores/redis'); 
var pub = redis.createClient(); 
var sub = redis.createClient(); 
var client = redis.createClient(); 
var redis_store = new RedisStore({ 
         redisPub: pub, 
         redisSub: sub, 
         redisClient: client 
         }); 

app.configure(function(){ 
    //...code goes here... 
    app.use(express.session({ 
        secret: 'secret', 
        key: 'key', 
        store: redis_store //Notice I'm using redis_store 
        })); 
    //...more code... 
}); 

io.configure(function(){ 
    io.set('store', redis_store); //Notice it's the same RedisStore() being used 
}); 

मैं प्रत्येक के लिए एक ही RedisStore() उपयोग करते हैं? क्या मैं प्रत्येक के लिए अलग-अलग बना देता हूं? क्या मैं बस express या socket.io का उपयोग करता हूं? जो मैं वास्तव में चाहता हूं वह ग्राहकों को प्रमाणीकृत करने में सक्षम होना है (मुझे लगता है कि सत्रों के माध्यम से किया जाता है) और जब वे कनेक्ट होते हैं तो उन्हें रेडिस डेटाबेस अपडेट करते हैं - जब लोग मेरी साइट तक पहुंचते हैं तो लॉग इन करते हैं। जो मेरी दूसरी समस्या की ओर जाता है।


दूसरी समस्या
तो मुझे पता नहीं पहुँच सकते हैं और इस बिंदु से redis डेटाबेस संपादित करने का तरीका है। मैं अपनी पहली समस्या के कारण यह परीक्षण करने के लिए नहीं कर पाए हैं लेकिन मुझे लगता है यह कुछ इस तरह होगा:

io.sockets.on('connection', function(socket){ 
    var session = socket.handshake.session; 
    redis.put(session); 
}); 

मैं भी कैसे नोड के भीतर से एक redis डेटाबेस अद्यतन करने पर किसी भी प्रलेखन नहीं देखा है। जेएस तो मैं अत्यधिक संदेह कि redis.put() सही शब्दावली हैहा। मैंने redis's website का दौरा किया है लेकिन मुझे node.js. के लिए कमांड नहीं मिल रहे हैं। कमांड लाइन से नियमित रेडिस का उपयोग करने के लिए बस आदेश। वैसे भी, अगर कोई मुझे कम से कम सही दिशा में इंगित कर सकता है तो यह बहुत अच्छा होगा। धन्यवाद। :)

+0

एक नोट: यदि आप अपने रेडिस स्टोर पर पासवर्ड का उपयोग कर समाप्त करते हैं, तो आपको अपने रेडिसस्टोर कन्स्ट्रक्टर के हिस्से के रूप में रेडिस मॉड्यूल को 'रेडिस' कुंजी के नीचे पारित करने की आवश्यकता होगी। अधिक जानकारी के लिए, देखें: http://stackoverflow.com/questions/13438613/redis-auth-error-with-node-js-and-socket-io – Konklone

उत्तर

3

एक्सप्रेस और Socket.IO, सत्र प्रबंधन के लिए Redis के साथ अपने स्वयं के एकीकरण के रूप में आप देख चुके हैं। इसे ब्लैकबॉक्स एकीकरण के रूप में डिज़ाइन किया गया है, यह विचार यह है कि सत्र स्टोर कार्यान्वयन आपके शेष कोड से स्वतंत्र है। चूंकि यह स्वतंत्र है, इसका मतलब है कि आप सीधे रेडिस तक पहुंचने के लिए एक्सप्रेस या सॉकेट.io का उपयोग नहीं कर सकते हैं। आपको node_redis जैसे नियमित रेडिस क्लाइंट को जोड़ना होगा। लाभ यह है कि आपको उन सभी रेडिज़ कॉल को स्वयं करने के बारे में चिंता करने की ज़रूरत नहीं है, इसके बजाय आप एक्सप्रेस या सॉकेट.io के सत्र स्टोर इंटरफेस के साथ बातचीत करेंगे।

तो अपने # 1 मामले में, आप RedisStore की एक एकल नया उदाहरण प्रेषित कर सकता है, नहीं दो नए लोगों को के रूप में आप से किया है। या आप अपने दूसरे लिंक का अनुसरण कर सकते हैं और socket.io एक्सप्रेस के माध्यम से सुन सकते हैं। उस स्थिति में यह एक्सप्रेस सत्र प्रबंधन के साथ एकीकृत होगा। यही कारण है कि आप उस उदाहरण में अतिरिक्त io.set ('store') कॉल नहीं देखते हैं।

यह शायद आप के लिए निरर्थक लग जाएगा, लेकिन केवल सत्र के प्रबंधन के लिए बनाया गया एक विशेष ग्राहक के रूप में RedisStore के बारे में सोच की कोशिश करो। यहां तक ​​कि सोचा था कि RedisStore शायद node_redis की तरह कुछ पर निर्भर करता है, आपको इसे एक्सेस करने का प्रयास नहीं करना चाहिए।आपको अपने रेडिस डेटाबेस को सीधे एक्सेस करने के लिए एक और लाइब्रेरी शामिल करनी होगी, मान लीजिए कि आप अन्य गैर-सत्र आइटम को रेडिस में पहली जगह स्टोर करना चाहते हैं।

+0

हां मैं डेटाबेस में अन्य चीजों को लिखने की योजना बना रहा हूं। ठीक है तो [node_redis] (https://github.com/mranney/node_redis) को देखकर मैं देख सकता हूं कि मैं पहले से ही अपने रेडिस वैरिएबल के साथ इसे एक्सेस कर रहा हूं, लेकिन बस यह स्पष्ट करने के लिए कि आपको 'npm redis' इंस्टॉल करना चाहिए' socket.io के समान स्तर पर और उसके बाद डेटाबेस में अपनी पहुंच के लिए उस उदाहरण का उपयोग करें? इसके अलावा, चूंकि मैं ऐसा करने की योजना बना रहा हूं और मैं वास्तव में एक्सप्रेस या सॉकेट से चाहता हूं। मेरे स्टोर स्टोर सत्र तक पहुंचने में सक्षम होना चाहिए, क्या मुझे इसके लिए RedisStore() का उपयोग करना चाहिए? या मुझे पहले लिंक शो की तरह करना चाहिए और मेमोरीस्टोर का उपयोग करना चाहिए? – Aust

+0

हां, आप शायद क्या करना चाहते हैं, socket.io पैकेज के अंदर रेडिस क्लाइंट का उपयोग करना बंद करें और अपनी परियोजना रूट पर अपना स्वयं का शामिल करें। मेमोरीस्टोर खराब नहीं है, लेकिन यदि आप एकाधिक वेब सर्वर रखना चाहते हैं, या नोड को फिर से चालू करने के सत्र को बनाए रखना चाहते हैं तो मैं RedisStore के साथ रहूंगा। यदि आप रेडिस सत्र रखना चाहते हैं, तो मैं socket.io प्रोजेक्ट से भी रेडिस स्टोर को खींचने के बजाय कनेक्ट-रेडिज़ में देखता हूं। –

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