Node.js 使用koa主体和koa路由器访问节点中的POST数据
从用户代理制作ajax文章Node.js 使用koa主体和koa路由器访问节点中的POST数据,node.js,ajax,post,koa2,Node.js,Ajax,Post,Koa2,从用户代理制作ajax文章 $.ajax({ type: 'POST', url: 'https://mysub.domain.dev/myroute', headers: { 'X-Requested-With': 'XMLHttpRequest' }, contentType: 'application/octet-stream; charse
$.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']
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'];
未定义的这里发生了两件事
const getMyValue = ctx.request.body.myResult['myValue'];
首先,您需要显式地告诉koa body
查找多部分表单数据(默认情况下是关闭的)。因此:
其次,在客户端中,您可能需要设置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
可能不适合您的用例,它只是一个方便的演示。假设这是一个文件,很可能您可以简单地使用数据:myresult['myValue']
。结果表明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;
}
谢谢,这很有道理。一旦我有机会实现,我就会接受。事实证明,我需要的是删除行“body=bodyParser()”并在路由器中的body()中添加括号。我的用例也不需要ajax。我将在另一个答复中澄清。谢谢你的帮助!