Express.js-app.listenとserver.listen


439

これは非常に基本的な質問かもしれませんが、私はそれを理解していません。Express.jsを使用してアプリを作成することと、ポート1234でリッスンするアプリを起動することの違いは何ですか。次に例を示します。

var express = require('express');
var app = express();

//app.configure, app.use etc

app.listen(1234);

そしてhttpサーバーを追加します:

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

var app = express();
var server = http.createServer(app);

//app.configure, app.use etc

server.listen(1234);

違いは何ですか?
に移動するhttp://localhost:1234と、同じ出力が得られます。


25
しばらくの間自分自身を疑問に思っていました...良い質問です!
Stijn de Witt 2016

2
この質問が古いことに気付きましたが、createServerは廃止されました。
フィリップカークブライド

@PhilipKirkbride証明を提供してください。
yanot 2017

12
@PhilipKirkbride私はそれがやや誤解を招く表現だと思います。ExpressJSのcreateServer()メソッドは非推奨になりましたが、Node.js HTTPモジュールはまだcreateServer()を使用しており非推奨ではありません。
タマス

回答:


562

2番目の形式(Expressで作成するのではなく、自分でHTTPサーバーを作成する)は、HTTPサーバーを再利用する場合、たとえばsocket.io同じHTTPサーバーインスタンス内で実行する場合に便利です。

var express = require('express');
var app     = express();
var server  = require('http').createServer(app);
var io      = require('socket.io').listen(server);
...
server.listen(1234);

ただし、app.listen()HTTPサーバーインスタンスも返されるため、少し書き換えると、自分でHTTPサーバーを作成しなくても、同様のことができます。

var express   = require('express');
var app       = express();

// app.use/routes/etc...

var server    = app.listen(3033);
var io        = require('socket.io').listen(server);

io.sockets.on('connection', function (socket) {
  ...
});

2
したがってrequire( 'http ")。createServer(require(" express "))。listen(80)is === require(" express ")()。listen(80)?
user2167582

7
@ user2167582効果は同じですが、もちろん、文字どおりの===比較は失敗します;)私を信じていない場合は、常にソースがあります。
robertklep 2014

1
であるvar socketio = require('socket.io')あなたの書き換えに必要な3行目に?
davidx1 2016年

1
それぞれの長所と短所?
Tanner Summers 2016

2
@TannerSummers app.listen()必要なコードが少ないため、実際には常に使用しています。これは上の非常に薄いレイヤーでありserver.listen()、サーバーインスタンスを返すため、通常、個別のHTTPサーバーインスタンスを手動で作成する理由はありません。
robertklep 16

64

アプリを使用してhttpサーバーをリッスンすることのもう1つの違いは、httpsサーバーをセットアップする場合です。

httpsを設定するには、以下のコードが必要です。

var https = require('https');
var server = https.createServer(app).listen(config.port, function() {
    console.log('Https App started');
});

Expressのアプリはhttpサーバーのみを返すため、Expressでは設定できないため、httpsサーバーコマンドを使用する必要があります

var express = require('express');
var app = express();
app.listen(1234);

30

時間厳守のために、ティムの回答を少し拡張します。公式ドキュメント
から:

express()によって返されるアプリは、実際にはJavaScript関数であり、リクエストを処理するためのコールバックとしてNodeのHTTPサーバーに 渡されるように設計されています。

これにより、アプリはHTTPとHTTPSの両方のバージョンに同じコードベースを簡単に提供できます。これは、アプリがこれらから継承しないためです(単なるコールバックです)。

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

app.listen()メソッドの戻りhttp.Serverオブジェクトおよび(のためのHTTP)は便利な方法で以下の場合:

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

1
2番目のコードについてもう少し説明してください。ここでの便利なメソッドとは正確にはどういう意味ですか?
Aakash Verma 2017

@AakashVermaこれは、express/lib/appplication.jsノードのhttpサーバーを作成するためのショートカットにすぎないexressのソースコードのほんの一部です。
Ivan Talalaev 2017

つまり、express()によってappをコールバックとして使用する場合、外側のHTTPサーバーからリクエストを受信し(80または443のいずれかを介して)、それ自体に別の仮想サーバーhttp.Serverを作成し、それを使用してリッスンするということです転送されたリクエストに?
Aakash Verma 2017

10

私は同じ質問をしましたが、グーグルの後で、大きな違いはないことがわかりました:)

Githubから

HTTPサーバーとHTTPSサーバーの両方を作成する場合は、次のように「http」モジュールと「https」モジュールを使用して作成できます。

/**
 * Listen for connections.
 *
 * A node `http.Server` is returned, with this
 * application (which is a `Function`) as its
 * callback. If you wish to create both an HTTP
 * and HTTPS server you may do so with the "http"
 * and "https" modules as shown here:
 *
 *    var http = require('http')
 *      , https = require('https')
 *      , express = require('express')
 *      , app = express();
 *
 *    http.createServer(app).listen(80);
 *    https.createServer({ ... }, app).listen(443);
 *
 * @return {http.Server}
 * @api public
 */

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

また、socket.ioで作業したい場合は、それらの例を参照してください

これを

私はapp.listen():) を好む


9

Expressは基本的にhttpモジュールのラッパーであり、開発者が簡単に使用できるように作成されています。

  1. 彼らは、エクスプレスを使用して(簡単に)HTTPリクエストに応答するミドルウェアをセットアップできます。
  2. Expressを使用してテンプレートに引数を渡すことに基づいて、HTMLページを動的にレンダリングできます。
  3. また、エクスプレスを使用してルーティングを簡単に定義することもできます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.