8

クライアントからメトリックを書き込む必要がある単純なノード アプリがあります。クライアントは、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)

しかし、解凍、膨張、ガンジップのどちらも機能しないようです。

4

2 に答える 2

13

自分で解決策を見つけましたが、問題は次のコードにありました。

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

バッファの連結は完全に機能し、リクエストの本文を解凍できるようになりました。

于 2013-01-07T14:59:43.810 に答える