2012-07-13 10 views
9

का उपयोग करके रीडायरेक्ट के साथ सेटिंग नहीं कर रहे हैं, मैं नोड.जेएस, एक्सप्रेस और मोबाइल डेवलपमेंट के लिए अपेक्षाकृत नया हूं, और मुझे लगता है कि मुझे लगता है कि एक्सप्रेस के साथ हेडर भेजने के साथ मुझे क्या करना है।शीर्षलेख node.js/Express

उपयोगकर्ता होम पेज '/' से शुरू होता है, लॉग इन नहीं होता है, फिर साइन-इन पेज पर जाने के लिए बटन क्लिक करता है। जब वे '/ validate_signin' करने के लिए अपने उपयोगकर्ता नाम और पासवर्ड सबमिट करते हैं, वे वापस घर पृष्ठ के रूप में अलग ढंग से दिखाया जा रहा है क्योंकि वे में लॉग इन किया के साथ इस समय पुनः निर्देशित किया जाना चाहिए,

पुनर्निर्देशन इस तरह काम किया:।

res.redirect('/'); 

यह मेरे लैपटॉप पर ठीक काम करता है, लेकिन मेरे मोबाइल फोन पर यह कैशिंग के कारण संभवतः अपने पुराने राज्य में '/' पर रीडायरेक्ट करता है। अगर मैं फोन पर पेज रीफ्रेश करता हूं, तो '/' जैसा दिखाना चाहिए उतना दिखाएगा। How to control web page caching, across all browsers?

निम्नलिखित दो तरीकों (अलग से) में हेडर स्थापित करने के लिए करने की कोशिश की, लेकिन वे भेज प्रतीत नहीं:

res.header("Cache-Control", "no-cache, no-store, must-revalidate"); 
res.header("Pragma", "no-cache"); 
res.header("Expires", 0); 

res.writeHead(302, { 
    "location": "/", 
    "Cache-Control" : "no-cache, no-store, must-revalidate", 
    "Pragma": "no-cache", 
    "Expires": 0 
}); 

यहाँ हेडर हैं

मैं इस पोस्ट पाया कि मैं वर्तमान में प्राप्त कर रहा हूं:

HTTP/1.1 304 Not Modified 
X-Powered-By: Express 
Date: Fri, 13 Jul 2012 17:35:18 GMT 
Cache-Control: public, max-age=0 
Last-Modified: Fri, 13 Jul 2012 12:32:12 GMT 
Etag: "3223-1342182732000" 
Accept-Ranges: bytes 
Connection: keep-alive 

कोई विचार?

बहुत धन्यवाद।

+1

उन शीर्षकों को उस पृष्ठ पर लिखा जाना होगा जिसे आप कैश नहीं करना चाहते हैं ('/'), न कि पृष्ठ जहां आप रीडायरेक्ट कर रहे हैं, है ना? –

+0

सही। हाँ, शायद उन्हें गलत जगह पर स्थापित कर रहा हूँ। इसे देखने के लिए जा रहे हैं। –

+0

आपकी समस्या में ब्राउज़र कैशिंग शामिल नहीं है। किसी भी कारण से, एक्सप्रेस वास्तविक रीडायरेक्ट के बजाय 304 भेज रहा है, और ब्राउज़र उचित प्रतिक्रिया दे रहा है (यानी पुराने संस्करण को रखते हुए)। ऐसा लगता है कि एक्सप्रेस द्वारा कुछ प्रकार की आंतरिक कैशिंग की जा रही है; प्रश्न में पेज की सेवा करने के लिए क्या आप एक्सप्रेस.स्टैटिक का उपयोग कर किसी भी मौके से हैं? – ebohlman

उत्तर

10

मैं टिप्पणी करता हूं लेकिन मैं अभी शामिल हो गया हूं और इसमें कोई प्रतिष्ठा नहीं है।

यदि मैं इसे सही ढंग से समझता हूं, तो आप एक्सप्रेस.स्टैटिक का उपयोग कर पृष्ठ की सेवा कर रहे हैं (इसलिए यह केवल एक सादा HTML पृष्ठ है) लेकिन यदि उपयोगकर्ता साइन-इन है, तो आप एक्सप्रेस के राउटर का उपयोग करते हैं, क्या मैं सही हूं?

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

यदि ऐसा है, तो आपकी समस्या ब्राउज़र-कैशिंग नहीं है, यह connect मध्यवर्ती प्रकृति की वजह से होती है।

मिडलवायर एक श्रृंखला में निष्पादित करते हैं, जो उन्हें पूरा होने पर कॉल करते हैं, जिसका अर्थ है, अगर मैं सही ढंग से मानता हूं, तो एक्सप्रेस.स्टैटिक को आपके राउटर से पहले बुलाया जाता है और यह केवल स्थिर HTML पृष्ठ की सेवा करता है।

तो आपका मार्ग कभी निष्पादित नहीं होता है क्योंकि express.static next() पर कॉल नहीं करेगा (एक स्पष्ट कारण के लिए, फ़ाइल मौजूद है)।

आशा है कि मैंने सही मान लिया है।


संपादित करें:

ऐसा लगता है कि मैं गलत ग्रहण किया। आपने कहा था कि यह आपके लैपटॉप पर ठीक काम करता है, इसलिए यह निश्चित रूप से क्लाइंट-साइड कैशिंग समस्या जैसा दिखता है।

मुझे अभी भी यकीन नहीं है कि आप एक्सप्रेस.स्टैटिक() का उपयोग करके एक अलग होमपेज कैसे प्रदर्शित करते हैं या आप ऊपर बताए गए कोड को कहां रखते हैं, मैं इसे आपके कोड को देखे बिना एक शॉट देने जा रहा हूं लेकिन यह हो सकता है आपकी मदद करने के लिए मेरे और दूसरों के लिए जरूरी है।

उन प्रतिक्रिया शीर्षलेखों को पहली प्रतिक्रिया में सेट किया जाना चाहिए (जब आप मुखपृष्ठ पर जाते हैं), इसका रीडायरेक्ट से कोई लेना देना नहीं है। आइए अब रीडायरेक्ट पार्ट एसाइड्स डालें।

var express = require('express'), 
    http = require('http') 
    app = express(); 

app.configure(function() { 
    app.set('port', process.env.PORT || 3000); 
    app.use(express.logger('dev')); 

    /* 
    * Here's where I set the headers, make sure it's above `express.static()`. 
    * 
    * Note: You can safely ignore the rest of the code, (it's pretty much "stock"). 
    */ 
    app.use(function noCachePlease(req, res, next) { 
    if (req.url === '/') { 
     res.header("Cache-Control", "no-cache, no-store, must-revalidate"); 
     res.header("Pragma", "no-cache"); 
     res.header("Expires", 0); 
    } 

    next(); 
    }); 

    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function() { 
    app.use(express.errorHandler()); 
}); 

http.createServer(app).listen(app.get('port'), function() { 
    console.log("Express server listening on port " + app.get('port')); 
}); 

यह कोड अपने ब्राउज़र का निर्देश पेज कैश करने के लिए नहीं:

मैं एक त्वरित (व्यक्त) उदाहरण के लिए लिखा था।

प्रतिक्रिया हेडर मैं बिना मिल noCachePlease मिडलवेयर:

Accept-Ranges bytes 
Cache-Control public, max-age=0 
Connection keep-alive 
Content-Length 5 
Content-Type text/html; charset=UTF-8 
Date Fri, 20 Jul 2012 19:25:38 GMT 
Etag "5-1342811956000" 
Last-Modified Fri, 20 Jul 2012 19:19:16 GMT 
X-Powered-By Express 

प्रतिक्रिया हेडर मैंnoCachePlease मिडलवेयर साथ मिलती है:

Accept-Ranges bytes 
Cache-Control no-cache, no-store, must-revalidate 
Connection keep-alive 
Content-Length 5 
Content-Type text/html; charset=UTF-8 
Date Fri, 20 Jul 2012 19:26:08 GMT 
Etag "5-1342811956000" 
Expires 0 
Last-Modified Fri, 20 Jul 2012 19:19:16 GMT 
Pragma no-cache 
X-Powered-By Express 

तो जैसा कि आप देख सकते हैं, यह काम करता है लेकिन आप इस कोड को स्वयं चला सकते हैं।

यदि आप इसे चलाने के लिए चाहते हैं, तो आपको node_modules के तहत या वैश्विक स्तर पर स्थापित करने की आवश्यकता होगी (-g ध्वज के साथ)।

+0

उत्तर/टिप्पणी के लिए धन्यवाद। दरअसल, मैं दोनों मामलों के लिए express.static का उपयोग करता हूं। जब पृष्ठ लोड होता है (केवल कैश से लिया जा रहा है), तो उसे कॉल करना चाहिए AJAX के माध्यम से '/ issignin /', और उस पर आधारित, जावास्क्रिप्ट उपयुक्त पृष्ठ लेआउट लोड करेगा। यहां आप साइट देख सकते हैं: http://184.73.213.206:8080/ –

+0

@Nathan मेरी धारणा गलत थी। मैं सुंदर हूँ सुनिश्चित करें कि मेरा अद्यतन उत्तर (एक कामकाजी उदाहरण के साथ) सहायक होगा। अगर यह अभी भी नहीं है, तो आपको अपने कोड के कुछ प्रासंगिक हिस्सों (शायद मध्यवर्ती और मार्ग) पोस्ट करना चाहिए। – samitny

+0

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

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