2012-03-15 239 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