Ho una semplice applicazione di nodo che dovrebbe scrivere le metriche dai client. I client inviano metriche in formato json compresso con il modulo zlib di python, sto cercando di aggiungere un middleware per decomprimere il post di richiesta prima che venga eseguito express bodyParse.Decomprimere il corpo POST con il nodo + express
mie middleware sono semplicemente quelli forniti da espresso per impostazione predefinita:
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')));
});
ho cercato di aggiungere un semplice middleware che ottiene i dati e quindi apre la chiusura lampo è:
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);
}
});
});
});
Il problema è con zlib.inflate ottengo questo errore:
Error: incorrect header check
I dati sono stati compressi con modulo zlib di python:
zlib.compress(jsonString)
ma sembra che non decomprimere, gonfiare, gunzip funziona.
Sei sicuro non si ottiene un "ERR" dal zlib.unzip e di conseguenza il prossimo() non viene chiamato? Se questo è il caso, prova a cambiare i dati in un array. Dai un'occhiata a questa risposta http://stackoverflow.com/a/12776856/30763 Inoltre assicurati che il tuo middleware sia utilizzato prima di bodyParser. – Aaron
Quella risposta non è per decomprimere una richiesta fatta dal nodo e non dal client? – alex88
@ alex88 in ogni caso, dovresti chiamare 'next (err)' se c'è un errore. Suggerisco anche di rinunciare al middleware 'bodyParser' e di eseguire direttamente' req.body = JSON.parse (buffer) '. –