表达压缩的中间件是否压缩请求或响应?

时间:2020-05-06 15:21:27

标签: express

每个快递压缩文件:

将此模块与Express或connect一起使用时,只需app.use尽可能高的使用该模块。通过中间件的请求将被压缩。

var compression = require('compression')
var express = require('express')

var app = express()

// compress all responses
app.use(compression())

理解中间件的快速表达,我对实际压缩感到困惑。该文件说所有请求都将被压缩,但注释中写着“压缩所有响应”。

压缩发送给客户端的响应很有意义。如果正在压缩响应,如何按照文档中所述将其“尽可能地高”?

3 个答案:

答案 0 :(得分:1)

该中间件的工作原理是接管您将要写入response流(例如res.end()res.write()等)的所有方式,然后压缩通过这些方法发送的数据在网络上消失之前。开源的魅力在于,您可以自己看看the source并确切地了解它的作用。

因此,它正在压缩服务器发送给客户端的响应。 “尽可能高地放置”表示对于给定的响应,它将仅压缩在该中间件针对该请求运行之后发出的响应。

因此,如果您有一个请求处理程序或中间件将响应发送回客户端,并且该请求处理程序或中间件在此compression中间件运行之前就已运行(针对特定请求),则{{1} }中间件尚未被钩住,并且将无法对该请求进行压缩。因此,您可以将此中间件放在要压缩其发送的响应的任何其他中间件或请求处理程序之前。

对此的另一种思考方式是,该中间件不会在全局范围内进行自身安装。它挂接到每个传入的请求。因此,在发送响应之前,必须确保它已被钩住。否则,您的响应将在进行压缩之前被发送(并且您的响应不会被压缩)。

答案 1 :(得分:1)

“中间件将根据给定的选项,尝试压缩遍历中间件的所有请求的响应主体。

该中间件将永远不会压缩包含带有no-transform指令的Cache-Control标头的响应,因为压缩会转换主体。”

来源:https://github.com/expressjs/compression

答案 2 :(得分:1)

Compression中间件为遍历中间件的所有给定请求压缩响应主体。中间件不会使用Cache-Control指令压缩包含no-transform头的响应。这是因为这样做会改变身体。

理解中间件的快速表达,我对实际压缩感到困惑。该文件说所有请求都将被压缩,但注释中写着“压缩所有响应”。

这是一个误解。压缩中间件的实际作用是为所有通过中间件的给定请求压缩 响应主体 。它不压缩请求,而是压缩服务器发送给客户端的响应正文。

基于中间件流,应将压缩中间件放置在expressjs应用程序配置的最开始,以便它位于其他中间件和路由之前。这是为了确保您的请求在发送响应之前先通过中间件并压缩响应正文。