使用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