2011-03-12 17 views
19

ड्रॉप करता है मैं एक्सप्रेस और कनेक्ट मिडलवेयर का उपयोग कर पूरी तरह कार्यात्मक उपयोगकर्ता साइनअप/प्रमाणीकरण प्रणाली कर रहा हूं।Node.js सर्वर पुनरारंभ सत्र

app.use(express.session({store: require('connect').session.MemoryStore({reapInterval: 60000 * 10}) })) 

एकमात्र समस्या यह है कि जब भी आप सर्वर को पुनरारंभ करते हैं तो सत्र ड्रॉप हो जाते हैं।

https://github.com/remy/nodemon - और जब भी यह फ़ाइल परिवर्तन का पता लगाता है तो nodemon node.js को पुनरारंभ करता है।

मेरे पास लगातार सत्र कैसे हो सकते हैं?

+0

मैं सोच रहा हूं कि डेटाबेस का उपयोग करने के बजाय जेडब्ल्यूटी का उपयोग कर लगातार सत्र कैसे करें ... ?? –

उत्तर

23

आपके कोड की तरह यह बता रहा है कि आप मेमोरीस्टोर का उपयोग कर रहे हैं। यह अस्थिर है और पुनरारंभ करने पर साफ़ हो जाता है। मैं आपको अपने सत्र को जारी रखने के लिए connect_redis का उपयोग करने की सलाह दूंगा। रेडिस एक बेहद तेज़ स्टोर है।

  1. डाउनलोड redis
  2. संकलन redis: make
  3. प्रारंभ सर्वर: ./redis-server
  4. npm install connect-redis
  5.  

    var connect = require('connect') , RedisStore = require('connect-redis'); 
    
    connect.createServer(
        connect.cookieParser(), 
        // 5 minutes 
        connect.session({ store: new RedisStore }) 
    ); 
    

यह आपको जल्दी से शुरू करने के लिए है। यदि आप रेडिस से अधिकतर प्राप्त करना चाहते हैं तो आपको दस्तावेज पढ़ना चाहिए और रेडिस को कॉन्फ़िगर करना चाहिए।

+3

के अनुसार कनेक्ट हो जाता है 1.0 कुकी डिकोडर() अब कुकी पार्सर() – realgt

+0

बस उत्सुक है कि आप उचित के लिए क्यों उपयोग करते हैं RedisStore, इसके लिए एक नोडजेएस सम्मेलन/कारण है? –

+0

@ClarenceLiu क्लास नाम अक्सर ProperCase (या CamelCase या जिसे आप इसे कॉल करना चाहते हैं) के रूप में चुने जाते हैं। – Domi

1

जब नोड मर जाता है तो मैं कल्पना करता हूं कि आप जिस मेमोरी स्टोर का उपयोग कर रहे हैं, वह मर जाएगा।

डिस्क पर सत्र जारी रखें?

+3

जैसा कि रेडिस एक अतिरिक्त प्रक्रिया में सत्र को संभालता है, सत्र नोड क्रैश और नोड पुनरारंभ होता है, यदि रेडिस डाउन हो जाता है, तो सत्र 1. – ezmilhouse

5

भी, यदि आप एक्सप्रेस का उपयोग कर रहे हैं, तो आपको ऐप को रेडिस मिडलवेयर का उपयोग करने के लिए एक रहस्य प्रदान करने की आवश्यकता है।

इसलिए, अल्फ्रेड का नुस्खा ऊपर का पालन करें, लेकिन निम्न करें ...

var express = require('express'); 
var RedisStore = require('connect-redis'); 

app.use(express.cookieParser()); 
app.use(express.session({ secret: "keyboard cat", store: new RedisStore })); 
+0

अब आपको आवश्यकताएं जोड़ने की आवश्यकता है ('कनेक्ट-रेडिज़') (एक्सप्रेस) - अन्यथा आपको टाइप एरर मिलता है: अपरिभाषित की संपत्ति 'सत्र' नहीं पढ़ सकता। (Https://github.com/visionmedia/connect-redis/issues/24) –

14

मैं express.js का उपयोग कर ट्रैक पर Redis पाने के लिए कोशिश कर रहा था, गूगल मुझे यहाँ भेजा है। एक्सप्रेस कार्यान्वयन बदल गया:

var express = require('express'), 
RedisStore = require('connect-redis')(express); 

एक और महत्वपूर्ण बात एक्सप्रेस कॉन्फ़िगरेशन का क्रम है।

app.configure(function(){ 

    app.enable('strict routing'); // removes trailing slash 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jqtpl'); 
    app.register('.html', require('jqtpl').express); 
    app.use(express.favicon()); 
    app.use(express.methodOverride()); 
    app.use(express.compiler({src: __dirname + '/public', enable: ['sass']})); 
    app.use(express.static(__dirname + '/public')); 
    app.use(app.router); 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({secret: _.config.secret, store: new RedisStore})); 

}); 

cookieParser & सत्र विन्यास विन्यास के अंत में होने की जरूरत है, और cookieParser सही express.session से पहले रखा जाना चाहिए।

आशा है कि मदद करता है, मैं इन दोनों समस्याओं में भाग गया।

8

मैं रेडिस के बारे में सभी के साथ सहमत हूं, लेकिन मुझे लगता है कि विभिन्न तकनीकों सॉफ्टवेयर रखरखाव के मामले में एक समस्या है। यदि आप mongodb का उपयोग कर रहे हैं उदाहरण के लिए कनेक्ट-मोंगो (https://npmjs.org/package/connect-mongo) है, यदि आप mysql का उपयोग कर रहे हैं तो कनेक्ट-माइस्क्ल (https://npmjs.org/package/connect-mysql), कनेक्ट-कॉचडब कोचडब (https://npmjs.org/package/connect-couchdb) और इसी तरह के लिए कनेक्ट करें।

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