如何在express中的子目录上设置缓存头

d51*_*512 4 caching node.js express

在 node.js 中使用 express 时,您可以像这样控制公共资源的缓存头:

app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
Run Code Online (Sandbox Code Playgroud)

这会将 public 文件夹下的所有内容设置为静态可用,缓存超时为 1 年。但是如果我想为公共下的其他文件设置不同的超时值怎么办?假设我在 public/images/icons 下有一些图像,我希望在 1 年内具有较小的值?我尝试添加第二个对 static 的调用,如下所示:

app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
app.use(express.static(path.join(__dirname, 'public/images/icons'), { maxAge: 12345 }));
Run Code Online (Sandbox Code Playgroud)

但它没有用。它似乎只是忽略了第二个语句。想法?

Ben*_*oir 5

Express 按顺序测试中间件,因此如果您首先调用最具体的 express.static 调用,那么它应该可以工作,即

app.use(express.static(path.join(__dirname, 'public/images/icons'), { maxAge: 12345 }));
app.use(express.static(path.join(__dirname, 'public/images'), { maxAge: 1234567 }));
app.use(express.static(path.join(__dirname, 'public/else'), { maxAge: 9874567 }));
app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
Run Code Online (Sandbox Code Playgroud)

等等。

编辑:

这不会保持路径,所以我会做

function static(dirname, age) {
    return express.static(path.join(__dirname, dirname), { maxAge: age });
}
Run Code Online (Sandbox Code Playgroud)

然后打电话

app.use('/public/images/icons', static('public/images/icons', 12345));
app.use('/public/images/', static('public/images', 1234567);
Run Code Online (Sandbox Code Playgroud)

等等。

这背后的原因是我以前的解决方案将所有静态文件安装在根目录下,而此解决方案使用正确的 maxAge 在该文件路径中安装每个目录