首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用koa-body和koa-router访问节点中的POST数据

使用koa-body和koa-router访问节点中的POST数据
EN

Stack Overflow用户
提问于 2017-12-22 22:37:48
回答 3查看 3.9K关注 0票数 2

从用户代理创建ajax POST

代码语言:javascript
复制
$.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‘?

代码语言:javascript
复制
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;

}

我试过各种组合。所有对象都是未定义或空的对象。

代码语言:javascript
复制
const getMyValue = ctx.request.body

对象{}

代码语言:javascript
复制
const getMyValue = ctx.request.body.data;

未定义

代码语言:javascript
复制
const getMyValue = ctx.request.body.myResult['myValue'];

未定义

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-03 17:18:29

这里发生了几件事。

首先,您需要显式地告诉koa-body查找多部分表单数据(默认情况下是关闭的)。所以:

代码语言:javascript
复制
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标头。您的请求将如下所示:

代码语言:javascript
复制
$('#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']

票数 2
EN

Stack Overflow用户

发布于 2018-01-05 03:26:03

事实证明ajax是不必要的,所以客户端只是...

代码语言:javascript
复制
 post('/myroute', {data: myResult[myValue] });

然后koa-body被注入到路由器中,而不是首先在page作用域中实例化它。注意括号..。

代码语言:javascript
复制
const bodyParser = require('koa-body');

const router = new Router();

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

const getMyValue = ctx.request.body.data;

}
票数 1
EN

Stack Overflow用户

发布于 2021-09-19 12:56:51

@Kickaha:你仍然需要用multipart将bodyParser()括起来,因为默认情况下koa-body中的multipart:false,而你的代码行应该是:

代码语言:javascript
复制
router.post('/myroute/', bodyParser({multipart:true}), async (ctx, next) => {
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47943221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档