Descomprime el cuerpo POST con nodo + express

Tengo una aplicación de nodo simple que debe escribir las métricas de los clientes. Los clientes envían métricas en formato json comprimido con el módulo zlib de python. Estoy tratando de agregar un middleware para descomprimir la publicación de la solicitud antes de que tenga lugar el expreso bodyParse.

Mis middlewares son simplemente los proporcionados por Express por defecto:

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

He intentado agregar un middleware simple que obtiene los datos y luego los descomprime:

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

El problema es con zlib.inflate me sale este error:

 Error: incorrect header check 

Los datos se han comprimido con el módulo zlib de python:

 zlib.compress(jsonString) 

Pero parece que ni descomprimir, inflar, gunzip funciona.

Encontré la solución por mi cuenta, el problema fue con este código:

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

Parece que los datos de solicitud de concatenación no son correctos, así que cambié mi middleware a esto:

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

los tampones de concatenación funcionan perfectamente y ahora puedo descomprimir el cuerpo de la solicitud.

Sé que esta es una respuesta muy tardía, pero con el módulo body-parser :

Devuelve el middleware que solo analiza json. Este analizador acepta cualquier encoding Unicode del cuerpo y admite el inflado automático de codificaciones gzip y de desinflado.

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