我正在尝试将 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 并劫持服务器..