2012-02-05 8 views
8

Tôi đang làm việc trên một ứng dụng sử dụng kết nối/express với node.js. Nó sử dụng "tĩnh" middleware như thế này:Làm thế nào để một kết nối/Express sử dụng bộ nhớ đệm không hết hạn trên một thư mục cụ thể

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

trong ./static, có một thư mục, ./static/mp3, có chứa 88 file âm thanh được sử dụng bởi các ứng dụng.

Mặc dù khách truy cập quay lại có các tệp được lưu vào bộ nhớ cache, điều đó khiến tôi cảm thấy khó chịu khi họ gửi 88 yêu cầu http để hỏi xem các bản sao được lưu trong bộ nhớ cache của họ đã lỗi thời chưa. Tôi làm cách nào để thực thi bộ nhớ đệm Expires hoặc max-age, chỉ cho thư mục này?

Trả lời

22

Được rồi, câu trả lời trở nên dễ dàng khi tôi nhận ra cách thức hoạt động của chương trình "middleware" kết nối. Giải pháp của tôi, mà dường như được làm việc tuyệt vời cho đến nay, là để chèn middleware của riêng tôi trước static khi gọi express#createServer, như thế này: Câu trả lời

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

@ brandon là hoàn hảo, vì tôi chơi với coffeescript, đây là những gì tôi đang sử dụng:

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

Chúc mừng!