web-dev-qa-db-ja.com

Express.js - app.listenとserver.listen

これは非常に基本的な質問かもしれませんが、私は単純にそれを得ません。 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に移動しても、同じ出力が得られます。

355
Tamas

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

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) {
  ...
});
472
robertklep

アプリを使用して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 serverコマンドを使用する必要があります。

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

時間厳守目的のためだけに、少しTimの答えを広げてください。
公式文書 から:

Express()によって返されるアプリは、実際にはJavaScript関数です。リクエストを処理するためのコールバックとしてノードの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);
};
17
Ivan Talalaev

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

  1. Expressを使ってHTTPリクエストに(簡単に)応答するようにミドルウェアを設定できます。
  2. Expressを使用してテンプレートに引数を渡すことに基づいて、HTMLページを動的にレンダリングできます。
  3. 彼らはまたエクスプレスを使用して簡単にルーティングを定義することができます。
5

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

から 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() :)が好きです

4