如何在请求的模块响应中解压缩gzipped主体?
我在网上尝试了几个例子,但似乎都没有.
request(url, function(err, response, body) {
if(err) {
handleError(err)
} else {
if(response.headers['content-encoding'] == 'gzip') {
// How can I unzip the gzipped string body variable?
// For instance, this url:
// http://highsnobiety.com/2012/08/25/norse-projects-fall-2012-lookbook/
// Throws error:
// { [Error: incorrect header check] errno: -3, code: 'Z_DATA_ERROR' }
// Yet, browser displays page fine and debugger shows its gzipped
// And unzipped by browser fine...
if(response.headers['content-encoding'] && response.headers['content-encoding'].toLowerCase().indexOf('gzip') > -1) {
var body = response.body;
zlib.gunzip(response.body, function(error, data) {
if(!error) …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个可以使用 express 接受 gzipped POST 数据的服务器。我想我可以编写自己的中间件来将请求流通过管道传输到 zlib.createGunzip() 流。问题是,我怎样才能做到这一点,之后 express.bodyParser() 中间件仍然能够解析我压缩的 POST 数据?
我试图用 zlib 流的方法替换原始请求流方法,但这只会使 bodyParser 返回“错误请求”错误:
var express = require('express');
var app = express();
function gUnzip(req, res, next) {
var newReq;
if (req.headers['content-encoding'] === 'gzip') {
console.log("received gzipped body");
newReq = req.pipe(zlib.createGunzip());
Object.getOwnPropertyNames(newReq).forEach(function (p) {
req[p] = newReq[p];
});
}
next();
}
app.use(gUnzip);
app.use(express.bodyParser());
app.listen(8080);
Run Code Online (Sandbox Code Playgroud)
有没有办法在我自己的中间件中不重写 bodyParser() 中间件的情况下完成这项工作?
编辑:这是同一个问题:使用 node + express 解压缩 POST body。但在答案中,他只是在自己的中间件中完成了 express.bodyParser() 应该做的事情,这是我想要避免的。我正在寻找一种方法来简单地从流中解压缩请求数据,然后将其传递给 bodyParser(),它需要一个流本身,如http://www.senchalabs.org/connect/json 所示。 HTML。