Nodeサーバ、koaのミドルウェアkoa-body、nodeファイルアップロード、FormData上

21292 ワード

なぜkoa-bodyを使うのですか?
XMLHttpRequest 2から送信されるFormDataデータを使用する場合、koaサービスではkoa-bodyのほか、busboy、body-parse、multer、formidable、multipartyが正しく取得できないことも、テストで発見された問題です.
koa-body
koaミドルウェアは、機能的なリクエストボディ解析器です.Multipart、urlencoded、jsonリクエストボディをサポートします.ExpressのbodyParser、multerと同様の機能を提供します.
プロジェクト内インストール
npm install koa-bodyまたはyarnadd koa-body
サポート要求タイプ
  • multipart/form-data
  • application/x-www-urlencoded
  • application/json

  • 基本使用例
    const Koa = require('koa');
    const koaBody = require('koa-body');
    const app = new Koa();
    app.use(koaBody());
    app.use(ctx => {
          //            
      console.log(`files:${
           util.inspect(ctx.request.body.fields)}; body:${
           util.inspect(ctx.request.body.files)}`);
      ctx.body = ctx.request.body;
    });
    app.listen(3000);
    
  • 要求例および結果
  • $ node index.js
    $ curl -i http://localhost:3000/users -d "name=test"
    HTTP/1.1 200 OK
    Content-Type: text/plain; charset=utf-8
    Content-Length: 29
    Date: Wed, 03 May 2017 02:09:44 GMT
    Connection: keep-alive
    
    //        
    Request Body: {
         "name":"test"}%
    

    詳細については、以下を参照してください.https://github.com/dlau/koa-body/blob/master/examples/multipart.js

    コンビネーションkoa-router使用例
    通常、必要に応じて本体を解析するのが望ましいが、ミドルウェアの組み合わせをサポートするルータを使用すると、一部のルーティングにのみ本体を注入することができる.
    const Koa = require('koa');
    const app = new Koa();
    const router = require('koa-router')();
    const koaBody = require('koa-body');
    router.post('/users', koaBody(),(ctx) => {
          //            
      console.log(`files:${
           util.inspect(ctx.request.body.fields)}; body:${
           util.inspect(ctx.request.body.files)}`);
      ctx.body = ctx.request.body;
    });
    app.use(router.routes());
    app.listen(3000);
    //        
    console.log('curl -i http://localhost:3000/users -d "name=test"');
    

    optionsパラメータ
    koa-bodyのオプションに使用できます.4つのカスタムオプションがあり、その他はraw-bodyとformidableから来ています.
  • koa-bodyパラメータ
  • パラメータ名
    説明
    を選択します.
    デフォルト
    patchNode
    ctxにパッチを書き込む.reqノードで
    Boolean
    false
    patchKoa
    ctxにパッチを書き込む.requestノード
    Boolean
    true
    jsonLimit
    JSONデータ体のサイズ制限
    String/Integer
    1mb
    formLimit
    フォームリクエストのサイズを制限
    String/Integer
    56kb
    textLimit
    text bodyのサイズを制限する
    String/Integer
    56kb
    encoding
    フォームのデフォルトエンコーディング
    String
    utf-8
    multipart
    Multipart-formdateのフォームがサポートされているかどうか
    Boolean
    false
    urlencoded
    urlencodedのフォームをサポートするかどうか
    Boolean
    true
    text
    text/plainのフォームを解析するかどうか
    Boolean
    true
    json
    jsonリクエストボディを解析するかどうか
    Boolean
    true
    jsonStrict
    json厳格モードを使用するかどうか、trueは配列とオブジェクトのみを処理します.
    Boolean
    true
    formidable
    Multipartに関するオプションの詳細設定
    Object
    onError
    エラー処理
    Function
    stict
    厳格モード、有効にした後にGET、HEAD、DELETE要求を解析しません
    Boolean
    true
  • formidableパラメータ
  • パラメータ名
    説明
    を選択します.
    デフォルト
    maxFields
    フィールド数の制限
    Integer
    1000
    maxFieldsSize
    制限フィールドの最大値
    Integer
    2mb (2 * 1024 * 1024)
    uploadDir
    ファイルアップロードフォルダの設定
    String
    os.tmpDir()
    keepExtensions
    元のファイル接尾辞を保持
    Boolean
    false
    hash
    受信ファイルの検証を計算する場合は、「sha 1」または「md 5」に設定します.
    String
    false
    multipart
    マルチファイルアップロードをサポートするかどうか
    Boolean
    true
    onFileBegin
    開始時にファイルを特殊にコールバックします.ディスクにファイルを保存する前にファイルの名前を変更するなど
    Function
  • formidableのonFileBegin
  • 詳細については、以下を参照してください.https://github.com/felixge/node-formidable#filebegin

    厳格モードの説明について
    詳細については、以下を参照してください.http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-19#section-6.3
  • GET、HEAD、およびDELETE要求は、要求体に意味を定義していないが、これは、いくつかの例で無効であることを意味しない.
  • デフォルトでは、koa-bodyは厳格モード
  • です.
    プロジェクト構成事例
    const Koa = require('koa');
    const bodyparse = require('koa-body');
    const app = new Koa();
    const path = require('path');
    const util = require('util');
    /**
     *      
     * @links: https://github.com/dlau/koa-body
     *       ,  post、get   ,     (raw  )         ctx.files ctx.body 
     */
    app.use(
      bodyparse({
         
        multipart: true, //       
        formidable: {
         
          uploadDir: path.join(__dirname, 'public/upload/'), //         
          keepExtensions: true, //        
          maxFieldsSize: 2 * 1024 * 1024, //       ,  2M
          onFileBegin: (name, file) => {
          //         
            const fp = path.join(__dirname, 'public/upload/');
            if (!fs.existsSync(fp)) {
          //      “public/upload/”   
              fs.mkdirSync(fp); //      
            }
            console.log(`bodyparse: name:${
           name}; file:${
           util.inspect(file)}`);
          }
        }
      })
    );
    app.use(ctx => {
         
      /* body    ,  :
      { 
          fields: { lessonid: '1', bookid: '1', folder: 'gxkt/audio', parse: '1' },
          files: { audioData:
             File {
               domain: null,
               _events: {},
               _eventsCount: 0,
               _maxListeners: undefined,
               size: 47830,
               path: 'E:\\Prj\
    uoya\\upload\\temp\\upload_066afb801e15d501aa2d7b144a394a57', name: 'blob', type: 'audio/wav', hash: null, lastModifiedDate: 2018-12-05T06:02:31.049Z, _writeStream: [Object] } } } */
    console.log(`files:${ util.inspect(ctx.request.body.fields)}; body:${ util.inspect(ctx.request.body.files)}`); ctx.body = ctx.request.body; }); app.listen(3000);

    koa-body公式ドキュメント
    詳細については、以下を参照してください.https://github.com/dlau/koa-body