【发布时间】:2019-08-05 18:26:37
【问题描述】:
我是一名前端开发人员,在这里我在后端提升我的能力。
我有一个托管应用程序的 Node express 服务器并且在同一服务器/AWS EC2 实例上提供 REST api。
我使用express-static-gzip npm 包为静态应用程序包和资产启用 brotli 压缩。这太棒了。但是,我不得不为 Three.js 对象切换到 SSR,因为手机无法处理海量数据集解析。不幸的是,它没有对我的 REST 数据应用压缩。
目前,在此期间,我禁用了 express-static-gzip 并启用了 compression npm 包。这仅启用 gzip,但同时适用于静态包和 REST API。
我特别需要在我的静态包和我的 REST API 上使用 GZIP/Deflate 后备压缩的 Brotli。未压缩的最大 GET 请求可以是 138MB。 GZIP 将其缩小到 12.8MB。我希望它使用 Brotli 时小于 10MB。
我的意图是让 express-static-gzip 在我的包上运行压缩,并在我的 REST API 上手动进行节点 zlib 压缩。如果这不可行,那么对所有内容进行手动节点 zlib 压缩!
我不明白一些关于缓冲区和后端类型的事情......也许你可以在这里告诉我我做错了什么:
app.get('/quakeData/:index', function(req, res){
// Send Specific Selection or All
const encoding = req.headers['accept-encoding'],
index = req.params.index,
jsonArr = index != "all" ? [ quakes[index], threeData[index] ] : [ quakes, threeData ],
jsonStr = JSON.stringify(jsonArr),
bData = Buffer.from(jsonStr);
if (encoding.includes('br')) {
console.log("BROTLI RES");
zlib.brotliCompress(bData, (err, result) => {
console.log(result);
!err ? res.send(result) : console.warn(err);
});
} else if (encoding.includes('gzip')) {
console.log("GZIP RES");
zlib.gzip(bData, (err, result) => {
console.log(result);
!err ? res.send(result) : console.warn(err);
});
} else if (encoding.includes('deflate')) {
console.log("DEFLATE RES");
zlib.deflate(bData, (err, result) => {
console.log(result);
!err ? res.send(result) : console.warn(err);
})
} else {
console.warn("Unsupported Content Encoding Headers");
res.setHeader('Content-Type', 'application/json');
res.json(jsonArr);
}
另外,我意识到压缩模块会删除 Content Length 标头,因为我的 XHR Progress API 代码停止工作。无论实施什么解决方案,我都需要有 Content Length 标头。我该怎么做?另外,有没有办法设置 GET 以提前接收内容长度以估计下载时间?
谢谢!
【问题讨论】:
标签: node.js compression zlib