从用户代理创建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'];未定义
发布于 2018-01-03 17:18:29
这里发生了几件事。
首先,您需要显式地告诉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']。
发布于 2018-01-05 03:26:03
事实证明ajax是不必要的,所以客户端只是...
post('/myroute', {data: myResult[myValue] });然后koa-body被注入到路由器中,而不是首先在page作用域中实例化它。注意括号..。
const bodyParser = require('koa-body');
const router = new Router();
router.post('/myroute/', bodyParser(), async (ctx, next) => {
const getMyValue = ctx.request.body.data;
}发布于 2021-09-19 12:56:51
@Kickaha:你仍然需要用multipart将bodyParser()括起来,因为默认情况下koa-body中的multipart:false,而你的代码行应该是:
router.post('/myroute/', bodyParser({multipart:true}), async (ctx, next) => {https://stackoverflow.com/questions/47943221
复制相似问题