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

Node.js 如何在express中的子目录上设置缓存头,node.js,caching,express,Node.js,Caching,Express,将express与node.js一起使用时,可以控制公共资源的缓存头,如下所示: app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 })); app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 })); app.use(express.static(path.join(__dirname,

将express与node.js一起使用时,可以控制公共资源的缓存头,如下所示:

app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
app.use(express.static(path.join(__dirname, 'public/images/icons'), { maxAge: 12345 }));
这将公用文件夹下的所有内容设置为静态可用,缓存超时为1年。但是,如果我想为公共目录下的其他文件设置不同的超时值,该怎么办?假设我在public/images/icons下有一些图片,我希望在1年内有一个较小的值?我尝试向static添加第二个调用,如下所示:

app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
app.use(express.static(path.join(__dirname, 'public/images/icons'), { maxAge: 12345 }));
但它不起作用。它似乎只是忽略了第二句话。想法?

静态中间件的功能表明,它从url的路径部分截取任何看起来像文件路径的内容,从配置的根目录中统计文件,并在文件存在时提供服务

无法使用香草中间件更改maxAge选项


我建议您制作自己的中间件(只是一个函数),并创建适当数量的静态中间件(在每个目录上),并将
req,res,next
参数转发到正确的参数中

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

编辑:

这不会维护路径,所以我会这样做

function static(dirname, age) {
    return express.static(path.join(__dirname, dirname), { maxAge: age });
}
然后打电话

app.use('/public/images/icons', static('public/images/icons', 12345));
app.use('/public/images/', static('public/images', 1234567);
等等


这背后的原因是我以前的解决方案将所有静态文件装载到根目录,而此解决方案将每个目录装载到该文件路径,并使用正确的最大值。您需要将
public
中的每个文件夹装载到其路径上,因为它将作为服务器。也就是说,没有
public

app.use('/css', express.static(__dirname + '/public/css', {  maxAge: '1h'}));
app.use('/img', express.static(__dirname + '/public/img', {  maxAge: '1h'}));
app.use('/fonts', express.static(__dirname + '/public/fonts', {  maxAge: '1h'}));
app.use(express.static(path.join(__dirname, 'public')));

谢谢你的帮助。没有完全遵循您推荐的解决方案。有点像一个快车。我可以得到一个快速的示例吗?请参阅我的编辑--我以前的解决方案在添加静态目录时弄乱了文件路径您让static()方法接受三个参数。是这样吗?我拥有的express版本有一个只接受两个参数的静态值。对不起,你说得很对-
app的第一个参数应该是挂载点。使用我编辑的答案来反映this@Benoir很好,很棒。让我一天都很愉快非常感谢。