Как получить доступ к полезной нагрузке запроса в веб-фреймворке Koa?

Мы используем функцию navigator.sendBeacon для отправки данных на сервер Koa, в котором мы используем bodyparser.

Если мы не обернули данные в форму, то по умолчанию эта функция отправляет данные в качестве полезной нагрузки запроса. Как я могу получить доступ к этим данным на сервере Koa?

Пример -

navigator.sendBeacon('http://localhost:3000/cookies/', 'test=payload')

На сервере тело запроса пустое.

введите здесь описание изображения


person RockStar    schedule 03.12.2018    source источник
comment
см. вариант enableTypes для koa-bodyparser.   -  person Faris    schedule 04.12.2018


Ответы (2)


Учитывая, что

  1. Koa не анализирует тело запроса, поэтому вам нужно использовать либо koa-bodyparser, либо koa-body,

  2. koa-bodyparser по умолчанию включен только парсинг json и form,

  3. Из скриншот видно, что navigator.sendBeacon установил Content-Type на text,

Вам нужно изменить код сервера Koa, чтобы он анализировал text данных.

Пример:

const Koa = require('koa'),
  bodyParser = require('koa-bodyparser'),
  app = (module.exports = new Koa());

app.use(bodyParser({ enableTypes: ['json', 'text'] }));

app.use(async (ctx) => {
  // ctx.request.body should contain the parsed data.
  console.log('Received data:', ctx.request.body);
  ctx.body = ctx.request.body;
});

if (!module.parent) app.listen(3000);

Протестировано с

коа 2.7.0,

коа-бодипарсер 4.2.1.

person Antony    schedule 11.06.2019

Хотя koa не анализирует тело request и по какой-то причине вы не хотите использовать koa-bodyparser, вы все равно можете использовать необработанный http для сбора объекта body из request.

app.use(async (ctx) => {  
  try {
    // notice that I'm wrapping event emitter in a `promise`
    ctx.body = await new Promise((resolve, reject) => {
        let data = '';
        // this is same as your raw `http.request.on('data', () => ()`
        ctx.req.on('data', chunk => {
          data += chunk;
        };
        ctx.req.on('error', err => {
          reject(err);
        };
        ctx.req.on('end', () => {
          resolve(data);
        };
      });
  } catch (e) {
    console.error(e);
  }
});
person shriek    schedule 09.05.2021