使用node + express解压缩POST正文

我有一个简单的节点应用程序,应该写客户端的指标。 客户端以json格式发送指标,并使用python的zlib模块进行压缩,我正在尝试在express 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) 

但似乎既不unzip,inflate,gunzip工程。

发现自己的解决scheme,问题是这段代码:

 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); } }); }); }); 

连接缓冲区完美工作,我现在可以得到请求身体解压缩。

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

返回只parsingjson的中间件。 这个parsing器接受身体的任何Unicode编码,并支持gzip和deflate编码的自动膨胀。

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