我是一个应该从客户端编写指标的简单节点应用。 客户端使用python的zlib模块压缩json格式的度量标准,我试图在快速发布bodyParse之前添加一个中间件来解压缩请求帖子。
我的中间件只是默认情况下由express提供的中间件:
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)
但似乎没有解压缩,膨胀,枪口工作。
答案 0 :(得分:12)
我自己找到了解决方案,问题在于这段代码:
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);
}
});
});
});
连接缓冲区工作正常,我现在能够将请求体解压缩。
答案 1 :(得分:2)
我知道这是一个非常晚的回复,但是对于模块body-parser
,它会:
返回仅解析json的中间件。此解析器接受正文的任何Unicode编码,并支持gzip和deflate编码的自动膨胀。
var bodyParser = require('body-parser');
app.use( bodyParser.json() ); // to support JSON-encoded bodies