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

时间:2017-12-22 14:37:48

标签: node.js ajax post koa2

从用户代理进行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'];

未定义

2 个答案:

答案 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;

}