2013-06-04 9 views
11

Mi sto imbattendo in alcune cose divertenti con la cache di visualizzazione in express/Jade. Il controller recupera un articolo da MongoDB tramite Mongoose e lo passa alla funzione res.render. Tuttavia, dopo essere stato in esecuzione per un paio di minuti, Express inizia a pubblicare lo stesso modello compilato per tutte le richieste su quella rotta. Questo succede anche a condivisi. Include include che vengono utilizzati in vari modelli.express view cache acting funny

Il database sta recuperando gli articoli corretti e non importa se passo alcune stringhe casuali al modello, ottengo sempre lo stesso risultato.

Questa è la funzione di controllo:

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

E questo è il percorso:

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

Le stesse cose accadono se sono in esecuzione in modalità di produzione o di sviluppo.

Qualcuno ha incontrato questo tipo di problemi con Express/Jade?

+2

Con "lo stesso modello compilato", si intende lo stesso modello * reso *? Non sono sicuro che sia la cache della vista, dal momento che non è attivo quando viene eseguito in modalità dev (a meno che non sia abilitato esplicitamente?). Inoltre, la vista cache memorizza solo i modelli compilati (ma non restituiti), saranno comunque resi separatamente per ogni richiesta. Come appare la configurazione della tua app? Qualsiasi altro middleware (o forse un server proxy davanti al nodo) che potrebbe causare il problema? – robertklep

+1

Sono d'accordo con @robertklep. Immagino sia il tuo proxy che sta memorizzando nella cache. Puoi controllare le intestazioni della risposta se vedi un'intestazione della cache? Inoltre, prova a impostare le seguenti intestazioni sul lato server. Cache-Control: no-cache, no-store, deve-revalidate Pragma: no-cache Scadenza: 0 vedere se funziona per voi http:? //stackoverflow.com/questions/49547/making- sure-a-web-page-is-not-cache-across-all-browsers –

risposta

7

Edit: noti che esprimono set della cache della vista abilitato per la produzione: vedere express docs

vista cache Abilita vista caching modello di compilazione, attivato nel produzione di default

Prova ad aggiungere questa riga nella sezione di configurazione dell'app:

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

Inoltre, provare ad aggiungere intestazioni Cache-Control

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

Da w3.org docs:

cache all'interno-Control

Il campo generale-header Cache-Control viene utilizzato per specificare le direttive che DEVE essere obbedito da tutti i meccanismi di caching lungo la catena di richiesta/risposta . Le direttive specificano il comportamento inteso a impedendo alle cache di interferire negativamente con la richiesta o la risposta . Queste direttive sovrascrivono in genere gli algoritmi di cache predefiniti. Le direttive della cache sono unidirezionali in quanto la presenza di di una direttiva in una richiesta non implica che la stessa direttiva sia da fornire nella risposta.

Se avete bisogno di un controllo più avanzato, considerare altri campi come max-age, this question è anche una buona risorsa, vedrete che diversi browser possono implementare questa RFC leggermente diverso.

+0

Il caching del browser non è un problema. Dico che guardo quattro diversi post del blog. Dopo un po ', tutti gli URL inizieranno a pubblicare lo stesso post sul blog. È come se jade stesse memorizzando il template nella cache e non si preoccupasse di usare l'oggetto che gli passo ... Usa solo gli ultimi valori conosciuti. – MikeSmithDev

+0

Ok, vedo il tuo punto, l'intestazione non è solo per la cache del browser, immagina di avere una Varnish in produzione, o il tuo DNS ha un meccanismo di cache come Cloudflare, questa intestazione nella risposta deve essere rispettata lungo la catena. Ma capisco il tuo punto. Quindi sostituirò jade per hbs o altro per scartare che è un problema con il motore di template. O dare un'occhiata al repository Jade per vedere se ci sono problemi noti con la cache. – alfonsodev

+0

Sì, penso che dovrò seguire questa strada. – MikeSmithDev

2

TL; DR: provare

let articleId; 

invece di

var articleId; 

Sono solo un'altra newbro per Node.js, ma ho appena risolto lo stesso problema sostituendo "var" parola chiave per "let". Il fatto è che "var" crea una variabile con scope per una funzione, mentre "let" - ha un ambito per il blocco corrente. Viene ricreato ogni volta che viene eseguito il blocco, il che è importante a causa della natura asincrona di Node.js.