ホームページ ウェブフロントエンド jsチュートリアル Express と koa ミドルウェア パターンの違いと関連性を比較する

Express と koa ミドルウェア パターンの違いと関連性を比較する

Aug 11, 2017 am 10:08 AM
express ミドルウェア 比較した

この記事では、Express と koa ミドルウェア モードの詳細な比較を主に紹介しています。編集者が非常に優れていると考えたので、参考として共有します。エディターをフォローして見てみましょう

原因

私は最近koaの使い方を勉強しています。koaはかなり基本的なWebフレームワークなので、完全なWebアプリケーションに必要なもののほとんどが次の形式で紹介されています。 koa-router、koa-view などのミドルウェアのこれは koa のドキュメントに記載されています。koa のミドルウェア モデルは、express のモデルとは異なります。なぜそうなるのかについては、インターネット上の多くの記事で詳細な分析が行われていません。簡単に言えば、async/await の特性です。この発言が正しいか間違っているかについては、私にとってはまだ曖昧すぎます。そこで、ソース コードを通じて 2 つのミドルウェア実装の原理と使用法の類似点と相違点を分析することにしました。

簡単のため、ここでのexpressはconnectに置き換えられます(実装原理は同じです)

使い方

どちらも公式サイト(github)のドキュメントに準じます

connect

以下は公式 Web サイトの使用法:


var connect = require('connect');
var http = require('http');

var app = connect();

// gzip/deflate outgoing responses
var compression = require('compression');
app.use(compression());

// store session state in browser cookie
var cookieSession = require('cookie-session');
app.use(cookieSession({
 keys: ['secret1', 'secret2']
}));

// parse urlencoded request bodies into req.body
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: false}));

// respond to all requests
app.use(function(req, res){
 res.end('Hello from Connect!\n');
});

//create node.js http server and listen on port
http.createServer(app).listen(3000);
ログイン後にコピー

ドキュメントによると、connect は単純なルーティング機能を提供していることがわかります:


app.use('/foo', function fooMiddleware(req, res, next) {
 // req.url starts with "/foo"
 next();
});
app.use('/bar', function barMiddleware(req, res, next) {
 // req.url starts with "/bar"
 next();
});
ログイン後にコピー

connect のミドルウェアは次のミドルウェアを検索し続けます。このモードは、ミドルウェアが一連の配列であり、ルート マッチングによって対応するルートを見つける処理方法がミドルウェアであることを理解しやすいです。実際、connect もこの方法で実装されています。

app.use は、新しいミドルウェアをミドルウェア配列に挿入することです。ミドルウェアの実行はプライベート メソッド app.handle に依存して処理され、同じ原則が Express にも適用されます。

koa

koa のミドルウェア モデルは、connect と比べるとそれほど直感的ではありません。インターネットから図を借りて表現してみましょう。

つまり、koa はミドルウェアを処理した後に戻ってきます。より大きな操作領域を提供するために、koa の公式 Web サイトの例を見てみましょう:


const Koa = require('koa');
const app = new Koa();

// x-response-time

app.use(async (ctx, next) => {
 const start = Date.now();
 await next();
 const ms = Date.now() - start;
 ctx.set('X-Response-Time', `${ms}ms`);
});

// logger

app.use(async (ctx, next) => {
 const start = Date.now();
 await next();
 const ms = Date.now() - start;
 console.log(`${ctx.method} ${ctx.url} - ${ms}`);
});

// response

app.use(async ctx => {
 ctx.body = 'Hello World';
});

app.listen(3000);
ログイン後にコピー

明らかに、koa 処理ミドルウェアが await next() に遭遇すると、現在のミドルウェアを一時停止し、次のミドルウェアを処理します。最後に、戻って残りのタスクの処理を続けます。複雑な言い方ですが、直感的には、これはコールバック関数ではないかという感覚が得られます。ここでは具体的な実装方法については触れませんが、これは確かにコールバック関数です。 async/await の機能とは何の関係もありません。

ソースコードの簡単な分析

Connect と koa ミドルウェア モードの主な違いは、next の実装にあります。この 2 つの間の next の実装を簡単に見てみましょう。

connect

connect のソースコードは非常に小さく、コメントも含めて約 200 行だけですが、connect ミドルウェアの処理はプライベート メソッド proto.handle にあり、next もここに実装されています


// 中间件索引
var index = 0
function next(err) {


 // 递增
 var layer = stack[index++];

 // 交由其他部分处理
 if (!layer) {
  defer(done, err);
  return;
 }

 // route data
 var path = parseUrl(req).pathname || '/';
 var route = layer.route;

 // 递归
 // skip this layer if the route doesn't match
 if (path.toLowerCase().substr(0, route.length) !== route.toLowerCase()) {
  return next(err);
 }

 // call the layer handle
 call(layer.handle, route, err, req, res, next);
 }
ログイン後にコピー

難読化されたコードを削除した後、次の実装も非常に単純であることがわかります。ミドルウェアを探す再帰呼び出しシーケンス。次に電話をかけ続けます。コードは非常に単純ですが、このアイデアは学ぶ価値があります。

ここで行われるのは、サードパーティの処理方法です。サブアプリとルーティングを扱う他の部分は削除されました。重要ではありません

koa

koa は next の実装を別のパッケージに分離しています。コードはより単純ですが、一見より複雑な関数を実装しています


function compose (middleware) {
 return function (context, next) {
 // last called middleware #
 let index = -1
 return dispatch(0)
 function dispatch (i) {
  index = i
  try {
  return Promise.resolve(fn(context, function next () {
   return dispatch(i + 1)
  }))
  } catch (err) {
  return Promise.reject(err)
  }
 }
 }
}
ログイン後にコピー

上記で処理されたコードを見ると、まだ学生もいるかもしれません。それに気づかない。

それでは、処理を続けてみましょう:


function compose (middleware) {

 return function (context, next) {
 // last called middleware #
 let index = -1
 return dispatch(0)
 function dispatch (i) {
  index = i
  let fn = middleware[i]
  if (i === middleware.length) {
  fn = next
  }
  if (!fn) return
  return fn(context, function next () {
  return dispatch(i + 1)
  })
 }
 }
}
ログイン後にコピー

このように、プログラムはより単純になり、async/awaitとは何の関係もありません。結果を見てみましょう


var ms = [
 function foo (ctx, next) {
 console.log('foo1')
 next()
 console.log('foo2')
 },
 function bar (ctx, next) {
 console.log('bar1')
 next()
 console.log('bar2')
 },
 function qux (ctx, next) {
 console.log('qux1')
 next()
 console.log('qux2')
 }
]

compose(ms)()
ログイン後にコピー

上記のプログラムを実行できます。

foo1
bar1
qux1
qux2
bar2
foo2

というシーケンスの出力も、koa のいわゆるオニオン モデルであることがわかります。この時点で、koa のミドルウェア モデルには何もないという結論を導くことができます。 async またはジェネレーターとの関係 実際の関係は、koa が非同期の優先順位を強調していることです。いわゆるミドルウェアの一時停止は、コールバック関数によってのみ発生します (私の意見では、promise.then とコールバックの間に違いはなく、async/await もコールバックの一種です)。

以上がExpress と koa ミドルウェア パターンの違いと関連性を比較するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

徹底した比較: Vivox100 と Vivox100Pro、どちらを購入する価値がありますか? 徹底した比較: Vivox100 と Vivox100Pro、どちらを購入する価値がありますか? Mar 22, 2024 pm 02:06 PM

今日のスマートフォン市場では、消費者はますます多くの選択肢に直面しています。技術の継続的な発展に伴い、携帯電話メーカーはますます多くのモデルやスタイルを発売していますが、その中でも Vivox100 と Vivox100Pro は間違いなく大きな注目を集めている 2 つの製品です。どちらの携帯電話も有名ブランド Vivox の製品ですが、機能、性能、価格に一定の違いがあるため、この 2 つの携帯電話を比較した場合、どちらを購入する価値があるでしょうか? Vivox100 と Vivox100Pro では外観デザインに明らかな違いがあります

SOLコインとBCHコインではどちらの方が可能性が高いでしょうか? SOLコインとBCHコインの違いは何ですか? SOLコインとBCHコインではどちらの方が可能性が高いでしょうか? SOLコインとBCHコインの違いは何ですか? Apr 25, 2024 am 09:07 AM

現在、通貨サークルが好む潜在的なコインには、SOL コインと BCH コインが含まれます。SOL は、Solana ブロックチェーン プラットフォームのネイティブ トークンであり、ビットコインのフォーク通貨である BitcoinCash プロジェクトのトークンです。技術的特徴、応用シナリオ、開発の方向性が異なるため、投資家にとってSOL通貨とBCHのどちらがより可能性があるかを分析したいと思います。また投資しましょう。ただし、通貨の比較には、市場、開発見通し、プロジェクトの強みなどに基づいた包括的な分析が必要です。続いて編集者が詳しくお伝えします。 SOLコインとBCHではどちらの可能性が高いでしょうか?比較すると、SOL 通貨のほうがより大きな可能性を持っています。SOL 通貨と BCH のどちらがより大きな可能性を持っているかを判断するのは、多くの要因に依存するため、複雑な問題です。

Windows 10 と Windows 11 のパフォーマンス比較: どちらが優れていますか? Windows 10 と Windows 11 のパフォーマンス比較: どちらが優れていますか? Mar 28, 2024 am 09:00 AM

Windows 10 と Windows 11 のパフォーマンス比較: どちらが優れていますか?テクノロジーの継続的な開発と進歩により、オペレーティング システムは常に更新され、アップグレードされます。世界最大のオペレーティング システム開発者の 1 つとして、Microsoft の Windows シリーズ オペレーティング システムは常にユーザーから大きな注目を集めてきました。 2021 年、Microsoft は Windows 11 オペレーティング システムをリリースし、広範な議論と注目を引き起こしました。では、Windows 10 と Windows 11 のパフォーマンスの違いは何でしょうか?

Huawei、ZTE、Tmall、Xiaomi TVボックスの比較 Huawei、ZTE、Tmall、Xiaomi TVボックスの比較 Feb 02, 2024 pm 04:42 PM

TVボックスは、インターネットとテレビを接続する重要なデバイスとして、近年ますます人気が高まっています。スマート TV の人気に伴い、消費者は Tmall、Xiaomi、ZTE、Huawei などの TV ボックス ブランドをますます好むようになっています。読者が自分に最適な TV ボックスを選択できるように、この記事ではこれら 4 つの TV ボックスの機能と利点を詳しく比較します。 1. Huawei TV Box: スマートなオーディオビジュアル体験は優れており、スムーズな視聴体験を提供できます. Huawei TV Box は強力なプロセッサーと高解像度の画質を備えています。オンラインビデオ、内蔵のリッチアプリケーション、音楽、ゲームなど、さまざまなオーディオおよびビデオ形式をサポートします。 Huawei TVボックスには音声制御機能もあり、操作がより便利になります。携帯電話のコンテンツをテレビ画面に簡単にキャストできます。ワンクリックでキャストできます。

Vivox100とVivox100Proの比較評価:どちらが好みですか? Vivox100とVivox100Proの比較評価:どちらが好みですか? Mar 22, 2024 pm 02:33 PM

Vivox100とVivox100Proの比較評価:どちらが好みですか?スマートフォンの人気が高まり、高性能になるにつれて、携帯電話アクセサリに対する人々の需要も高まっています。ヘッドフォンは携帯電話アクセサリの不可欠な部分として、人々の日常生活や仕事において重要な役割を果たしています。数あるヘッドホンブランドの中でも、Vivox100とVivox100Proは注目を集めている2つの製品です。今日は、これら 2 つのヘッドフォンの長所と短所を詳細に比較評価します。

Go言語と他のプログラミング言語の性能比較とメリット・デメリット Go言語と他のプログラミング言語の性能比較とメリット・デメリット Mar 07, 2024 pm 12:54 PM

タイトル: Go 言語と他のプログラミング言語のパフォーマンスの比較、長所と短所 コンピューター技術の継続的な発展に伴い、プログラミング言語の選択はますます重要になってきており、その中でもパフォーマンスは重要な考慮事項です。この記事では、Go 言語を例として、そのパフォーマンスを他の一般的なプログラミング言語と比較し、それぞれの長所と短所を分析します。 1. Go 言語の概要 Go 言語は、Google が開発したオープンソースのプログラミング言語であり、高速なコンパイル、効率的な同時実行性、簡潔さ、読みやすさなどの特徴を持ち、ネットワークサービス、分散システム、クラウドコンピューティングなどの開発に適しています。他の分野。行く

Tomcatミドルウェアの原理は何ですか Tomcatミドルウェアの原理は何ですか Dec 27, 2023 pm 04:40 PM

Tomcat ミドルウェアの原理は、Java Servlet および Java EE 仕様に基づいて実装されています。 Tomcat はサーブレット コンテナとして、HTTP リクエストとレスポンスを処理し、Web アプリケーションに実行環境を提供する役割を果たします。 Tomcat ミドルウェアの原理には主に次のものが含まれます: 1. コンテナ モデル; 2. コンポーネント アーキテクチャ; 3. サーブレット処理メカニズム; 4. イベント リスニングとフィルター; 5. 構成管理; 6. セキュリティ; 7. クラスタリングとロード バランシング; 8. コネクタテクノロジー; 9. エンベデッドモードなど

Laravelでのレスポンス変換にミドルウェアを使用する方法 Laravelでのレスポンス変換にミドルウェアを使用する方法 Nov 03, 2023 am 09:57 AM

Laravel での応答変換にミドルウェアを使用する方法 ミドルウェアは、Laravel フレームワークの非常に強力で実用的な機能の 1 つです。これにより、リクエストがコントローラーに入る前、またはレスポンスがクライアントに送信される前に、リクエストとレスポンスを処理できるようになります。この記事では、Laravel でレスポンス変換にミドルウェアを使用する方法を説明します。始める前に、Laravel がインストールされており、新しいプロジェクトが作成されていることを確認してください。次に、次の手順に従います。 新しいミドルウェアを作成する 開く

See all articles