从用户代理进行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,如何从POST主体获取数据myResult [' myValue']?
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'];
未定义
答案 0 :(得分:1)
这里发生了一些事情。
首先,您需要明确告诉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']
,假设这是一个文件。
答案 1 :(得分:0)
原来ajax是不必要的,所以客户只是......
post('/myroute', {data: myResult[myValue] });
然后将koa体注入路由器,而不首先在页面范围内实例化。注意括号......
const bodyParser = require('koa-body');
const router = new Router();
router.post('/myroute/', bodyParser(), async (ctx, next) => {
const getMyValue = ctx.request.body.data;
}