Kooa v 2.x中国語ドキュメント使用ガイド


ガイド
このシリーズの記事の応用例はGitHubで発表されました.koa-docs-Zh-CN.Forkが改善またはStarのフォローアップアップを支援できます.スターを歓迎します.
本ガイドがカバーするKooaテーマはAPIと直接関係がありません.例えば、ミドルウェアの最適な作り方とアプリケーション構造の提案などです.これらの例では、中間部品としてasync関数を使用しても、common FunctionまたはgeneratoFunctionを使用することができます.これはいくつかの違いがあります.
中間部品を編纂する
Koo中間体は簡単な関数であり、署名(ctx,next)を伴うMiddlewareFunctionを返す.中間部品が動作する場合、手動でnext()を呼び出して「下流」中間部品を実行しなければなりません.
例えば、X-Response-Timeヘッダフィールドを追加することによってKooa伝搬要求を追跡するにはどれぐらいの時間がかかりますか?中間部品は以下のようになります.
async function responseTime(ctx, next) {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  ctx.set('X-Response-Time', `${ms}ms`);
}

app.use(responseTime);
フロントエンド開発者であれば、next();以前の任意のコードを「キャプチャ」段階と見なすことができます.この簡易なgifは、async関数がどのようにしてスタックストリームを適切に利用して要求と応答フローを実現できるかを説明しています.
  • 追跡応答時間を作成する日付
  • 次の中間部品の制御
  • を待つ.
  • 他の日付追跡持続時間
  • を作成します.
  • 次の中間部品の制御
  • を待つ.
  • 応答本体を「ハローワールド」
  • に設定する.
  • 計算継続時間
  • 出力ログ行
  • 、応答時間を計算する
  • .
  • 設定X-Response-Timeヘッダフィールド
  • は、KKA処理応答
  • に渡す.
    次に、Kooのミドルウェアを作成するための最良の方法を紹介します.
    中間部品の最適な実践
    このセクションでは、中間部品の作成のための最適な実践を紹介します.例えば、中間部品のパラメータを受け入れたり、中間部品の名前を付けてデバッグしたりします.
    中間部品のパラメータ
    共通のミドルウェアを作成する場合、ミドルウェアを受け入れパラメータの関数にラッピングし、この約束に従ってユーザーの機能拡張を可能にするのに有用です.中間部品がどのパラメータも受け入れられなくても、統一されたままの良い方法です.
    ここで設計したloggerミドルウェアは、formatカスタム文字列を受け取り、ミドルウェア自体に戻ります.
    function logger(format) {
      format = format || ':method ":url"';
    
      return async function (ctx, next) {
        const str = format
          .replace(':method', ctx.method)
          .replace(':url', ctx.url);
    
        console.log(str);
    
        await next();
      };
    }
    
    app.use(logger());
    app.use(logger(':method :url'));
    中間部品と命名する
    中間部品の名前は選択できますが、デバッグに名前を割り当てるのに役に立ちます.
    function logger(format) {
      return async function logger(ctx, next) {
    
      };
    }
    複数の中間部品をkoa-composeと結合する
    複数のミドルウェアを単一のミドルウェアにしたい場合があります.再利用やエクスポートに便利です.koa-composeを使ってもいいです.
    const compose = require('koa-compose');
    
    async function random(ctx, next) {
      if ('/random' == ctx.path) {
        ctx.body = Math.floor(Math.random() * 10);
      } else {
        await next();
      }
    };
    
    async function backwards(ctx, next) {
      if ('/backwards' == ctx.path) {
        ctx.body = 'sdrawkcab';
      } else {
        await next();
      }
    }
    
    async function pi(ctx, next) {
      if ('/pi' == ctx.path) {
        ctx.body = String(Math.PI);
      } else {
        await next();
      }
    }
    
    const all = compose([random, backwards, pi]);
    
    app.use(all);
    中間部品に応答する
    中間部品は応答要求を決定し、下流の中間部品を迂回して簡単にnext()を省略することができることを望む.これは通常、ルーティングの中間にあるが、これは任意に実行されてもよい.例えば、以下の内容は「two」で応答しますが、いずれも実行され、下流の「three」の中間部品に応答を操作する機会が与えられます.
    app.use(async function (ctx, next) {
      console.log('>> one');
      await next();
      console.log('<< one');
    });
    
    app.use(async function (ctx, next) {
      console.log('>> two');
      ctx.body = 'two';
      await next();
      console.log('<< two');
    });
    
    app.use(async function (ctx, next) {
      console.log('>> three');
      await next();
      console.log('<< three');
    });
    以下の構成は、第二の中間部品においては、next()を省略し、依然として「two」で応答するが、第三の(及び他の任意の下流中間部品)は無視されるであろう.
    app.use(async function (ctx, next) {
      console.log('>> one');
      await next();
      console.log('<< one');
    });
    
    app.use(async function (ctx, next) {
      console.log('>> two');
      ctx.body = 'two';
      console.log('<< two');
    });
    
    app.use(async function (ctx, next) {
      console.log('>> three');
      await next();
      console.log('<< three');
    });
    最も遠い下流の中間部品がnext();を実行すると、中間部品がスタック内の任意の位置で正確に組み合わされることができるnoop関数である.
    非同期操作
    Async方法とpromiseは、Kooaの最下層から来ています.ブロックされていないシーケンスコードを作成することができます.例えば、このミドルウェアは./docsからファイル名を読み取り、bodyにマージ結果を指定する前に、各markdownファイルの内容を並列に読み出す.
    const fs = require('fs-promise');
    
    app.use(async function (ctx, next) {
      const paths = await fs.readdir('docs');
      const files = await Promise.all(paths.map(path => fs.readFile(`docs/${path}`, 'utf8')));
    
      ctx.type = 'markdown';
      ctx.body = files.join('');
    });
    コミッション
    Kooaおよび多くの構築ライブラリは、DebugからのDEBUG環境変数をサポートしており、簡単な条件記録を提供しています.
    例えば、すべてのkoaの特定のデバッグ情報を調べるには、DEBUG=koa*を通過し、起動時に使用されるミドルウェアのリストが表示されます.
    $ DEBUG=koa* node --harmony examples/simple
      koa:application use responseTime +0ms
      koa:application use logger +4ms
      koa:application use contentLength +0ms
      koa:application use notfound +0ms
      koa:application use response +0ms
      koa:application listen +0ms
    JavaScriptは実行中に関数名が定義されていないので、ミドルウェアの名前を._nameに設定することもできます.中間部品の名前をコントロールできない時に有用です.たとえば:
    const path = require('path');
    const serve = require('koa-static');
    
    const publicFiles = serve(path.join(__dirname, 'public'));
    publicFiles._name = 'static /public';
    
    app.use(publicFiles);
    現在、デバッグ時に「serve」だけではなく、Now、instead of just seeing「serve」when debuggging、you will seeを見ることができます.
      koa:application use static /public +0ms
    この文章があなたのために役に立ったら、以下の点に感謝します.Star GitHub:koa-docs-Zh-CSNサポート、ありがとうございます.