ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js の Koa フレームワークの詳細

Node.js の Koa フレームワークの詳細

青灯夜游
青灯夜游転載
2021-06-16 10:08:392889ブラウズ

この記事では、Node.js の Koa フレームワークについて詳しく説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Node.js の Koa フレームワークの詳細

前回の記事では、Express フレームワークを簡単に理解し、それを使用してじゃんけんゲームを変革しました。フレームワークと Express フレームワーク。その後、Koa フレームワークを使用してじゃんけんゲームを変革します。 [推奨学習: "nodejs チュートリアル "]

Koa

Koa は、Express の設計上の欠陥を解決するために生まれました。そのミドルウェアは async 関数を通じて記述できます。await next() はミドルウェアの実行を中断し、後続のすべてのミドルウェアが実行されるまで待ってから実行できます。オニオン モデルは await next() を通じて実装できます。

もう 1 つの機能は、リクエストとレスポンスの処理が簡略化されていることです。両方とも ctx にマウントされて使用されます。返されたコンテンツは、次のような直接割り当てを通じて使用することもできます: ctx.response.body = fs .createStream (「really_large.xml」)。

さらに、Koa はミドルウェアによって実装されているルーティング機能を省略しており、これはマイクロカーネルのミニマリズム的な考え方です。

コア関数 (Koa のドキュメント ):

  • Express よりもさらに極端なリクエスト/レスポンスの簡素化、たとえば:
    • ctx.status = 200
    • ctx.body = 'hello node'
  • async 関数を使用して実装されたミドルウェア。
  • 「実行を一時停止」する機能があります。
  • 非同期状況ではオニオン モデルにも準拠します。
  • カーネルを合理化し、すべての追加機能をミドルウェアに移動します。

Koa はじゃんけんゲームを変革します

同様に、game.js ゲーム モジュールとindex.html ページのコードは変更されていません。依存関係パッケージをインストールする必要があります: koa および koa-mount (npm i koa koa-mount)

koa-mount は他のアプリケーションをミドルウェアとしてマウントできます mount() 関数に渡されるパス パラメーターは一時的にスタックが解放されるまで URL から削除されます。どのパスが使用されるかに関係なく、正しく機能するアプリまたはミドルウェア全体を作成する場合に役立ちます。ミドルウェアを特定のパスにマウントし、ミドルウェアはこのパスとは独立して動作します。

index.js コード変換:

// 加载模块
const fs = require('fs');
const koa = require('koa');
const mount = require('koa-mount');

const game = require('./game');
let playerWon = 0; // 赢的次数

const app = new koa();
// 精简内核,所有额外功能都移到中间件里实现。路由使用通过 mount 的中间件实现的
// 通过 mount() 把中间件挂载到一个特定的路径上,中间件独立于这个路径动作。 
// /favicon.ico 路径的路由
app.use(
  mount('/favicon.ico', function (ctx) {
    // 对 `request` 和 `response` 的处理简化了,这两者都挂载在 `ctx` 上使用,返回的内容也可以通过直接赋值来使用
    ctx.status = 200;
    return;
  })
)
// mount中不可以跟多个函数中间件,可以通过 new koa() 来挂载在 koa 上:
const gameKoa = new koa();
app.use(
  mount('/game', gameKoa)
)
// 分离模块
gameKoa.use(
  async function (ctx, next) {
    if (playerWon >= 3) {
      // response.status(500);
      // response.send('我不会再玩了!');
      // 使用 = 赋值,更加简化了
      ctx.status = 500;
      ctx.body = '我不会再玩了!';
      return;
    }
    // 通过next执行后续中间件
    await next();
    // 当后续中间件执行完之后,会执行到这个位置
    if (ctx.playerWon) {
      playerWon++;
    }
  }
)
// 在 koa 里可以使用 async function 和 await next() 来执行异步中间件
// 使在异步的情况下也符合洋葱模型。
gameKoa.use(
  async function (ctx, next) {
    const query = ctx.query;
    const playerAction = query.action;
    if (!playerAction) {
      ctx.status = 400;
      return;
    }
    ctx.playerAction = playerAction;
    await next();
  }
)
// 异步处理,500ms后才返回结果
gameKoa.use(
  async function (ctx, next) {
    const playerAction = ctx.playerAction;
    const result = game(playerAction);
    // 对于一定需要在请求主流程里完成的操作,一定要使用await进行等待
    // 否则koa就会在当前事件循环就把http response返回出去了
    await new Promise(resolve => {
      setTimeout(() => {
        ctx.status = 200;
        if (result == 0) {
          ctx.body = '平局'
        } else if (result == -1) {
          ctx.body = '你输了'
        } else {
          ctx.body = '你赢了'
          ctx.playerWon = true;
        }
        resolve();
      }, 500)
    })
  }
)
// 打开页面 index.html
app.use(
  mount('/', function (ctx) {
    ctx.body = fs.readFileSync(__dirname + '/index.html', 'utf-8')
    return;
  })
)
// 监听端口 3000
app.listen(3000);

Express VS Koa

  • Express はしきい値が低く、Koa はより強力でエレガントです。
  • Express はより多くのものをカプセル化し、より速く開発し、Koa はよりカスタマイズ可能です。

どちらが「良い」で、どちらが「悪い」のでしょうか?

  • 実際には、フレームワーク間に良いか悪いかの区別はありません
  • フレームワークが異なれば、適用可能なシナリオも異なります

プログラミング関連の知識について詳しくは、こちらをご覧ください。アクセス: プログラミングビデオ! !

以上がNode.js の Koa フレームワークの詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。