2013-06-04 4 views
11

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

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

इस नियंत्रक समारोह है:

exports.show = function(req, res) { 
    var articleId; 
    articleId = req.params.id; 
    Article.findOne({ 
    _id: articleId 
    }).populate('author').exec(function(err, article) { 
    if (err) { 
     console.log(err); 
    } else { 
     res.render('articles/show', { 
     article: article, 
     articleId: article.id 
     }); 
    } 
    }); 
}; 

और वह मार्ग है:

app.get('/articles/:id', articles.show); 

ही बातें होती हैं कि क्या मैं उत्पादन या विकास मोड में चल रहा हूँ।

क्या कोई भी एक्सप्रेस/जेड के साथ इस तरह के टर्बल में चला गया है?

+2

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

+1

मैं @robertklep से सहमत हूं। मुझे लगता है कि यह आपकी प्रॉक्सी है जो कैशिंग है। यदि आप कोई कैश हेडर देखते हैं तो क्या आप प्रतिक्रिया के शीर्षलेखों की जांच कर सकते हैं? साथ ही, सर्वर के पक्ष में निम्न शीर्षलेख सेट करने का प्रयास करें। कैश-नियंत्रण: नहीं-कैश, कोई दुकान, होगा दोबारा सत्यापित Pragma: कोई कैश समाप्ति: 0 देखें कि यदि आप के लिए काम करता है http: //stackoverflow.com/questions/49547/making- निश्चित-ए-वेब-पेज-है-कैश-ऑल-ऑल-ब्राउजर –

उत्तर

7

संपादित करें: सूचना है कि व्यक्त सेट देखने कैश उत्पादन के लिए सक्षम होना चाहिए: देख express docs

दृश्य कैश सक्षम बनाता है दृश्य टेम्पलेट संकलन कैशिंग, डिफ़ॉल्ट रूप से उत्पादन में सक्षम

इस लाइन जोड़ने का प्रयास करें आपके ऐप कॉन्फ़िगरेशन सेक्शन में:

app.disable('view cache'); 
,210

इसके अलावा, कैश नियंत्रण हेडर

res.setHeader('Cache-Control', 'no-cache'); 
res.render('articles/show', { 
... 

जोड़ने w3.org डॉक्स से प्रयास करें:

Cahce नियंत्रण

कैश-नियंत्रण सामान्य हेडर फ़ील्ड निर्देशों निर्दिष्ट करने के लिए प्रयोग किया जाता है अनुरोध/प्रतिक्रिया श्रृंखला के साथ सभी कैशिंग तंत्र द्वारा इसका पालन किया जाना चाहिए। निर्देश के लिए किए गए व्यवहार को निर्दिष्ट करते हैं, जो कैश को अनुरोध या प्रतिक्रिया में प्रतिकूल रूप से हस्तक्षेप करने से रोकते हैं। ये निर्देश आमतौर पर डिफ़ॉल्ट कैशिंग एल्गोरिदम ओवरराइड करते हैं। कैश निर्देश एकजुट हैं कि अनुरोध में निर्देश के उपस्थिति का अर्थ यह नहीं है कि प्रतिक्रिया में दिए जाने के लिए एक ही निर्देश है।

आप एक और अधिक उन्नत नियंत्रण की जरूरत है, अधिकतम उम्र की तरह अन्य क्षेत्रों पर विचार करें, this question भी एक अच्छा स्रोत है, तो आप उस विभिन्न ब्राउज़रों इस आरएफसी थोड़ा अलग लागू कर सकते हैं देखेंगे।

+0

ब्राउज़र कैशिंग समस्या नहीं है। मान लें कि मैं चार अलग-अलग ब्लॉग पोस्ट देखता हूं। थोड़ी देर के बाद, सभी यूआरएल एक ही ब्लॉग पोस्ट देने शुरू कर देंगे। ऐसा लगता है कि जेड टेम्पलेट को कैश कर रहा है और उस ऑब्जेक्ट का उपयोग करने के लिए परेशान नहीं है जिसे मैं पास करता हूं ... यह सिर्फ अंतिम ज्ञात मानों का उपयोग करता है। – MikeSmithDev

+0

ठीक है, मैं आपका बिंदु देखता हूं, हेडर केवल ब्राउज़र कैश के लिए नहीं है, कल्पना करें कि आपके पास उत्पादन में वार्निश है, या आपके DNS में क्लाउडफ्लेयर जैसे कैश तंत्र हैं, प्रतिक्रिया में यह शीर्षलेख श्रृंखला के साथ पालन किया जाना चाहिए। लेकिन मैं आपकी बात देखता हूँ। फिर मैं जेड को एचबीएस या अन्य के लिए प्रतिस्थापित कर दूंगा ताकि यह टेम्पलेट इंजन की समस्या हो। या कैश के साथ ज्ञात समस्याएं देखने के लिए जेड रेपो में एक नज़र डालें। – alfonsodev

+0

हाँ मुझे लगता है कि मुझे उस मार्ग पर जाना होगा। – MikeSmithDev

2

टी एल; डॉ: कोशिश

let articleId; 
बजाय

var articleId; 

मैं सिर्फ Node.js के लिए एक और newbro हूँ

, लेकिन मैं सिर्फ "वर" प्रतिस्थापन एक ही समस्या हल हो जाती गए "चलो" के लिए कीवर्ड। बात यह है कि "var" एक फ़ंक्शन द्वारा स्कॉप्ड एक चर बनाता है, जबकि "चलो" - वर्तमान ब्लॉक को स्कॉप्ड किया जाता है। जब भी ब्लॉक निष्पादित किया जाता है, यह फिर से बनाया जाता है, जो नोड.जे.एस. की असीमित प्रकृति के कारण महत्वपूर्ण है।

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