Доступ к данным POST в узле с использованием koa-body и koa-router

Создание ajax POST из пользовательского агента

$.ajax({
            type: 'POST',
            url: 'https://mysub.domain.dev/myroute',

            headers: {
              'X-Requested-With': 'XMLHttpRequest'
            },
            contentType: 'application/octet-stream; charset=utf-8',
            success: function(result) {
              successAction();
            },
            processData: false,
            data: myResult['myValue']
          });

С Koa2 на моем сервере, как я могу получить данные myResult['myValue'] из тела POST?

const bodyParser = require('koa-body');

const router = new Router();
const body = bodyParser();


router.post('/myroute/', body, async (ctx, next) => {

const getMyValue = ctx.request.body.data.myValue;

}

Я пробовал разные комбинации. Все неопределенные или пустые объекты.

const getMyValue = ctx.request.body

Объект {}

const getMyValue = ctx.request.body.data;

не определено

const getMyValue = ctx.request.body.myResult['myValue'];

не определено

3 ответа

Решение

Пара вещей здесь происходит.

Во-первых, вам нужно явно сказать koa-body искать данные многочастной формы (по умолчанию она отключена). Так:

const koaBody = require('koa-body')

router.post('/myroute', koaBody({ multipart: true }),
  async (ctx, next) => {
    // ctx.request.body.fields: additional (non-file) fields
    // ctx.request.body.files: files (octet-stream) 
  })

Во-вторых, в клиенте вы, вероятно, захотите установить enctype и явно установить contentType в false, Это кажется нелогичным, но мешает jQuery добавить ContentType заголовок, в котором будет отсутствовать строка границы. Ваш запрос будет выглядеть примерно так:

$('#go').click(evt => {
  evt.preventDefault()

  const data = new FormData($('#uploadForm')[0])
  data.append('extra', 'fields if required')

  $.ajax({
    contentType: false,
    data,
    enctype: 'multipart/form-data',
    processData: false,
    success: result => $('#result').text(result),
    type: 'POST',
    url: '...'
  })
})

Обратите внимание, что FormData в примере, который может не подходить к вашему варианту использования, это была просто удобная демонстрация. Вероятно, вы можете просто использовать data: myresult['myValue']при условии, что это файл.

Оказывается, ajax не был необходим, поэтому клиент просто...

 post('/myroute', {data: myResult[myValue] });

Затем коа-тело вводится в маршрутизатор, не помещая его в область видимости страницы. Обратите внимание на круглые скобки...

const bodyParser = require('koa-body');

const router = new Router();

router.post('/myroute/', bodyParser(), async (ctx, next) => {

const getMyValue = ctx.request.body.data;

}

@Kickaha: вам все равно нужно заключить bodyParser () с multipart, потому что по умолчанию multipart: false в koa-body, вместо этого ваша строка должна читать:

      router.post('/myroute/', bodyParser({multipart:true}), async (ctx, next) => {
Другие вопросы по тегам