2012-03-15 145 views
3

有沒有簡單的方法來緩存Express中的頁面,最好是Memcached?我使用Jade作爲模板系統。我期待爲訪問者緩存某些頁面大約30秒。最好是使用express.render,但我願意接受建議。謝謝!Node.js頁面緩存

回答

8

您需要處理渲染結果。

var cache = {}; 

var getPageFromCache(url, callback) { 
    if (cache[url]) { 
     // Get page from cache 
     callback(undefined, cache[url]); 
    } else { 
     // Get nothing 
     callback(); 
    } 
}; 

var setPageToCache(url, content) { 
    // Save to cache 
    cache[url] = content; 
}; 

app.get('/', function(req, res){ 
    getPageFromCache(req.url, function(err, content) { 
     if (err) return req.next(err); 
     if (content) { 
      res.send(content); 
     } else { 
      res.render('index.jade', { title: 'My Site' }, function(err, content) { 
       // Render handler 
       if (err) return req.next(err); 
       setPageToCache(req.url, page); 
       res.send(content); 
      }); 
     } 
    }); 
}); 

如果需要,實現getPageFromCache和setPageToCache以使用memcached。

+0

沒有意識到,有一個res.render回調(!當然有)謝謝! – 2012-03-15 18:43:20

4

我正在使用一個簡單的包:cacher,它是一個處理由memcached支持的頁面緩存的快速中間件。

用法示例:

var Cacher = require("cacher") 
var cacher = new Cacher("myhost:11211") 

// as a global middleware 
app.use(cacher.cacheHourly()) 
// or per route 
app.get("/long-cache", cacher.cacheDaily(), ...) 
app.get("/short-cache", cacher.cacheOneMinute(), ...) 
app.get("/no-cache", ...) 

// listen for events 
cacher.on("hit", function(url) { 
    console.log("woohoo!", url) 
}) 

cacher.on("miss", function(url) { 
    console.log("doh!", url) 
}) 

cacher.on("error", function(err) { 
    console.log(err) 
}) 

又見project on GitHub