2013-06-04 19 views
11

Express/Jade görünüm önbelleği ile bazı komik şeyler içine koşuyorum. Denetleyici MongoDB'den Mongoose ile bir makale alır ve res.render işlevine uzatır. Ancak, birkaç dakika çalıştıktan sonra Express, o rotaya yapılan tüm istekler için aynı derlenmiş şablonu sunmaya başlar. Bu paylaşılan bile olur. Çeşitli şablonlarda kullanılan içerir.ifade görünümü önbellek hareketli komik

Veritabanı, doğru makaleleri getiriyor ve şablona rastgele bir dizeyi iletirsem farketmez, her zaman aynı çıktıyı alırım.

Bu

kontrolör fonksiyonudur:

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 
     }); 
    } 
    }); 
}; 

Ve bu rota var:

Ben üretim veya geliştirme modunda çalıştırıyorum bakılmaksızın aynı şeyler olur
app.get('/articles/:id', articles.show); 

.

Express/Jade ile bu tür bir torbanın içine giren herhangi biri var mı?

+2

"Aynı derlenmiş şablon" ile, aynı * rendered * şablonunu mu kastediyorsunuz? Görünüm önbelleği olduğundan emin değilim, çünkü bu, dev modunda çalışırken etkin değil (açık bir şekilde etkinleştirmediyseniz). Ayrıca, görünüm önbelleği yalnızca derlenmiş (ancak gösterilmemiş) şablonları saklar, yine de her istek için ayrı ayrı oluşturulacaktır. Uygulama ayarlarınız neye benziyor? Soruna neden olabilecek başka bir ara yazılım (veya Düğümün önündeki bir proxy sunucusu)? – robertklep

+1

@robertklep ile katılıyorum. Önbelleğe alma işlemini yapan sanırım. Önbellek başlığını görürseniz yanıtın başlıklarını kontrol edebilir misiniz? Ayrıca, aşağıdaki başlıkları sunucu tarafında ayarlamayı deneyin. Cache-Control: Pragma-revalidate gerekir no-cache, hayır-mağaza,: no-cache geçerlilik tarihi: Bu sizin için çalışıyorsa 0 gör http: //stackoverflow.com/questions/49547/making- emin-a-web sayfası-değil-tüm tarayıcılar için önbelleğe-tarayıcılar –

cevap

7

Düzenleme: setleri önbellek üretimi için etkin görüntülemek ifade Bildirimi olun: bakınız express docs

görünüm önbellek varsayılan olarak üretimde etkin görünümü şablon derleme önbelleğe etkinleştirir

deneyin bu satırı ekleyerek uygulama yapılandırma bölümünüzde:

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

Ayrıca w3.org Dokümanlar önbellek denetim başlıklarını

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

eklemeyi deneyin:

Cahce-Kontrol

Cache-Control genel başlık alanı direktiflerini belirtmek için kullanılır Bu, istek/yanıt zinciri boyunca tüm önbellek mekanizmaları tarafından uyulması GEREKİR. Yönergeler, amaçlarına yönelik davranışları önbelleğe alma isteklerini tersine çevirme veya yanıtı olarak belirtir. Bu yönergeler, genellikle varsayılan önbelleğe alma algoritmalarını geçersiz kılar. Önbellek yönergelerinin tek yönlü olması, bir talepteki bir direktifin varlığının, aynı direktifin, yanıtta verilecek olan olduğunu ima etmemesidir. Eğer daha gelişmiş bir denetim gerekiyorsa

, max-yaş gibi diğer alanları düşünün this question de iyi bir kaynaktır, farklı tarayıcılar bu rfc biraz farklı uygulamaya koyabileceği göreceksiniz.

+0

Tarayıcı önbellekleme sorun değil. Dört farklı blog gönderisine baktığımı söyle. Biraz sonra, tüm URL'ler aynı blog gönderisini yayınlamaya başlayacak. Jade şablonun önbelleğe alınması ve ona ilettiğim nesneyi kullanmaktan rahatsız olmaması gibi ... Sadece bilinen son değerleri kullanır. – MikeSmithDev

+0

Tamam, ben sadece tarayıcı önbellek için başlık değil, üretimde bir Vernik olduğunu hayal et, ya da DNS Cloudflare gibi bir önbellek mekanizması var, cevabın bu üstbilgi zincir boyunca uyulması gerekir. Ama senin amacını görüyorum. Sonra ben şablon motor sorunu olan atmak için yeşim hbs veya başka bir yerini alırdım. Ya da önbellek ile ilgili bilinen sorunlar olup olmadığını görmek için Jade repo'ya bir göz atın. – alfonsodev

+0

Evet, sanırım o rotaya gitmek zorundayım. – MikeSmithDev

2

TL; DR: Bunun yerine ben node.js için başka bir newbro olduğum

var articleId; 

ait

let articleId; 

deneyin, ama sadece "var" ikame edilmesi suretiyle aynı sorunu çözdük "let" için anahtar kelime. Buradaki şey, "var" ın, bir fonksiyonun kapsamına giren bir değişken oluşturmasıdır. Bu blok yürütülür, her zaman yeniden oluşturulan Node.js. asenkron doğası nedeniyle önemlidir.