web-dev-qa-db-ja.com

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

JavaScriptを非常によく知っているにもかかわらず、Node.jsエコシステム内のこれら3つのプロジェクトが正確にすることを混同しています。それはRailsのラックのようなものですか?誰かが説明してもらえますか?

614
tillda

[更新:Express 4.0では、Connectは使用されなくなりました。しかし、ExpressはConnect用に書かれたミドルウェアとはまだ互換性があります。私の最初の答えは以下です。]

Node.jsを見ている人々にとって間違いなく一般的な混乱の原因となるので、この点について質問していただきありがとうございます。これを説明するのが私のベストショットです。

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

  • Connect は、http.Serverの拡張バージョンを継承したオブジェクトを返すcreateServerメソッドも提供します。 Connectの拡張機能は主に、ミドルウェア の接続を簡単にするためにあります 。 Connectがそれ自体を「ミドルウェアフレームワーク」と表現し、Rubyのラックにたとえられることが多いのはそのためです。

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

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

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

私の印象は、最近のほとんどの "本物の" Node.jsアプリケーションはExpressで開発されているということです。それが追加する機能は非常に便利です、そしてあなたがそれを望むならば、低レベルの機能の全てはまだそこにあります。

873
Trevor Burnham

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

Node.jsに付属しているもの

http / httpscreateServerこれは単純にコールバック(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. plugins を管理するためのメンバー関数.usesource )があります( ここから来る のために この単純なコード行 )。

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とconnectは並列プロジェクトです。 Connectは just ミドルウェアフレームワークであり、Nice use関数を備えています。 ExpressはConnect に依存しません( package.jsonを参照 )。ただし、接続するすべてのことは行われます:

  1. ConnectのようにcreateServerに登録することもできます。これは、req/resペア( source )をとることができる単なる関数であるためです。
  2. ミドルウェアを登録する関数を使用
  3. ユーティリティ(listen関数から それ自体をhttpで登録

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

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

ミドルウェアは shared

ExpressJS and connectのuse関数は互換性があるため、ミドルウェアはshared です。どちらもミドルウェアフレームワークであり、Expressは単なるミドルウェアフレームワーク以上のものを備えています。

どちらを使用すべきですか?

私の意見:あなたはあなた自身の選択をするのに十分な情報を得ています。

  • Connect/expressjsなどをゼロから作成する場合は、http.createServerを使用します。
  • ミドルウェアのオーサリング、プロトコルのテストなどを行う場合は、http.createServerの上にニースの抽象化があるため、connectを使用します。
  • Webサイトを作成する場合は、ExpressJSを使用します。

ほとんどの人はExpressJSを使用するだけです。

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

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

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

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

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

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

153
basarat

node.js

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

webサーバーとしてのnode.js:express

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

ミドルウェアと接続

ページを提供することは多くのタスクを含みます。これらのタスクの多くはよく知られていて非常に一般的なので、ノードの Connect モジュール(nodeの下で実行できる多数のモジュールのうちの1つ)はそれらのタスクを実装します。
現在の素晴らしい製品をご覧ください。

  • ロガーカスタム形式サポートのあるロガーを要求する
  • csrfクロスサイトリクエストフォージェリプロテクション
  • compressGzip圧縮ミドルウェア
  • basicAuth基本HTTP認証
  • bodyParser拡張要求本体パーサー
  • jsonapplication/jsonパーサー
  • urlencodedapplication/x-www-form-urlencodedパーサー
  • multipartmultipart/form-dataパーサー
  • timeoutリクエストタイムアウト
  • cookieParserクッキーパーサー
  • セッションバンドルされたMemoryStoreによるセッション管理のサポート
  • cookieSessioncookieベースのセッションサポート
  • methodOverride偽のHTTPメソッドのサポート
  • responseTimeは応答時間を計算し、X-Response-Timeを介して公開します。
  • static()ミドルウェアのstaticCacheメモリキャッシュレイヤ
  • Rangeをサポートするstaticstaticファイルサーバー
  • ディレクトリディレクトリ一覧ミドルウェア
  • vhost仮想ホストサブドメインマッピングミドルウェア
  • favicon効率的なfaviconサーバー(デフォルトのアイコン付き)
  • limitリクエストボディのバイトサイズを制限する
  • query自動クエリ文字列パーサ、req.queryの生成
  • errorHandler柔軟なエラーハンドラ

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

何をすべきか?

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

66
Juan Lanus

Connectは、セッション管理、認証、ロギングなどの一般的なHTTPサーバー機能のための「高レベル」APIを提供します。 ExpressはConnectの上に高度な(Sinatraのような)機能を持っています。

15
yojimbo87

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

0