Search code examples
node.jsexpresshttpcachingnode.js-connect

How would one make connect/express use non-expiring caching on a particular directory


I'm working on an app that uses connect/express with node.js. It uses the "static" middleware like this:

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

Within ./static, there's a folder, ./static/mp3, containing 88 audio files used by the app.

Though returning visitors have the files cached, it's driving me nuts that they still send 88 http requests to ask if their cached copies are out of date.

How can I enforce Expires or max-age caching, for only this folder?


Solution

  • Okay, the answer came easily once I realized how the connect "middleware" scheme works. My solution, which seems to be working great so far, was to insert my own middleware before static when calling express#createServer, like this:

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