javascript - ファイル - multipart/form-data 受け取り




Koaを使ってマルチパート/フォームデータ本体を解析する方法 (2)

Koa2では、他の解決策が約束をサポートしていないかasync / awaitとしてasync-busboyを使用できます。

ドキュメントからの例:

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を使用してmultipart/form-data本体の解析を実現する方法を文書化しています。

私の場合、混乱の原因はそこで利用可能な代替案の数です。

そして、私は物事のことをexpress/koa/node way /哲学に最も近いミニマリスト/を見つけたいと思いました。

だからここにあります。 以下。 受け入れられた答えで。 お役に立てれば。


あなたは、公式のKoa wikiに koa-multerれているように、 koa-multerを使わなければなりません。

したがって、簡単な設定は次のようになります。

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/form-data型のリクエストの本文のみを解析しmultipart/form-data
  • コアのsupercharged this.requestの代わりにthis.req.bodyを使用していることに注意しthis.request (これが意図的なものであるかどうかはthis.requestませんが、これは間違いなく混乱します...解析済みのbodythis.requestで使用可能になるとthis.requestます...)

そして、このHTMLフォームをFormDataとして送信します。

<form>
  <input type="hidden" name="topsecret" value="1">
  <input type="text" name="area51[lat]" value="37.235065">
  <input type="text" name="area51[lng]" value="-115.811117">
  ...
</form>

期待通りにネストしたプロパティにアクセスできるようになります。

// -> console.log(this.req.body)
{
  "topsecret": 1,
  "area51": {
    "lat": "37.235065",
    "lng": "-115.811117",
  }
}




body-parser