Доступ к данным 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) => {