ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejs の「オニオン モデル」の詳細な分析

Nodejs の「オニオン モデル」の詳細な分析

青灯夜游
青灯夜游転載
2021-05-07 10:29:554089ブラウズ

この記事では、Nodejs の「オニオン モデル」について説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Nodejs の「オニオン モデル」の詳細な分析

現在、より人気のある Node.js フレームワークには、Express、KOA、Egg.js があり、次に、別の新しい TypeScript 関連フレームワークである Nest.js が続きます。 js フレームワークはミドルウェアに基づいて実装されており、ミドルウェア (クラスまたは関数モジュールとして理解できます) の実行メソッドはオニオン モデルに基づいている必要があります

推奨される学習: " nodejs チュートリアル>>

1. タマネギ モデル

タマネギが一度に 1 層ずつ包まれていることは誰もが知っていますが、ここではその 3 次元については見ていません。玉ねぎを切る必要がありますが、写真のように切断面から見ると、

Nodejs の「オニオン モデル」の詳細な分析

中心を通るようになっているのがわかります。玉ねぎの皮を中心点に向かって層ごとに浸透させ、中心点から外側に向かって層ごとに皮を浸透させていくのですが、ここには特徴があります。出るときは何層もの皮膚を貫通しなければなりません。最初に表皮を貫通し、次に表皮から出ることは、いわゆるスタック リスト (先入れ後出し) の原則に従います。

2. オニオン モデルと Node の関係

現在、より人気のある Node.js フレームワークには、Express、KOA、Egg.js などがあります。ミドルウェアに基づいています これを実現するには、ミドルウェア (クラスまたは関数モジュールとして理解できます) の実行メソッドがオニオン モデルに基づいている必要があります。

オニオンの皮をミドルウェアとして考えることができます:

外側から内側への処理はキーワード next();

ですが、内側から外側への処理とは各ミドルウェアが実行された後、ミドルウェアの元の上位層から最外層まで。

3. ミドルウェアの実行

Express を例として、ミドルウェアの基本的な実行プロセスは次のとおりです:

Nodejs の「オニオン モデル」の詳細な分析Nodejs の「オニオン モデル」の詳細な分析

Koa は Express をベースに同じチームによって開発された次世代ノード フレームワークです。この 2 つの主な違いは次のとおりです:

  • Express はカプセル化されており、多くの組み込みミドルウェアがあり、 Connect や Router などの機能を備えているのに対し、KOA は比較的軽量であり、開発者は独自のニーズに応じてフレームワークをカスタマイズできます。
  • Express はミドルウェアを処理するコールバックに基づいており、KOA は await/async に基づいています。
  • 「ミドルウェアを非同期で実行する場合、Express はオニオン モデルに厳密に従ってミドルウェアを実行しませんが、KOA は厳密にオニオン モデルに従います (ミドルウェアが非同期関数である場合、2 つのプロセスが異なることを反映しています)。

オニオン モデルの実行に関する Express と KOA の違いの紹介 :

私たちは、元の 3 つのモデルを保持します。上記のコード例ミドルウェアを追加し、2 と 3 の間に新しい非同期ミドルウェア を挿入します。コードは次のとおりです。

(1) Express

/**
 * 异步中间件
 */
app.use(async (req, res, next) => {
    console.log('async');
    await next();
    await new Promise(
        (resolve) => 
            setTimeout(
                () => {
                    console.log(`wait 1000 ms end`);
                    resolve()
                }, 
            1000
        )
    );
    console.log('async end');
});

と次のミドルウェア 1 メソッド:

/**
 * 中间件 1
 */
app.use(async (req, res, next) => {
    console.log('first');
    await next();
    console.log('first end');
});

Rerun に示すように、他のミドルウェアは next() メソッドを待つように変更されています。最終的な出力結果は次のとおりです:

Nodejs の「オニオン モデル」の詳細な分析

Out が表示されます。外側から内側に呼び出すのが正常で、レイヤーごとに呼び出しが行われます。内側から外側に行くときに、いくつかの変更が発生します。主な理由は、

非同期ミドルウェアが実行結果を出力しないことです。注文###。

(2) Koa

上記のコード シーケンスを維持し、対応する Express 構文のみを koa 構文に変更します。ミドルウェア 1 および非同期ミドルウェアのコード部分は次のとおりです。

const Koa = require('koa');
const app = new Koa();
/**
 * 中间件 1
 */
app.use(async (ctx, next) => {
    console.log('first');
    await next();
    console.log('first end');
});
/**
 * 异步中间件
 */
app.use(async (ctx, next) => {
    console.log('async');
    await next();
    await new Promise(
        (resolve) => 
            setTimeout(
                () => {
                    console.log(`wait 1000 ms end`);
                    resolve()
                }, 
            1000
        )
    );
    console.log('async end');
});
再実行すると、最終出力は次のようになります:

Nodejs の「オニオン モデル」の詳細な分析KOA がオニオン モデルの実行を上から下まで厳密に従っていることがわかります。 、タマネギの内側から外側に向かって、最初、二番目、非同期、三番目を出力し、次に内側から外側に 3 番目の端、非同期端、2 番目の端、および 1 番目の端を出力します。

プログラミング関連の知識について詳しくは、

プログラミング教育

をご覧ください。 !

以上がNodejs の「オニオン モデル」の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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