【发布时间】:2013-01-07 11:20:01
【问题描述】:
我有一个简单的节点应用程序,应该从客户端写入指标。 客户端以使用 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)
但似乎 unzip、inflate、gunzip 都不起作用。
【问题讨论】:
-
你确定你没有从 zlib.unzip 得到一个“错误”,因此没有调用 next() 吗?如果是这种情况,请尝试将数据切换为数组。看看这个答案stackoverflow.com/a/12776856/30763另外确保你的中间件在bodyParser之前使用。
-
该答案不是用于解压缩节点而不是客户端完成的请求吗?
-
@alex88 在任何情况下,如果出现错误,您应该致电
next(err)。我还建议你放弃bodyParser中间件,直接使用req.body = JSON.parse(buffer)。 -
好的,问题出在解压缩功能上,谢谢指出,我现在已经更正了这个问题。