如何压缩json以使用`bodyParser.json`获取它



我想向服务器发送一个压缩的json。

我更喜欢在浏览器中压缩数据。(explainer(,并将其发送到bodyParser.json中间件。

客户端功能如下:

export function compressGzip(input) {
const stream = new Response(input).body.pipeThrough(
new CompressionStream('gzip')
)
return new Response(stream)
}

我在react.js:中的请求

return fetch(url, {
headers: {
'Content-Type':'application/json',
'content-encoding': 'gzip'
},
method: 'POST',
body: bodyContent
}).then(res => res.blob())

node.js:

app.use(
bodyParser.json({
limit: "10mb"
})
);

根据这些数据进行压缩的方法是什么?它有意义吗?

提前感谢!

我已经用zlib完成了这项工作,但没有用GZIP。

首先,我有这个客户端功能。。。。

function compressBody(body) {
return new Promise( function( resolve, reject ) {
zlib.deflate(body, (err, buffer) => {
if(err){
console.log("Error Zipping");
reject(err);
}
console.log("Zipped");
resolve(buffer);
});
});
}

调用函数。。。。

let compressedBody = await compressBody(JSON.stringify(body));

然后,我可以将这个compressedBody变量分配给Web服务调用。。。

var promise = fetch(ServiceUrl, {method: 'POST', headers:headers, body:compressedBody}).then((result) => result.json() );

然后,您需要更改服务器端代码以接受压缩的正文。我使用了Express并完成了以下操作。。。

var BodyParser = require('body-parser');
require('body-parser-zlib')(BodyParser);
var app = express();
// Other code....
app.use(BodyParser.zlib()); // support json encoded bodies
app.use(BodyParser.json({"inflate": true})); // support json encoded bodies

使用blob,它可以完美地工作:(

代码:

客户端:

export function compressGzip(input) {
const stream = new Response(input).body.pipeThrough(
new CompressionStream('gzip')
)
return new Response(stream).blob()
}
const bodyContent = await compressGzip(JSON.stringify({data: data})
return fetch(url, {
headers: {
'Content-Type':'application/json',
'content-encoding': 'gzip'
},
method: 'POST',
body: bodyContent
}).then(res => res.blob())

服务器端-node.js:

app.use(
bodyParser.json({
limit: "10mb"
})
);

最新更新