如何在Express中禁用响应数据压缩?compression中间件不生效怎么解决
不生效的可能原因
- 自定义
filter函数缺少默认返回值:compression中间件要求filter回调明确返回布尔值来判断是否对当前请求执行压缩,你当前的实现仅在请求携带x-no-comprassion头时返回false,其余场景返回undefined,会被中间件判定为使用默认压缩规则,导致自定义禁用逻辑失效。 - 请求头拼写不匹配:代码中判断的头名
x-no-comprassion存在拼写错误,“压缩”的正确英文拼写为compression,如果客户端传递的是正确拼写的x-no-compression头,会和代码中的判断条件不匹配,无法触发禁用逻辑。 - 中间件加载顺序错误:如果
compression中间件的注册顺序在路由、静态资源服务等会返回响应的逻辑之后,请求还没走到压缩判断逻辑就已经返回结果,配置自然不会生效。 - 上游代理层额外开启压缩:如果Node服务前部署了Nginx、CDN等反向代理服务,就算Node层已经禁用了压缩,代理层也可能默认开启gzip压缩,最终返回给客户端的响应依旧是压缩后的内容,没有
Content-Length响应头。
修复代码
修改filter函数逻辑,补全默认返回值,同时修正请求头拼写:
const shouldCompress = (req, res) => { // 携带自定义头时直接不压缩 if(req.headers['x-no-compression']) { return false } // 其余场景走compression默认的压缩判断逻辑 return compression.filter(req, res) } app.use(compression({threshold: 5, filter: shouldCompress}))
修改后同时确认客户端请求携带的头名和代码中保持一致,检查compression中间件要注册在所有处理响应的逻辑之前,如有反向代理需要同步关闭代理层的自动gzip压缩配置。
内容的提问来源于stack exchange,提问作者Vladyslav
相关产品推荐
相关产品推荐

