node.js - 用 node + express 解压 POST body

标签 node.js express zlib

我有一个简单的 Node 应用程序,它应该从客户端写入指标。 客户端以使用 python 的 zlib 模块压缩的 json 格式发送指标,我正在尝试添加一个中间件以在 express 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 都不起作用。

最佳答案

自己找到解决方案,问题出在这段代码上:

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

连接缓冲区非常有效,我现在可以解压请求正文了。

关于node.js - 用 node + express 解压 POST body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14194864/

相关文章:

javascript - 如何在 Node.js 中导入 util 模块?

ruby-on-rails - 为此我应该使用什么 WebSockets 系统?

node.js - 转换 tf.fromPixels() 创建的张量时遇到问题

javascript - 如何在 Mongoose 中检索子文档

javascript - 使用 ng-bind 在 Angular 中无限循环

javascript - Mongoose:在数组中填充对象时出现问题

jquery - jquery post 和 html form post 的区别

ios - 未知对象类型的zlib解压方法

compiler-errors - ZLIB 的编译问题

json - 解压缩巨大的 json gzip 文件导致 python 中的内存错误