解压缩POST机身采用节点+快递(Unzip POST body with node + expre

2019-08-05 21:35发布

我一直认为应该写来自客户端的指标简单节点的应用程序。 客户端发送与Python的zlib的模块拉链JSON格式的指标,我想添加一个中间件解压后要求快递bodyParse发生之前。

我中间件只是默认快递提供的:

app.configure(function(){
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser('your secret here'));
    app.use(express.session());
    app.use(app.router);
    app.use(require('less-middleware')({ src: __dirname + '/public' }));
    app.use(express.static(path.join(__dirname, 'public')));
});

我试图添加一个简单的中间件获取数据,然后将其解压:

app.use(function(req, res, next) {
    var data = '';
    req.addListener("data", function(chunk) {
        data += chunk;
    });

    req.addListener("end", function() {
        zlib.inflate(data, function(err, buffer) {
            if (!err) {
                req.body = buffer;
                next();
            } else {
                next(err);
            }
        });
    });
});

问题是与zlib.inflate我得到这个错误:

Error: incorrect header check

该数据已经被压缩与Python的zlib的模块:

zlib.compress(jsonString)

但目前看来,没有解压缩,膨胀,gunzip解工作。

Answer 1:

发现我自己的解决方案,问题是这片的代码:

req.addListener("data", function(chunk) {
    data += chunk;
});

似乎串联请求数据是不正确的,所以我打开我的中间件这样的:

app.use(function(req, res, next) {
    var data = [];
    req.addListener("data", function(chunk) {
        data.push(new Buffer(chunk));
    });
    req.addListener("end", function() {
        buffer = Buffer.concat(data);
        zlib.inflate(buffer, function(err, result) {
            if (!err) {
                req.body = result.toString();
                next();
            } else {
                next(err);
            }
        });
    });
});

串联缓冲区完美的作品,现在我能得到请求体解压。



Answer 2:

我知道这是一个非常晚回应,但与模块body-parser ,它会:

返回中间件,只有解析JSON。 此解析器接受身体的任何Unicode编码和支持gzip的自动充气和放气的编码。

var bodyParser = require('body-parser');
app.use( bodyParser.json() );       // to support JSON-encoded bodies


文章来源: Unzip POST body with node + express