当使用express与node.js时,您可以控制公共资源的缓存头,如下所示:
app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
将公用文件夹下的所有内容设置为静态可用,缓存超时为1年。但是,如果我想为公共下的其他文件设置不同的超时值呢?假设我在公共/图像/图标下有一些图像,我希望它具有1年的较小值?我试着像这样添加第二次静态调用:
app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
app.use(express.static(path.join(__dirname, 'public/images/icons'), { maxAge: 12345 }));
但它不起作用。它似乎只是忽略了第二个陈述。想法?
答案 0 :(得分:4)
快速测试中间件的顺序,所以如果你先把最具体的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);
等
这背后的原因是我之前的解决方案在根位置安装了所有静态文件,而此解决方案使用正确的maxAge将每个目录挂载到该文件路径
答案 1 :(得分:1)
静态中间件的source code显示它拦截了来自url的路径部分的任何看起来像文件路径的内容,从配置的根目录中统计该文件并在其存在时提供它。
使用vanilla中间件无法更改maxAge选项。
我建议您制作自己的中间件(只是一个函数)并创建适当数量的静态中间件(在每个目录上)并将req, res, next
参数转发到正确的
答案 2 :(得分:0)
您需要将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')));