Express.js - app.listen vs 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
Дуже дивувався цьому сам якийсь час ... Добре запитання!
Штійн де Вітт

2
Я розумію, що це питання давнє, але хочу зазначити, що createServer знецінився.
Філіп Кіркбрід

@PhilipKirkbride Ви можете, будь ласка, надати підтвердження?
янот

12
@PhilipKirkbride Я вважаю, що це дещо оманливе твердження. Метод createServer () ExpressJS застарілий, але HTTP-модуль Node.js все ще використовує createServer (), і це не застаріло.
Тамас

Відповіді:


562

Друга форма (створити HTTP-сервер самостійно, замість того, щоб Express створити один для вас) корисна, якщо ви хочете повторно використовувати сервер 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
так вимагають ("http"). createServer (вимагають ("експрес")). прослуховують (80) це === вимагають ("експрес") (). слухають (80)?
користувач2167582

7
@ user2167582 ефект такий же, так, але, звичайно, буквальне ===порівняння провалиться;) Якщо ви мені не вірите, джерело завжди є .
robertklep

1
це var socketio = require('socket.io')третій рядок, необхідний у вашому переписанні?
davidx1

1
плюси і мінуси кожного?
Таннер Саммерс

2
@TannerSummers я практично завжди використовую, app.listen()тому що для цього потрібно менше коду. Оскільки поверх це лише дуже тонкий шар server.listen(), і він повертає екземпляр сервера, загалом немає причин створювати окремий екземпляр сервера HTTP вручну.
robertklep

64

Є ще одна відмінність використання програми та прослуховування http-сервера, коли ви хочете налаштувати на 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

Просто з метою пунктуальності і розгорніть трохи відповіді Тіма.
З офіційної документації :

Додаток, повернений експресом (), насправді є функцією 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);
};

1
Поясніть, будь ласка, трохи більше про другий фрагмент коду. Що саме ви маєте на увазі під зручним методом тут?
Аакаш Верма

@AakashVerma - це лише фрагмент вихідного коду exress, який можна знайти express/lib/appplication.jsі не що інше, як ярлик для створення http-сервера вузла.
Іван Талалаєв

Отже, ви хочете сказати, що коли ми використовуємо додаток express () в якості зворотного дзвінка, він отримує запит від зовнішнього сервера HTTP (через 80 або 443), а потім створює ще один віртуальний сервер http.Server всередині себе і використовує його для прослуховування до переадресованих до нього запитів?
Аакаш Верма

10

Я прийшов з тим же питанням, але після google я виявив, що немає великої різниці :)

Від Гітуба

Якщо ви хочете створити як 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

Експрес - це в основному обгортка модуля http, який створений для зручності розробників таким чином, що ..

  1. Вони можуть налаштувати середні програми для відповіді на HTTP-запити (легко) за допомогою express.
  2. Вони можуть динамічно відтворювати HTML-сторінки на основі передачі аргументів у шаблони, використовуючи express.
  3. Вони також можуть легко визначати маршрутизацію, використовуючи express.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.