如何在expressjs中检测响应类型,如果是html则设置响应头?
发布于 10 年前 作者 lmk123 5315 次浏览 最后一次编辑是 8 年前 来自 问答

现在我想实现一个需求:如果响应类型是 text/html,那么我需要统一设置一些 HTTP 响应头比如 Cache-Control、X-Frame-Options等,当然最好通过中间件的形式来实现,我总不能在每一次响应 html 之前都重复这一段代码:

res.set( {
    'Cache-Control' : 'public, max-age=60' ,
    'X-Frame-Options' : 'DENY'
} );

但如果我直接把这段代码写成一个中间件的话,其它类型比如cssjs的缓存时间也会被覆盖掉; 然后我又想到了打补丁的方式:

var render = res.render;
res.render = function () {
    res.set( {
        'Cache-Control' : 'public, max-age=60' ,
        'X-Frame-Options' : 'DENY'
    } );
	render.apply( res , arguments );
};

那么问题又来了,如果按照这样的思路,我还需要为其它类似方法如res.sendFile()res.send()都打一个补丁,但我找不到某种方法来判断此次 res 是否会返回一个 html。 最后我想来想去只有这么做了: 设计 URL 的时候遵循一定的规则,比如加后缀 .json 表示这个网址会返回 json ,加后缀 .html 表示这个网址会返回 html 等等。这样我就可以在一个中间件里面通过后缀来判断该怎么控制了。这估计是最后的王牌了。

但难道没有更好更通用的方法了吗?求助= =

1 回复

建立一个router再使用你的中间件不行么? 或者把中间件在使用static以后再use不行么?

回到顶部