节点 zlib 模块未压缩缓冲字符串或 Stream.Readable

Node zlib module not compressing a buffered string or Stream.Readable

我正在使用节点的站点地图模块,它为我的网站生成一个带有站点地图 xml 的字符串。由于这是一个非常大的站点地图,我想将其压缩发送(例如 sitemap.xml.gz)。但是,zlib 模块没有压缩它。如果我将它流式传输到服务器中的一个文件然后使用该文件压缩它,它会起作用,但我希望能够直接压缩生成的 xml 字符串。 这是我正在做的事情:

res.header('Content-Type', 'application/x-gzip');
res.header('Content-Encoding', 'gzip');        
res.header('ContentDisposition',
'attachment;filename="sitemap.xml.gzip"'); 

//testString is used here as an example, the generated sitemap xml will go here
var testString = '<?xml version="1.0" encoding="UTF-8"?>';
var input = Buffer.from(testString, 'utf8');
zlib.gzip(input, function(buferror, data) {
      res.send(data);
});

我也试过不缓冲字符串,而是使用流模块并将其通过管道传输,如下所示:

var s = new stream.Readable();
s._read = function noop() {};
s.push(testString);
s.push(null);
s.pipe(zlib.createGzip()).pipe(res);

但是,我仍然得到相同的结果,一个 sitemap.xml.gzip 文件 压缩。正如我所提到的,如果我将生成的 xml 字符串放入服务器中的文件中,并像这样通过管道传递它,我就能让它工作:

var raw = fs.createReadStream('input.txt.gz');
raw.pipe(zlib.createGzip()).pipe(res);

但我想避免执行此解决方法。谁能解释我做错了什么?提前致谢!

当您使用 Content-Encoding: gzip 时,您允许浏览器自动解码 (/gunzip) 响应的内容。

如果您不想要,请不要设置 header(另外,您的 ContentDisposition header 缺少一个连字符,应该是 Content-Disposition) .