2013-07-01 11 views
5

Sto costruendo un'applicazione a pagina singola utilizzando Express per il backend e AngularJS per il frontend e sto riscontrando alcuni problemi di cache.Express - Impostazione di maxAge diversi per determinati file

Non sto usando viste espresse, sto servendo solo file con il middleware express.static.

I miei file statici sono in public/app o public/dist in base all'ambiente (dist ha file minificati).

app.use app.router 
app.use express.static(cwd + '/public/' + publicFolder, maxAge: MAX_AGE) 

Quando si richiede '/', app.router verifica se l'utente è connesso, e se tutto è ok, allora index.html è servita via express.static (mi basta chiamare next() nel controller). Se l'utente non è connesso, esso viene reindirizzato a login.html

Il mio problema è che se ho impostato MaxAge, il mio file index.html viene memorizzato nella cache e la prima richiesta di '/' non passa attraverso router. Posso accedere all'app anche se non ho effettuato il login.

Se imposto maxAge su 0, il problema scompare, ma voglio memorizzare nella cache tutti i miei file * .js e * .css.

Qual è l'approccio corretto a questo tipo di problemi? Inizia a utilizzare le visualizzazioni? Diversi punti di montaggio express.static?

+0

Molto importante questione necessaria a voce molto più forte. Può immaginare quante persone si rompono la testa su questo argomento. Grazie per la buona spiegazione. – zeliboba

risposta

4

È sempre possibile definire percorsi individuali senza necessariamente utilizzare le viste (anche se i modelli di visualizzazione non sono una cattiva idea). In questo modo è possibile definire index.html solo per applicare il caso speciale maxAge.

Basta essere sicuri di mettere il percorso prima il middleware statica.

Se si desidera utilizzare lo send, lo stesso server statico utilizzato dal middleware static dietro le quinte. Qualcosa di simile:

// install send from npm 
var send = require("send"); 

app.get("/index.html", function (req, res) { 
    send(req, "/index.html") 
    .maxage(0) 
    .root(__dirname + "/public") 
    .pipe(res); 
}); 

O il modo più basso flusso di livello, qualcosa di simile:

app.get("/index.html", function (req, res) { 
    res.setHeader('Content-Type', 'text/html'); 
    res.setHeader('Cache-Control', 'public, max-age=0'); 

    // Note that you'd probably want to stat the file for `content-length` 
    // as well. This is just an example. 

    var stream = fs.createReadStream(__dirname + '/public/index.html'); 
    stream.pipe(res); 
}); 
Problemi correlati