Nodejs Express框架缓存

25
我使用Node.js和Express.js。同时,我将NowJS添加到Express.js中以执行一些实时操作。
在配置文件中,我有:
app.configure('production', function() {
var oneYear = 31557600000;
app.use(express.static(__dirname + '/public', { maxAge: oneYear }));
app.use(express.errorHandler());});

我使用以下命令运行应用程序:

$ NODE_ENV=production node app.js

然而,文件(图片、CSS、JS)似乎没有被缓存,它们总是作为新文件提供。

附:我刚刚在本地主机上进行了测试,缓存似乎在本地主机上运作正常,但是当上传到服务器时,缓存不再起作用。


4个回答

26

Express是基于Connect构建的,而Connect提供了"static"中间件。这里是缓存底层代码:

if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (maxAge / 1000));

你可以在这里找到那段代码:

https://github.com/senchalabs/connect/blob/master/lib/middleware/static.js#L147

所以,正如你所看到的,Express会向浏览器发送一个“Cache-Control”头,告诉浏览器缓存该文件一段时间。因此,这不是“加载文件一次,然后始终将其提供给所有客户端”,而更像是“第一次下载文件时告诉每个客户端缓存该文件” (这意味着所有客户端都必须在缓存文件之前至少下载该文件一次)。


3
Express.static提供公共文件的服务器端缓存吗? - Muhammad Umer
@MuhammadUmer 看看这个-> http://goenning.net/2016/02/10/simple-server-side-cache-for-expressjs/ - Ishan Jain

14
以下代码可以完成任务:
app.use(function (req, res, next) {
    if (req.url.match(/^\/(css|js|img|font)\/.+/)) {
        res.setHeader('Cache-Control', 'public, max-age=3600'); // cache header
    }
    next();
});

10
以下代码能够解决问题:
var cacheTime = 86400000*7;     // 7 days

app.use(express.static(__dirname + '/public',{ maxAge: cacheTime }));

然而我的公共目录中包含CSS以及HTML文件。

有没有办法仅缓存CSS文件而不缓存HTML文件。

我尝试在HTML文件中使用meta标签设置"no-cache",但它没有起作用。


2
如果您使用 F5,则浏览器会从服务器加载文件。 在地址栏中按回车键会从缓存中加载文件。 - vashishatashu

2

7
connect.staticCache()现在已经过时。 - Kristopher Johnson
有关此弃用信息的任何参考文献?应该使用什么替代品? - Mitar
应该使用什么替代,更重要的是,为什么它被弃用了? - skeggse
2
staticCache 不是关于 HTTP 缓存,而是缓存 node 中文件的内容,以便它们不必从操作系统中读取。 - eug
2
这是弃用消息。我猜你应该使用“真正”的缓存而不是中间件。 - superlukas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接