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 を送信してサーバーを乗っ取ることができるため..