Node.jsのConnect、Express、「ミドルウェア」とは何ですか?


634

JavaScriptをよく知っているにもかかわらず、Node.jsエコシステムのこれら3つのプロジェクトが正確に何をしているのか混乱しています。Rails 'Rackのようなものですか?誰か説明していただけますか?


1
私は接続を使用していませんが、このページでは、Railsのラックに似たサウンドになっています。Nodeのコンテキスト外で、ミドルウェアが何であるかを理解していますか?
マットボール

正直なところ、私が望んでいるほどではありません。私が知る限り、ルーティング、gzip、ヘッダー、Cookieなどのすべてのアプリ前の処理を行うのはレイヤーです。私は正しいですか?それでは、適切なMVCコントローラー/アクションへのルーティングが、MVCフレームワーク内(Railsなど)ではなく、ミドルウェアで行われるように機能しますか?
ティルダ


8
これですべての疑問が解消され、手遅れになったことを理解していることを理解できます(おそらく誰かが下にスクロールしてください...)。 。また、Node.jsについても少し説明します。http://evanhahn.com/understanding-express/
DotNetInfo 2013年

@DiegoCaxitoあなたのリンクは壊れています。
2015

回答:


891

[ 更新: 4.0リリース以降、ExpressはConnectを使用しなくなりました。ただし、Expressは引き続きConnect用に作成されたミドルウェアと互換性があります。私の元の答えは以下です。]

Node.jsを見る人にとって、これは間違いなく混乱の共通点であるため、これについて質問してくれてうれしいです。これは、それを説明する上で私の最高のショットです:

  • Node.js自体がHTTPモジュールを提供し、そのcreateServerメソッドはHTTPリクエストへの応答に使用できるオブジェクトを返します。そのオブジェクトはhttp.Serverプロトタイプを継承します。

  • Connectには、createServerの拡張バージョンを継承するオブジェクトを返すメソッドも用意されていますhttp.Server。Connectの拡張機能は、主にミドルウェアのプラグインを容易にするために用意されています。そのため、Connectはそれ自体を「ミドルウェアフレームワーク」と表現し、しばしばRubyのラックに類似しています。

  • Expressは、Connectがhttpモジュールに対して行うことをConnectに対して実行しcreateServerます。ConnectのServerプロトタイプを拡張するメソッドを提供します。したがって、Connectのすべての機能に加えて、ビューのレンダリングとルートを説明するための便利なDSLがあります。Rubyのシナトラは良い例えです。

  • 次に、さらに進んでExpressを拡張する他のフレームワークがあります。たとえばZappaは、CoffeeScript、サーバーサイドjQuery、およびテストのサポートを統合します。

「ミドルウェア」が何を意味するかについての具体的な例を以下に示します。そのままでは、上記のどれも静的ファイルを提供しません。しかし、connect.static(Connectに付属するミドルウェア)を投入し、ディレクトリーを指すように構成すれば、サーバーはそのディレクトリー内のファイルへのアクセスを提供します。ExpressはConnectのミドルウェアも提供することに注意してください。express.staticと同じconnect.staticです。(どちらもstaticProvider最近まで知られていました。)

私の印象では、ほとんどの「実際の」Node.jsアプリは最近Expressで開発されているようです。追加された機能は非常に便利で、必要に応じて下位レベルの機能はすべてそのまま残っています。


130
Connectについて私を怒らせる1つのことは、そのドキュメントがNodeがHTTPサーバー以上のものであることを認めていないようだということです。「ConnectはNode.jsのミドルウェアフレームワークです」-いいえ、「ConnectはNode.jsのHTTPサーバーのミドルウェアフレームワークです」
スリム

46
@slim読みすぎだと思います。Connectのメーカーは卓越したNode開発者です。彼らは、Nodeが単なるHTTPサーバーではないことをよく知っています。しかし、それはありません持っている内蔵のHTTPサーバを、との接続はあなたのNode.jsアプリケーションで使用できるミドルウェアフレームワークです。
Trevor Burnham

22
コネクトのメーカーはそれを十分に認識していると思います。彼らは、Nodeを完全に理解していなければ、自分が持っているものを達成することはできませんでした。しかし、単語の選択は、Nodeの新規参入者を混乱させます。接続する新参者に。
スリムな

10
非常に明確で、すべての答えが求められるべきもの。優秀な仕事トレバー。
マークエッセル2011

6
素晴らしい説明。このような回答は、新しい人々をNode.jsエコシステムに取り込むのに役立ちます。Node.jsでのWebアプリの開発に慣れている人にとっては、Expressが出発点です。Rubyの類推を続けると、ExpressはSinatraに相当します。これは、Ajaxクライアント側アプリのJSON APIを作成するのに特に便利です。私が発見したことの1つは、アプリケーションが特定のレベルの複雑さに達すると、より多くのRailsに似た別のレイヤーが必要になるということです。私はこの目的のために機関車に取り組んでいます。これはExpressの上にさらにレイヤーされます。
Jared Hanson、2011

159

受け入れられた答えは本当に古い(そして今は間違っている)。Connect(3.0)/ Express(4.0)の現在のバージョンに基づく情報(ソース付き)を以下に示します。

Node.jsに付属するもの

http / https createServerは単にコールバック(req、res)を受け取ります。例:

var server = http.createServer(function (request, response) {

    // respond
    response.write('hello client!');
    response.end();

});

server.listen(3000);

接続によって追加されるもの

ミドルウェアは基本的に、アプリケーションコードといくつかの低レベルAPIの間に位置するソフトウェアです。Connectは、組み込みのHTTPサーバー機能を拡張し、プラグインフレームワークを追加します。プラグインはミドルウェアとして機能するため、接続はミドルウェアフレームワークです

その方法は非常に単純です(実際、コードは本当に短いのです!)。呼び出すとすぐに、次のことができるvar connect = require('connect'); var app = connect();関数appを取得します。

  1. リクエストを処理してレスポンスを返すことができます。これは基本的にこの関数を取得するためです
  2. プラグインを管理するためのメンバー関数.useソース)がありますこれはこの単純なコード行のために、ここから来ています)。

1.)のため、次のことができます。

var app = connect();

// Register with http
http.createServer(app)
    .listen(3000);

2.)と組み合わせると、次のようになります。

var connect = require('connect');

// Create a connect dispatcher
var app = connect()
      // register a middleware
      .use(function (req, res, next) { next(); });

// Register with http
http.createServer(app)
    .listen(3000);

Connectはそれ自体を登録するユーティリティ関数を提供するhttpため、を呼び出す必要はありませんhttp.createServer(app)。呼び出さlistenれ、コードは単に新しいhttpサーバーを作成し、コールバックとしてレジスタの接続を確立し、引数をに転送しますhttp.listenソースから

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

だから、あなたは行うことができます:

var connect = require('connect');

// Create a connect dispatcher and register with http
var app = connect()
          .listen(3000);
console.log('server running on port 3000');

http.createServerプラグインフレームワークが上にあるので、まだ古き良き時代です。

ExpressJSが追加するもの

ExpressJSと接続は並列プロジェクトです。接続があるだけで素敵で、ミドルウェアフレームワークuse機能。ExpressはConnectに依存しませんpackage.jsonを参照))。ただし、接続するすべてのことを行います。

  1. / ペア(ソース)をcreateServer取ることができる単なる関数であるため、同様の接続で登録できます。reqres)を。
  2. ミドルウェアを登録する利用機能
  3. 自分自身をhttplisten登録するユーティリティ関数

connectが提供するもの(重複を表す)に加えて、connectにはさらに多くの機能があります。例えば

  1. 持っているビューエンジンのサポートを
  2. ルーターのトップレベルの動詞(get / postなど)があります
  3. 持っているアプリケーションの設定のサポートを。

ミドルウェアを共有

useExpressJS connect の機能は互換性があるため、ミドルウェアは共有されます。どちらもミドルウェアフレームワークであり、Expressには単純なミドルウェアフレームワーク以上のものがあります。

あなたはどちらを使うべきですか?

私の意見:あなたは自分の選択をするために十分に^上記に基づいて^通知されます。

  • http.createServer最初からconnect / expressjsのようなものを作成する場合に使用します。
  • ミドルウェアの作成やプロトコルのテストなどを行う場合は、connectを使用してください。 http.createServer
  • Webサイトを作成する場合は、ExpressJSを使用してください。

ほとんどの人はExpressJSを使うべきです。

受け入れられた回答の何が問題になっていますか

これらはある時点では真実だったかもしれませんが、今は間違っています:

http.Serverの拡張バージョンを継承する

違う。それはそれを拡張せず、あなたが見たように... それを使用します

Expressは、Connectがhttpモジュールに対して行うことを接続します。

Express 4.0は接続に依存していません。現在のpackage.jsonの依存関係セクションを参照してください


あなたはあなたにリクエストを処理してレスポンスを返す能力を与えると言いますが、人々はエクスプレスは本当にウェブサーバーだと言います...私は混乱しています。応答を送り返すには、(Expressなどの)Webサーバー機能が必要ではないでしょうか?
PositiveGuy

1
良いもの、ありがとう!非常に役立ちます...特に、接続が実際にルーティングを提供するものであることを知らず、Expressはそれを継承するだけであり、ルーティングの唯一の/ソースプロバイダーではありません。最後に、接続とエクスプレスを使用する必要があると想定していましたが、実際に使用する必要があるのはWebアプリのエクスプレスだけなので、最後のユースケースは役立ちます。両方をインストールするのではなく、どちらか一方をインストールします!
PositiveGuy

あなたの答えが一番上にあるはずです。受け入れられた答えを読んだとき、私はそれを賛成した。しかし、あなたの答えを読んだ後... naahhh
Arun Joshla

67

node.js

Node.jsはサーバー側のJavaScriptモーターです。
すべてのjs機能に加えて、ネットワーク機能(HTTPなど)とファイルシステムへのアクセスが含まれます。
これは、ネットワークタスクがブラウザによって独占され、セキュリティ上の理由からファイルシステムへのアクセスが禁止されているクライアント側のjsとは異なります。

node.jsをWebサーバーとして:エクスプレス

サーバーで実行され、HTTPを理解し、ファイルにアクセスできるものは、Webサーバーのように聞こえます。しかし、それは1つではありません。
node.jsをWebサーバーのように動作させるには、それをプログラムする必要があります。つまり、着信HTTP要求を処理し、適切な応答を提供します。
これがExpressの機能です。jsでのWebサーバーの実装です。
したがって、Webサイトの実装は、エクスプレスルートの構成、およびサイト固有の機能のプログラミングに似ています。

ミドルウェアと接続

ページの配信には、いくつかのタスクが含まれます。これらのタスクの多くはよく知られており、非常に一般的であるため、ノードの接続モジュール(ノードの下で実行できる多数のモジュールの1つ)がこれらのタスクを実装します。
現在の印象的な製品をご覧ください:

  • ロガー カスタム形式をサポートする要求ロガー
  • csrf クロスサイトリクエストフォージェリ保護
  • 圧縮する をGzip圧縮ミドルウェア
  • basicAuth 基本的なhttp認証
  • bodyParser 拡張可能なリクエストボディパーサー
  • json アプリケーション/ jsonパーサー
  • urlencoded application / x-www-form-urlencodedパーサー
  • マルチパート multipart / form-dataパーサー
  • タイムアウト 要求タイムアウト
  • cookieParser cookieパーサー
  • セッション バンドルされたMemoryStoreによるセッション管理のサポート
  • cookieSession cookieベースのセッションのサポート
  • methodOverride 偽のHTTPメソッドのサポート
  • responseTime は応答時間を計算し、X-Response-Timeを介して公開します
  • static()ミドルウェアのstaticCacheメモリキャッシュレイヤー
  • 範囲などをサポートする静的ストリーミング静的ファイルサーバー
  • ディレクトリ ディレクトリリストミドルウェア
  • vhost 仮想ホストサブドメインマッピングミドルウェア
  • favicon 効率的なfaviconサーバー(デフォルトのアイコン付き)
  • 制限は、 リクエストボディのバイトサイズを制限します
  • クエリ 自動クエリ文字列パーサー、req.queryに入力
  • errorHandler フレキシブルエラーハンドラー

接続はフレームワークであり、それを介して、必要な(サブ)モジュールを選択できます。Contribのミドルウェアのページには、追加の長いリスト列挙ミドルウェアを。 Express自体には、最も一般的なConnectミドルウェアが付属しています。

何をすべきか?

node.jsをインストールします。
ノードには、ノードパッケージマネージャーであるnpmが付属しています
このコマンドnpm install -g expressは、Expressをグローバルにダウンロードしてインストールします(Express Guideを確認してください)。
実行express fooコマンドラインで(ないノードには)名前fooすぐに実行するアプリケーションを作成します。(新しく作成された)ディレクトリに移動し、nodeを使用してコマンドを実行し、node <appname>開いhttp://localhost:3000て確認します。今あなたがいます。


3
素晴らしい返信ありがとうございます。これは、すべてのブログ投稿が見落としている単純ながらくたの一種であり、単純な設定である可能性があります??? あなたが前にそれをしたことがない場合。すでにそれを行っている場合はそう簡単ですが、初めて開始する方法の手がかりがありません!開発者がブログの投稿でそれを見落とすとき、私はそれが嫌いです、それは不可欠です。設定を見つけるためだけに別のブログ投稿を探す必要はありません。他の投稿に別のブログ投稿へのリンクを提供するだけです。これは非常に役立つので、探し回る必要はありません。狩猟旅行を助けて!
PositiveGuy

3
Express 4.0.0はsudo npm install -g express-generator
mohamed-ibrahim

@getsetbroは、依存関係をインストールするための「npm install」を意味します。
Torsten Barthel 2017

16

Connectは、セッション管理、認証、ロギングなどの一般的なHTTPサーバー機能用の「より高いレベル」のAPIを提供します。Expressは、高度な(シナトラのような)機能を備えたConnectの上に構築されています。


0

Node.jsそれ自体がHTTPモジュールを提供します。そのcreateServerメソッドは、HTTPリクエストへの応答に使用できるオブジェクトを返します。そのオブジェクトはhttp.Serverプロトタイプを継承します。


0

関連情報、特にVisual Studio IDEの操作にNTVSを使用している場合。NTVSは、NodeJSとExpressツールの両方、足場、プロジェクトテンプレートをVisual Studio 2012、2013に追加します。

また、ExpressJSまたはConnectを「WebServer」として呼び出す表現は正しくありません。基本的なWebServerは、それらの有無にかかわらず作成できます。基本的なNodeJSプログラムは、httpモジュールを使用してhttpリクエストを処理することもできるため、初歩的なWebサーバーになります。


0

ミドルウェアは、その名前が示すとおり、実際にはミドルウェアは中間に位置しています。リクエストとレスポンスの中間です。 この画像のリクエスト、レスポンス、エクスプレスサーバーがエクスプレスアプリどのように座っているかを確認すると、リクエストがクライアントから送信され、エクスプレスサーバーサーバーがそれらのリクエストを処理していることがわかります。実際にこれを分割できます。このように、エクスプレスサーバー全体のタスク全体を小さな個別のタスクに組み込みます。 特定のタスクを実行し、要求を次のタスクに渡すサーバーパーツの小さなチャンクのリクエストと応答の間にミドルウェアがどのように配置されるか。最終的にすべてのタスクを実行して応答が行われます。応答サイクル。

これは、ミドルウェア用のエクスプレスYouTubeビデオでミドルウェアを説明する良い例です


-7

愚かな単純な答え

ConnectとExpressは、nodejs用のWebサーバーです。ApacheやIISとは異なり、どちらも「ミドルウェア」と呼ばれる同じモジュールを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.