NodeJS / एक्सप्रेस: ​​कैश और 304 स्थिति कोड


92

जब मैं एक्सप्रेस के साथ बनाई गई वेबसाइट को फिर से लोड करता हूं, तो मुझे सफारी (क्रोम के साथ नहीं) के साथ एक खाली पृष्ठ मिलता है क्योंकि NodeJS सर्वर मुझे 304 स्थिति कोड भेजता है।

इसे कैसे हल करें?

बेशक, यह सिर्फ सफारी की समस्या हो सकती है, लेकिन वास्तव में यह अन्य सभी वेबसाइटों पर ठीक काम करती है, इसलिए इसे मेरे NodeJS सर्वर पर भी समस्या होना चाहिए।

पृष्ठों को उत्पन्न करने के लिए, मैं जेड का उपयोग कर रहा हूं res.render

अद्यतन: ऐसा लगता है कि यह समस्या इसलिए होती है क्योंकि सफारी 'cache-control': 'max-age=0'पुनः लोड पर भेजता है।

अद्यतन 2: मेरे पास अब वर्कअराउंड है, लेकिन क्या इसका बेहतर समाधान है? युक्ति:

app.get('/:language(' + content.languageSelector + ')/:page', function (req, res)
{
    // Disable caching for content files
    res.header("Cache-Control", "no-cache, no-store, must-revalidate");
    res.header("Pragma", "no-cache");
    res.header("Expires", 0);

    // rendering stuff here…
}

अद्यतन 3: तो वर्तमान में पूरा कोड हिस्सा है:

app.get('/:language(' + content.languageSelector + ')/:page', pageHandle);

function pageHandle (req, res)
{
    var language = req.params.language;
    var thisPage = content.getPage(req.params.page, language);

    if (thisPage)
    {
        // Disable caching for content files
        res.header("Cache-Control", "no-cache, no-store, must-revalidate");
        res.header("Pragma", "no-cache");
        res.header("Expires", 0);

        res.render(thisPage.file + '_' + language, {
            thisPage : thisPage,
            language: language,
            languages: content.languages,
            navigation: content.navigation,
            footerNavigation: content.footerNavigation,
            currentYear: new Date().getFullYear()
        });
    }
    else
    {
        error404Handling(req, res);
    }
}

1
304 कोई समस्या नहीं है। इसका सीधा सा मतलब है कि आपकी प्रतिक्रिया संशोधित नहीं है और संसाधन प्राप्त करने के लिए आपका ब्राउज़र कैश में बदल जाता है। क्या आप संबंधित कोड पोस्ट कर सकते हैं जिसमें विसंगति हो रही है।
अक्षत जीवन शर्मा

3
हां, वास्तव में इसे संशोधित नहीं किया गया है, लेकिन सफारी ने सीएमडी + आर (पुनः लोड) पर अपने कैश को खाली कर दिया और सर्वर केवल कहता है कि यह नहीं बदला।
h345k34cr

304 स्थिति कोड से संबंधित रिक्त पृष्ठ कैसे है? नोड भी अन्य ब्राउज़रों को 304 भेजेगा।
user568109

2
यह संबंधित है क्योंकि 304 के साथ शरीर नहीं भेजा जाता है और ब्राउज़र अपने कैश का उपयोग करता है, लेकिन चूंकि कोई कैश नहीं है, तो आपको एक रिक्त पृष्ठ मिलता है
h345k34cr

1
@ अक्षतजवानशर्मा किसी भी कार्यक्रम को उत्पाद के मालिक के अनुबंध को पूरा करने के लिए विकसित किया जाता है। उत्पाद स्वामी वह है जो कोड का मालिक है और पैसे का भुगतान करता है, न कि कुछ संगठन जो कागजात लिखते हैं जो किसी को परवाह नहीं है। यदि अनुबंध "200" कहता है, तो बिल्कुल कोई भी स्थिति जो "200" के बराबर नहीं है, एक बग है। जब कोई बग होता है तो मुझे उस कोड को फिर से लिखना होगा जब तक कि सब कुछ ठीक वैसा ही न हो जाए जैसी कि उम्मीद थी। W3C का इस मामले में कोई कहना नहीं है।
Gherman

जवाबों:


107

सबसे आसान समाधान:

app.disable('etag');

यदि आप अधिक नियंत्रण चाहते हैं तो यहां वैकल्पिक समाधान:

http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/


2
क्या आप "सबसे आसान समाधान" की व्याख्या कर सकते हैं या इस पर एक संदर्भ दे सकते हैं कि यह कैसे प्रभावित करता है?
सैमुअल मेन्डेज़

1
@ SamuelMéndez यह मूल रूप से कैशिंग अक्षम, ETag पर विकि अच्छा जानकारी का एक बहुत कुछ है en.wikipedia.org/wiki/HTTP_ETag
blented

मेरे लिए काम किया :)
नवीन कुमार वी।

3

जैसा कि आपने कहा, सफारी Cache-Control: max-age=0पुनः लोड पर भेजता है। एक्सप्रेस (या अधिक विशेष रूप से, एक्सप्रेस की निर्भरता, नोड-ताज़ा) Cache-Control: no-cacheहेडर प्राप्त होने पर कैश स्टेल को मानता है , लेकिन यह इसके लिए ऐसा नहीं करता है Cache-Control: max-age=0। मैं जो बता सकता हूं, उससे शायद यही होना चाहिए। लेकिन मैं कैशिंग का विशेषज्ञ नहीं हूं।

फिक्स को (वर्तमान में क्या है) लाइन 37 से बदलना node-fresh/index.jsहै

if (cc && cc.indexOf('no-cache') !== -1) return false;  

सेवा

if (cc && (cc.indexOf('no-cache') !== -1 ||
  cc.indexOf('max-age=0') !== -1)) return false;

मैंने नोड-ताज़ा किया और अपनी परियोजना के package.jsonमाध्यम से इस सुधार को शामिल करने के लिए व्यक्त किया npm, तो आप भी ऐसा कर सकते थे। यहाँ मेरे कांटे हैं, उदाहरण के लिए:

https://github.com/stratusdata/node-fresh https://github.com/stratusdata/express#safari-reload-fix

सफारी-रीलोड-फिक्स शाखा 3.4.7 टैग पर आधारित है।


अच्छा कार्य! मैं देखता हूं कि एक्सप्रेस 3.5.1 में नोड-फ्रेश 0.2.2 के माध्यम से आपका फिक्स शामिल है।
क्लैफौ

वास्तव में, मैं गलत हूं, आपका फिक्स वापस कर दिया गया था और वास्तव में इसे 0.2.2 तक नहीं बनाया गया था। फिर भी कोई ताजा / एक्सप्रेस फिक्स नहीं।
क्फ्फौ

2

सफ़ारी और क्रोम (मुझे जिन लोगों ने परीक्षण किया है) में भी यही समस्या थी, लेकिन मैंने बस कुछ ऐसा किया जो काम करने लगता है, कम से कम मैं इस समस्या को हल करने में सक्षम नहीं हुआ क्योंकि मैंने समाधान जोड़ा। मैंने जो कुछ किया वह एक उत्पन्न टाइमस्टैम्प के साथ हेडर में एक मेटाटैग जोड़ा गया था। सही नहीं लगता है, लेकिन यह आसान है :)

<meta name="304workaround" content="2013-10-24 21:17:23">

PS को अपडेट करें जहां तक ​​मैं बता सकता हूं, जब मैं अपने नोड प्रॉक्सी को हटाता हूं तो समस्या गायब हो जाती है (प्रॉक्सी से मेरा मतलब दोनों express.vhost और http- प्रॉक्सी मॉड्यूल है), जो अजीब है ...


मैं एक अपाचे प्रॉक्सी का भी उपयोग करता हूं, यह समस्या हो सकती है। मेरा वर्कअराउंड http हेडर वाली सामग्री साइटों के लिए सिर्फ कैशिंग को अक्षम करना था।
h345k34cr

हेडर के माध्यम से कैश को निष्क्रिय करना निश्चित रूप से जाने का तरीका है। पहले यह मेरे लिए काम नहीं करता था, लेकिन अब यह करता है। दूसरे शब्दों में, मैंने पहली बार कहीं गलती की होगी :)
user907567

1

सफारी में निजी ब्राउज़िंग का उपयोग करने की कोशिश करें या अपने पूरे कैश / कुकीज़ को हटा दें।

मैंने क्रोम का उपयोग करते हुए कुछ ऐसे ही मुद्दे उठाए हैं जब ब्राउज़र को लगा कि इसकी कैश में वेबसाइट है लेकिन वास्तव में ऐसा नहीं था।

Http अनुरोध का वह हिस्सा जो सर्वर को प्रतिसाद देता है 304 एक etag है। सफारी की तरह लगता है कि इसी कैश के बिना सही etag भेज रहा है।


मेरे लिए यह काम करता है जब मैंने पूरे कैश को हटाने की कोशिश की, धन्यवाद
युतानांत सुवांसरी

0

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

ब्राउज़र पर Shift कुंजी + पुनः लोड बटन का उपयोग करके खाली पृष्ठ को आसानी से हल किया जा सकता है।

खाली पृष्ठ का परिणाम हो सकता है:

  • आपके कोड में एक बग
  • परीक्षण करते समय आपने एक खाली पृष्ठ (आप याद नहीं कर सकते हैं) जो ब्राउज़र द्वारा कैश्ड है
  • सफारी में एक बग (यदि ऐसा है, तो कृपया इसे Apple को रिपोर्ट करें और इसे स्वयं ठीक करने का प्रयास न करें)

पहले Shift कीबोर्ड कुंजी + पुनः लोड करें बटन देखें और देखें कि क्या समस्या अभी भी मौजूद है और अपने कोड की समीक्षा करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.