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

How to compress json to get it with `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 变量分配给 webervice 调用...

 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"
  })
);