Как сжать json, чтобы получить его с помощью `bodyParser.json` - PullRequest
0 голосов
/ 30 марта 2020

Я хочу отправить на свой сервер сжатый json.

Я предпочитаю сжимать данные в браузере. ( объяснитель ) и передавать его в bodyParser. json middleware .

функция на стороне клиента примерно такая:

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

мой запрос в реакции. 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"
  })
);

Как сделать сжатие по этим данным и имеет ли это смысл?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Я сделал это с 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));

Затем я могу назначить этот сжатый переменный тела вызову 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
0 голосов
/ 12 апреля 2020

Получил с 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"
  })
);
...