0

gzip された json を nodeJS/Express サーバーに送信しようとしていますが、動作させることができません。本番環境では、いくつかのコードを使用して json オブジェクトを gzip して送信していますが、テスト目的で curl で実行しています

私の Express アプリは、body-parser モジュールを使用した通常の Express 4 アプリケーションです。

var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use('/', routes);

そしてクラスターモジュールを使用しています:

var cluster = require('cluster');
if (cluster.isMaster) {
    var cpuCount = require('os').cpus().length;
    for (var i = 0; i < cpuCount; i += 1) {
        cluster.fork();
    }
} else {
    var app = require('../app');
    var debug = require('debug')('Test:server');
    var http = require('http');
    var port = normalizePort(process.env.PORT || '3000');
    app.set('port', port);
    var server = http.createServer(app);
    server.listen(port);
    server.on('error', onError);
    server.on('listening', onListening);
}
cluster.on('exit', function (worker) {
    cluster.fork();
});

ルートの場合:

router.post('/test', function(req, res, next) {
    try{
        console.log("body: " + JSON.stringify(req.body));
        console.log(typeof req.body);
        console.log(req.body.data);
        return res.send("Ok");
    }catch(err) {
        return res.send("Failed to process: " + err);
    }
});

curlで投稿したら

curl --request POST --data '{"data":[{"foo":"bar"}]}' --header "Content-Type: application/json" -v 127.0.0.1:3000/test

私は期待される:

body: {"data":[{"foo":"bar"}]}
object
[ { foo: 'bar' } ]

ファイルから読み取る場合:

curl --request POST --data '@uncompressed.json' --header "Content-Type: application/json" -v 127.0.0.1:3000/test
curl --request POST --data--binary '@uncompressed.json' --header "Content-Type: application/json" -v 127.0.0.1:3000/test

私は応答を受け取ります:

{"message":"invalid json","error":{"body":"{\"data\":[{\"foo\":\"bar\"}]}","status":400}}

ファイルの内容は次のとおりです。

$ cat uncompressed.json
{"data":[{"foo":"bar"}]}

圧縮データでカールを作成しようとすると、次のようになります。

gunzip -c -d compressed1.dat
{"data":[{"foo":"bar"}]}
curl --request POST --data-binary '@compressed1.dat' --header "Content-Type: application/json" --header "Content-Encoding: gzip" -v 127.0.0.1:3000/test

以前と同じ 400 を取得します。400 は、圧縮データを送信するときにコードが受信するものです..

これまでのところ、私が望むものを達成することができた唯一の方法は{"data":[{"foo":"bar"}]}、文字列のタイプを持つ req.body として返される body-parser text/raw を使用var body = eval( "(" + req.body + ")" )し、それを json オブジェクトに変換するために使用することですが、これは危険です誰でもリクエストでいくつかの js を送信してサーバーを乗っ取ることができるため..

4

0 に答える 0