Javascript 如何用Koa解析多个部分/表格数据体?

Javascript 如何用Koa解析多个部分/表格数据体?,javascript,koa,body-parser,Javascript,Koa,Body Parser,因为我花了一些(太多)时间来理解这个简单的需求。我在这里记录实现多部分/窗体数据< /COD>与Koa进行体分析的方法。 在我的案例中,造成混乱的原因是可供选择的备选方案的数量: 我想找到最简约/最接近express/koa/node的做事方式/哲学 就是这样。在下面以公认的回答。希望这有帮助。您必须按照官方声明使用 因此,简单的设置如下所示: const koa = require('koa'); const multer = require('koa-multer'); con

因为我花了一些(太多)时间来理解这个简单的需求。我在这里记录实现<代码>多部分/窗体数据< /COD>与Koa进行体分析的方法。

在我的案例中,造成混乱的原因是可供选择的备选方案的数量:

我想找到最简约/最接近
express/koa/node
的做事方式/哲学

就是这样。在下面以公认的回答。希望这有帮助。

您必须按照官方声明使用

因此,简单的设置如下所示:

const koa = require('koa');
const multer = require('koa-multer');

const app = koa();

app.use(multer());

app.use(function *() {
  this.body = this.req.body;
});
几点注意:

  • Multer将只解析类型为
    multipart/formdata
  • 注意使用
    this.req.body
    而不是Koa的增压
    this.request
    (不确定这是否是有意的,但肯定会令人困惑…我希望解析的
    body
    可以在
    this.request
    上使用)
并将此HTML表单发送为:


我进行了与您相同的调查,这里还有其他方法来实现<代码>多部分/窗体数据< /代码>与Koa的体分析。

共营业员

var koa = require('koa');
var parse = require('co-busboy');

const app = koa();

app.use(function* (next) {
  // the body isn't multipart, so busboy can't parse it 
  if (!this.request.is('multipart/*')) return yield next;

  var parts = parse(this),
      part,
      fields = {};
  while (part = yield parts) {
    if (part.length) {
      // arrays are busboy fields 
      console.log('key: ' + part[0]);
      console.log('value: ' + part[1]);

      fields[part[0]] = part[1];
    } else {
      // it's a stream, you can do something like:
      // part.pipe(fs.createWriteStream('some file.txt'));
    }
  }

  this.body = JSON.stringify(fields, null, 2);
})
var koa = require('koa');
var router = require('koa-router');
var koaBody = require('koa-body')({ multipart: true });

const app = koa();

app.use(router(app));

app.post('/', koaBody, function *(next) {
  console.log(this.request.body.fields);

  this.body = JSON.stringify(this.request.body, null, 2);
});
koa机构

var koa = require('koa');
var parse = require('co-busboy');

const app = koa();

app.use(function* (next) {
  // the body isn't multipart, so busboy can't parse it 
  if (!this.request.is('multipart/*')) return yield next;

  var parts = parse(this),
      part,
      fields = {};
  while (part = yield parts) {
    if (part.length) {
      // arrays are busboy fields 
      console.log('key: ' + part[0]);
      console.log('value: ' + part[1]);

      fields[part[0]] = part[1];
    } else {
      // it's a stream, you can do something like:
      // part.pipe(fs.createWriteStream('some file.txt'));
    }
  }

  this.body = JSON.stringify(fields, null, 2);
})
var koa = require('koa');
var router = require('koa-router');
var koaBody = require('koa-body')({ multipart: true });

const app = koa();

app.use(router(app));

app.post('/', koaBody, function *(next) {
  console.log(this.request.body.fields);

  this.body = JSON.stringify(this.request.body, null, 2);
});
在这两种情况下,您都会得到如下响应:

{
  "topsecret": 1,
  "area51": {
    "lat": "37.235065",
    "lng": "-115.811117",
  }
}
但就个人而言,我更喜欢koa body的工作方式。此外,它还与其他中间件(如)兼容

此外,如果您指定koa正文的上载目录,它将为您保存上载的文件:

var koaBody = require('koa-body')({
  multipart: true,
  formidable: { uploadDir: path.join(__dirname, 'tmp') }
});
例如,您可以使用其他不支持承诺异步/等待的解决方案

文档中的示例:

import asyncBusboy from 'async-busboy';

// Koa 2 middleware
async function(ctx, next) {
  const {files, fields} = await asyncBusboy(ctx.req);

  // Make some validation on the fields before upload to S3
  if ( checkFiles(fields) ) {
    files.map(uploadFilesToS3)
  } else {
    return 'error';
  }
}

我有三个适合我的解决方案:

  • koa body,注意它仅使用
    multipart:true
    选项解析
    multipart/form数据
  • <代码> const膝关节炎=要求(“膝关节”); const koaBody=require('koa-body'); const Router=require('koa-Router'); const-app=新Koa(); const router=新路由器(); app.use(koaBody({multipart:true})); router.post('/',异步ctx=>{ const body=ctx.request.body; //一些代码。。。 }); app.use(router.routes()); app.listen(3000);
  • koa bodyparser,仅使用前面的
    koa2
    中间件解析
    多部分/表单数据
  • <代码> const膝关节炎=要求(“膝关节”); const bodyParser=require('koa-bodyParser'); 常量强大=需要(“koa2-强大”); const Router=require('koa-Router'); const-app=新Koa(); const router=新路由器(); app.use(可怕的()); app.use(bodyParser()); router.post('/',异步ctx=>{ const body=ctx.request.body; //一些代码。。。 }); app.use(router.routes()); app.listen(3000);
  • @koa/multer,注意只有在安装了
    multer
    软件包时,它才会解析
    多部分/表单数据。另外请注意,
    koa multer
    已被弃用,请勿使用

  • 实际上,我在
    上解析了not available中的body。request
    。只是提醒大家,当前维护的fork是用于autoFields的。var parts=await asyncBusboy(ctx.req,{autoFields:true//将字段保存到parts.field});使用函数*(下一步)时如何使用async Wait?异步函数*(下一步)给出404
    const Koa = require('koa');
    const Router = require('koa-router');
    const multer = require('@koa/multer');
    
    const app = new Koa();
    const router = new Router();
    const upload = multer(); // you can pass options here
    
    app.use(upload.any());
    
    router.post('/', async ctx => {
        const body = ctx.request.body;
        // some code...
    });
    
    app.use(router.routes());
    
    app.listen(3000);