Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 914
Brandon Lockaby Avatar asked Feb 05 '12 06:02

Brandon Lockaby


2 Answers

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);
like image 82
Brandon Lockaby Avatar answered Oct 17 '22 03:10

Brandon Lockaby


@brandon's answer was perfect, because I play with coffeescript, this is what I am using:

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

Cheers!

like image 38
David Avatar answered Oct 17 '22 02:10

David