2011-05-04 17 views
10

मुझे सत्रों में समस्या है, जहां कभी-कभी सत्र परिवर्तक I बस सेट अगले पृष्ठ अनुरोध पर अनिर्धारित है। चर को सही ढंग से सेट करने के लिए मुझे आमतौर पर प्रवाह प्रवाह से गुज़रना पड़ता है।नोड.जेएस और एक्सप्रेस सत्र समस्या

मैं पुष्टि कर सकता हूं कि मैं सत्र चर को अपरिभाषित करने की कोशिश नहीं कर रहा हूं; उनके पास एक कानूनी मूल्य है।

मेरे ऐप में, उपयोगकर्ता/ट्विटर/कनेक्ट/टू/ट्विटर/कॉलबैक/से स्थानांतरित होते हैं। पूर्व ट्विटर से कुछ oauth डेटा retreives, बाद में उपयोगकर्ता ट्विटर में लॉग इन करता है। ,/

app.get('/twitter/connect/?', function(req, res){ 
    consumer().getOAuthRequestToken(function(error, oauthToken, oauthTokenSecret, results){ 
     if (error){ 
      // error handling here 
     } else { 
      req.session.oauthRequestToken = oauthToken; 
      req.session.oauthRequestTokenSecret = oauthTokenSecret; 

      // if I console.log the two session variables above 
      // they have the proper values. 

      res.redirect("https://twitter.com/oauth/authorize?oauth_token="+req.session.oauthRequestToken);  
     } 
    }); 
}); 

उसके बाद चहचहाना/ट्विटर/कॉलबैक करने के लिए वापस उन्हें भेजता है::,

app.get('/twitter/callback/?', function(req, res){ 
    console.log(req.session.oauthRequestToken); 
    console.log(req.session.oauthRequestTokenSecret); 

    // more often than not, the two variables above are 
    // undefined. but not always. usually on the first 
    // pass, never on the second. 
}); 

मुझे पता नहीं क्या हो रहा है मैं कर सकते हैं

/ट्विटर/कनेक्ट/सरल है पुष्टि करें कि सत्र चर ठीक से सेट किए जा रहे हैं, वे केवल पृष्ठ अनुरोधों के बीच अपना मान नहीं रख रहे हैं, लेकिन केवल पहली बार।

app.configure('development', function(){ 
    app.use(express.cookieParser()); 
    app.use(express.session({ secret:'yodawgyo' })); 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
    app.use(express.logger()); 
    app.use(express.static(__dirname + '/public')); 
    app.set('view engine', 'ejs'); 
    app.set('view options', { 
     open: '{{', 
     close: '}}' 
    }); 
}); 

मैं अभी के लिए एक देव वातावरण है:

यह कैसे मैं अपने सर्वर बना रहा हूं है। मेरे पास नोड 0.5.0-पूर्व स्थापित है, लेकिन इस मुद्दे को 0.4.1 पर भी देखा गया। मैं एक्सप्रेस 2.3.2 का उपयोग कर रहा हूँ।

किसी भी मदद की बहुत सराहना की जाती है।

+2

मुझे एपीआई को कॉल करने में एक ही समस्या है। मुझे यकीन है कि रीडायरेक्ट पर सत्र जानकारी खो रही है। यही है, अगर मैं अपने ब्राउज़र में पेज रीफ्रेश करता हूं, तो मैं देख सकता हूं कि सत्र में जो सामान मैंने रखा है वह अभी भी वहां है। हालांकि, अगर मैं कुछ बाहरी साइट (जैसे oauth प्रदाता) से रीडायरेक्ट के माध्यम से * एक ही पृष्ठ * पर जाता हूं, तो सत्र पूरी तरह खाली होता है। सुनिश्चित नहीं है कि समस्या क्या है। –

+0

अद्यतन: ऐसा लगता है कि आपको पुनर्निर्देशित अनुरोध के लिए एक अलग सत्र आईडी प्राप्त होती है। –

उत्तर

17

कनेक्ट के सत्र में, कोई भी हैंडलर req.session.anything किसी भी मान पर सेट कर सकता है, और कनेक्ट आपके स्टोरर को end() पर कॉल करने पर मान संग्रहीत करेगा। एक ही समय में उड़ान में कई अनुरोध होने पर यह खतरनाक है; जब वे खत्म हो जाते हैं, तो एक सत्र मूल्य दूसरे को पकड़ लेगा। यह इतना आसान session API (या सीधे session source देखें) का परिणाम है, जिसका परमाणु रूप से सत्र-गुणों को प्राप्त करने और सेट करने का कोई समर्थन नहीं है।

वर्कअराउंड सत्र मिडलवेयर को आवश्यक अनुरोधों में से कुछ के रूप में देने का प्रयास करना है। यहां कुछ सुझाव दिए गए हैं:

  1. सत्र 0 मिडलवेयर के ऊपर अपना express.static हैंडलर रखें।
  2. यदि आप कुछ हैंडलर को स्थानांतरित नहीं कर सकते हैं जिन्हें सत्र की आवश्यकता नहीं है, तो आप express.session.ignore.push('/individual/path') कहकर req.session का उपयोग न करने वाले किसी भी पथ को अनदेखा करने के लिए सत्र मिडलवेयर को कॉन्फ़िगर भी कर सकते हैं।
  3. यदि कोई हैंडलर सत्र में नहीं लिखता है (शायद यह केवल सत्र से पढ़ता है), को res.end(); पर कॉल करने से पहले सेट करें। फिर यह फिर से सहेजा नहीं जाएगा।

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

+1

विस्तृत उत्तर के लिए धन्यवाद। दुर्भाग्य से यह मेरी समस्या का समाधान नहीं किया। मैंने सत्र मध्यवर्ती के ऊपर स्थैतिक हैंडलर को स्थानांतरित कर दिया, लेकिन मैं बस इतना कर सकता था। सभी मार्ग (उनमें से केवल 4) या तो सीधे सत्र का उपयोग करते हैं, या सत्र का उपयोग करने वाले मिडलवेयर से गुजरते हैं। कोई अन्य विचार? – ehynds

+0

महान स्पष्टीकरण के लिए धन्यवाद। मैंने इसे ट्रैक करने के लिए कनेक्ट करने पर एक समस्या खोली है: https://github.com/senchalabs/connect/issues/854 – Matt

+0

omg। आपका 1. समाधान इसे ठीक कर दिया। किसी कारण से मेरा सत्र पोस्ट पर पृष्ठों के बीच मृत्यु हो गई। मुझे नहीं पता था क्यों। लेकिन यह अभी किया। एक बार जब मैं सत्र midware के ऊपर स्थैतिक स्थानांतरित हो गया यह काम करता है! –

4

मैंने issue against Express about github दायर किया, लेकिन यह पता लगाया कि कुछ मिनट बाद क्या गलत था।सुनिश्चित नहीं है कि आपको एक ही समस्या है, लेकिन पूर्णता के लिए:

मेरे मामले में, मैं http://localhost:8003 पर जाकर परीक्षण कर रहा था लेकिन ओएथ प्रदाता http://hostname:8003 पर रीडायरेक्ट कर रहा था। वही बॉक्स/सर्वर/वेबपृष्ठ, लेकिन विभिन्न डोमेन नामों का अर्थ है कि ब्राउजर अलग-अलग कुकीज़ भेजता है और इसके परिणामस्वरूप, एक्सप्रेस को अलग-अलग सत्र आईडी और सत्र डेटा मिलते हैं। जैसे ही मैंने http://hostname:8003 पर परीक्षण करना शुरू किया, सबकुछ ठीक काम करता था।

0

मेरा कोड आपके समान था, संरचनात्मक रूप से। मेरे मामले में, हालांकि, मेरा पोस्ट ऑपरेशन JQuery $। पोस्ट फ़ंक्शन से निकला। मुझे लगता है कि अगर एक सराहनीय फर्क नहीं पड़ता पता नहीं है, तथापि

मुझे क्या करना होने समाप्त हो गया था मेरी एक्सप्रेस मार्ग दिनचर्या में पोस्ट आपरेशन परिभाषा के अंत में एक "जंक" प्रतिक्रिया भेजने के लिए, यानी

res.send("hoo hee ha ha unimportant junk data");

अंत में इसे शामिल करके मैं एक सफल कार्य (AJAX पोस्ट प्रयास के लिए कॉलबैक) को ट्रिगर करने में सक्षम था। मैंने इसे एक्सप्रेस मार्गों में रखने के बजाय वहां पुनर्निर्देशित किया।

साथ उपयोग AJAX पोस्ट window.redirect();

AJAX पोस्ट के साथ उपयोग न करें: $res.redirect("someurl");

इसका कारण यह है ब्राउज़रों जाहिरा तौर पर के रूप में यहाँ वर्णित AJAX प्रतिक्रिया पर रीडायरेक्ट नहीं होगा, ताकि आप जावास्क्रिप्ट का उपयोग करने के लिए है, यह है: Express js - can't redirect

उम्मीद है कि किसी की मदद करता है, यह मेरे लिए समस्या, शांति तय करता है।

+0

मुझे थोड़ा ओ 'पुराना _ हू हे हा हा_ पसंद है। ऐसा कुछ भी नहीं है। –

5

बस एक ही समस्या के साथ संघर्ष किया और इसे हल किया। सरल उत्तर

Session.save() 

स्पष्ट रूप से कॉल करने के लिए, यदि आप एक्सप्रेस-सत्र पर जवाब नहीं दे सकते प्रतिक्रिया के अंत में आप के लिए कॉल करने के लिए है।

Reference

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