2012-02-05 3 views
8

Estoy trabajando en una aplicación que utiliza connect/express con node.js. Se utiliza el middleware "estática" de esta manera:¿Cómo se podría conectar/utilizar en tiempo real el caché sin caducidad en un directorio en particular?

var express = require("express"); 
var io = require("socket.io"); 

var app = express.createServer(
    express.static(__dirname + '/static') 
); 
app.listen(process.env.PORT || 8080); 

var listener = io.listen(app); 
var lobby = listener.of("/lobby"); 
lobby.on("connection", function (socket) { 
    // etc etc etc 
}); 

dentro ./static, hay una carpeta, ./static/mp3, que contiene 88 archivos de audio utilizados por la aplicación.

Aunque los visitantes que vuelven tienen los archivos en caché, me está volviendo loco que todavía envíen 88 solicitudes HTTP para preguntar si sus copias en caché están desactualizadas. ¿Cómo puedo hacer cumplir el almacenamiento en caché de Expires o max-age, solo para esta carpeta?

Respuesta

22

Bien, la respuesta vino fácilmente una vez que me di cuenta de cómo funciona el esquema de conexión de "middleware". Mi solución, que parece estar funcionando muy bien hasta ahora, era insertar mi propio middleware antes static al llamar express#createServer, así: respuesta

var app = express.createServer(
    (function(req, res, next) { 
     if(req.url.indexOf("/mp3/") === 0) { 
      res.setHeader("Cache-Control", "public, max-age=345600"); // 4 days 
      res.setHeader("Expires", new Date(Date.now() + 345600000).toUTCString()); 
     } 
     return next(); 
    }), 
    express.static(__dirname + '/static') 
); 
app.listen(process.env.PORT || 8080); 
1

@ de Brandon era perfecto, porque juego con CoffeeScript, esto es lo que Estoy utilizando:

app.use (req, res, next) -> 
    if req.url.indexOf "/js/" == 0 || req.url.indexOf "/img/" == 0 
    res.setHeader "Cache-Control", "public, max-age=345600" 
    res.setHeader "Expires", new Date(Date.now() + 345600000).toUTCString() 
    next() 

¡Salud!

Cuestiones relacionadas