NodeJS / express: Önbellek ve 304 durum kodu


92

Ekspres ile yapılmış bir web sitesini yeniden yüklediğimde, NodeJS sunucusu bana bir 304 durum kodu gönderdiği için Safari ile (Chrome ile değil) boş bir sayfa alıyorum.

Bu nasıl çözülür?

Tabii ki, bu sadece Safari'nin bir sorunu olabilir, ancak aslında diğer tüm web sitelerinde iyi çalışıyor, bu yüzden NodeJS sunucumda da bir sorun olmalı.

Sayfaları oluşturmak için Jade kullanıyorum res.render.

Güncelleme: Bu sorun, Safari 'cache-control': 'max-age=0'yeniden yüklendiğinde gönderdiği için oluşuyor gibi görünüyor .

Güncelleme 2: Şimdi bir çözümüm var, ancak daha iyi bir çözüm var mı? Çözüm:

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…
}

Güncelleme 3: Yani kodun tamamı şu anda:

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 sorun değil. Basitçe yanıtınızın değiştirilmediği ve tarayıcınızın kaynağı almak için önbelleğe döndüğü anlamına gelir. Anormalliğin meydana geldiği ilgili kodu gönderebilir misiniz?
Akshat Jiwan Sharma

3
evet, aslında değiştirilmedi, ancak Safari önbelleğini CMD + R'de (yeniden yükle) boşaltır ve sunucu yalnızca değişmediğini söylüyor.
h345k34cr

Boş sayfa 304 durum koduyla nasıl ilişkilidir? Düğüm ayrıca diğer tarayıcılara 304 gönderecektir.
user568109

2
Bu ilişkilidir çünkü 304 ile gövde gönderilmez ve tarayıcı önbelleğini kullanır, ancak önbellek olmadığı için boş bir sayfa alırsınız
h345k34cr

1
@AkshatJiwanSharma Herhangi bir program, ürün sahibinin sözleşmesini tam olarak karşılayacak şekilde geliştirilmiştir. Ürün sahibi, koda sahip olan ve parayı ödeyen kişidir, kimsenin umursamadığı kağıtları yazan bir kuruluş değil. Kontrat "200" diyorsa, o zaman kesinlikle "200" e eşit olmayan herhangi bir durum bir hatadır. Bir hata olduğunda, her şey tam olarak beklendiği gibi olana kadar kodu yeniden YAZMALIYIM. W3C'nin bu konuda söz hakkı yok.
Gherman

Yanıtlar:


107

En kolay çözüm:

app.disable('etag');

Daha fazla kontrol istiyorsanız burada alternatif çözüm:

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


2
"En kolay çözümü" açıklayabilir misiniz veya bunun nasıl etkilediğine dair bir referans verebilir misiniz?
Samuel Méndez

1
@ SamuelMéndez, temelde önbelleğe almayı devre dışı bırakır, etag'daki wiki pek çok iyi bilgiye sahiptir en.wikipedia.org/wiki/HTTP_ETag
18'de

Benim için çalıştı :)
Naveen Kumar V

3

Dediğiniz gibi, Safari Cache-Control: max-age=0yeniden yüklendiğinde gönderir . Express (veya daha spesifik olarak, Express'in bağımlılığı, node-fresh) Cache-Control: no-cacheüstbilgiler alındığında önbelleğin eski olduğunu düşünür , ancak aynı şeyi Cache-Control: max-age=0. Anladığım kadarıyla muhtemelen olmalı. Ama önbelleğe alma konusunda uzman değilim.

Düzeltme hattı 37 (şu anda ne) değişikliğe olduğunu node-fresh/index.jsden

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

-e

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

Ben düğüm-taze çatallı ve benim proje en bu düzeltme içerecek şekilde ifade package.jsonüzeri npm, aynı yapabilirdi. İşte çatallarım, örneğin:

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

Safari-yeniden yükleme-düzeltme dalı, 3.4.7 etiketine dayanmaktadır.


Harika iş! Ekspres 3.5.1'in yeni düğüm 0.2.2 aracılığıyla düzeltmenizi içerdiğini görüyorum.
Clafou

Aslında yanılıyorum, düzeltmeniz geri alındı ​​ve gerçekte 0.2.2'ye ulaşmadı. Hala yeni / hızlı bir düzeltme yok.
Clafou

2

Safari ve Chrome'da aynı sorunu yaşadım (test ettiğim tek sorun) ancak işe yarayan bir şey yaptım, en azından çözümü eklediğimden beri sorunu yeniden oluşturamadım. Yaptığım şey, oluşturulan bir zaman damgası ile başlığa bir meta etiket eklemekti. Doğru görünmüyor ama basit :)

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

Güncelleştirme Söyleyebileceğim PS Bildiğim kadarıyla, sorun benim düğüm vekil kaldırdığınızda garip, (vekaleten ı hem express.vhost ve http-vekil modülü ortalama) kaybolur ...


Ayrıca bir Apache proxy kullanıyorum, sorun bu olabilir. Çözümüm, yalnızca http başlıklarına sahip içerik siteleri için önbelleğe almayı devre dışı bırakmaktı.
h345k34cr

Başlıklar aracılığıyla önbelleği devre dışı bırakmak kesinlikle yapılacak yoldur. İlk başta benim için işe yaramadı ama şimdi işe yarıyor. Diğer bir deyişle, ilk seferinde bir yerde bir hata yapmış olmalıyım :)
user907567

1

Safari'de özel göz atmayı veya tüm önbelleğinizi / çerezlerinizi silmeyi deneyin.

Tarayıcı, web sitesinin önbelleğinde olduğunu düşündüğünde, ancak aslında yoktu.

Http talebinin sunucunun 304'e yanıt vermesini sağlayan kısmı etag'dir. Görünüşe göre Safari, ilgili önbelleğe sahip olmadan doğru etiketi gönderiyor.


önbelleğin tamamını silmeye çalıştığımda
işe yarıyor

0

Eski soru, biliyorum. Önbellek özelliğini devre dışı bırakmak gerekli değildir ve sorunu yönetmenin en iyi yolu değildir. Önbellek özelliğini devre dışı bırakarak sunucunun daha fazla çalışması ve daha fazla trafik oluşturması gerekir. Ayrıca tarayıcının ve cihazın daha çok çalışması gerekiyor, özellikle mobil cihazlarda bu bir sorun olabilir.

Boş sayfa, tarayıcıdaki Shift tuşu + yeniden yükle düğmesi kullanılarak kolayca çözülebilir.

Boş sayfa şunların bir sonucu olabilir:

  • kodunuzda bir hata
  • test sırasında tarayıcı tarafından önbelleğe alınan boş bir sayfa sundunuz (hatırlayamazsınız)
  • Safari'de bir hata (öyleyse, lütfen Apple'a bildirin ve kendi başınıza düzeltmeye çalışmayın)

Önce Shift klavye tuşu + yeniden yükle düğmesini deneyin ve sorunun devam edip etmediğini görün ve kodunuzu inceleyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.