0

我正在尝试将 gzipped json 发送到 nodeJS/Express 服务器,但我无法让它工作,在生产中我正在使用一些代码来 gzip 一个 json 对象并将其发送,但出于测试目的,我让它与 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 是我的代码在发送压缩数据时收到的内容..

到目前为止,我能够完成我想要的唯一方法是使用 body-parser text/raw,它{"data":[{"foo":"bar"}]}作为 req.body 和一种字符串类型返回var body = eval( "(" + req.body + ")" ),然后将其转换为 json 对象,但这很危险因为任何人都可以在请求中发送一些 js 并劫持服务器..

4

0 回答 0