NodeJS + ExpressJS 压缩无效?

6
我读到过应该压缩向我的 Node 服务器发送的请求,因此我使用 npm 安装了 compression 模块,将其添加到 server.js 中并通过 require() 加载,然后将其作为函数传递给 app.use。
然后我查看了网络选项卡,并想知道压缩节省了多少 kb。于是我取消了压缩,重新启动了服务器,但是与开启压缩时一样,它的大小还是相同的?
这是我的 server.js 文件。
var express = require('express'),
    app = express(),
    path = require('path'),
    apiRouter = require('./app/routes/api'),
    mongoose = require('mongoose'),
    compression = require('compression');

app.use(compression());
app.use(express.static('public'));
app.use('/api', apiRouter);

app.use('*', function(req, res) {
    res.sendFile(path.join(__dirname + '/public/index.html'));
});

mongoose.connect('mongodb://localhost/triviaattack');

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
    //Connected to DB successfully.

});

app.listen(1337);

修改了我的问题,不小心发布了没有压缩模块的server.js版本。已经修复。 - JohnWick
3个回答

9

只有当客户端发送“Accept-Encoding:gzip”请求头时,压缩才起作用。您可以在这里测试压缩。


嗨,有没有任何方法可以检查我是否正在本地主机上运行?编辑:算了,我只会在控制台上检查它们是否被发送。上次我检查时,我认为它们没有被发送。 - JohnWick
你可以使用curl(参见此处:https://dev59.com/3Wox5IYBdhLWcg3wi0zF)或安装诸如Fiddler之类的工具来进行操作。 - Harsha Bhat
我可以在我的Chrome控制台看到请求头被发送与gzip头一起。至少根据Chrome控制台,启用或禁用压缩时传输的字节数相同,这让我感到困惑。也许我会使用Fiddler,它很棒而且我熟悉它。 - JohnWick
这是我的问题。 - chris
我有一个使用babel编写的ES6 Node.js项目,我尝试过压缩但是没有成功。我已经测试了这里解释的所有情况,但都没有成功。有什么建议吗? - Hardik Patel

5

在测试时打开或关闭压缩功能时,请确保在Chrome DevTools中进行硬刷新,否则您将得到未经压缩的“未修改”的响应。

您提供的示例代码对我有效!


谢谢。我在测试之间关闭了chrome.exe并重新启动了它。 - JohnWick
我现在可以看到我的传输字节已经减少了一半。太棒了,第一次测试时我不太确定问题出在哪里,但我认为你的回答就是答案,所以我标记了它。 - JohnWick
对于像JS/CSS这样的资产(通常会被缓存),请使用“清除缓存并强制重新加载”。 - Satya Kalluri

3

压缩中间件是个要求严格的组件。

为了让它正常工作,你需要设置两个东西:

在服务器上,你需要指定一个字节数的阈值(默认为1024(1KB)),超过这个阈值的响应才会被压缩。可以从0开始调整:

app.use(compression({
    threshold: 0
}))

在客户端,您需要设置一个名为Accept-Encoding的标头,并将其设为'gzip'。
GET /mimic HTTP/1.1
Accept-Encoding: gzip
Host: localhost:3005

为了在客户端解压响应,您可以像这样进行操作:
    const response = await axios.post(
        'http://localhost:3005/mimic', { headers: { "Accept-Encoding": "gzip" }, responseType: 'arraybuffer' })
    const xmlData = zlib.gunzipSync(response.data).toString()

在上面的代码中,我使用了zlib和axios模块。zlib是一个nodejs内置模块。如果你是从浏览器中进行操作,还有其他的方法可以选择。 请注意,response.data是一个数组缓冲区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接