我正在尝试将gzipped json发送到nodeJS / Express服务器,但我无法让它工作,在生产中我使用一些代码来gzip json对象并发送它但是为了测试目的我让它运行curl
My 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并劫持服务器..