Express.js - app.listen vs server.listen

439

Ini mungkin pertanyaan yang sangat mendasar tapi saya tidak mengerti. Apa perbedaan antara membuat aplikasi menggunakan Express.js dan memulai mendengarkan aplikasi di port 1234, misalnya:

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

//app.configure, app.use etc

app.listen(1234);

dan menambahkan server 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);

Apa bedanya?
Jika saya menavigasi http://localhost:1234, maka saya mendapatkan output yang sama.

Tamas
sumber
25
Bertanya-tanya sendiri untuk beberapa waktu ... Pertanyaan bagus!
Stijn de Witt
2
Saya menyadari pertanyaan ini sudah lama tetapi saya ingin mencatat, createServer telah didepresiasi.
Philip Kirkbride
@ PhilipKirkbride, bisakah Anda memberikan bukti?
yanot
12
@ PhilipKirkbride Saya percaya itu pernyataan yang agak menyesatkan. Metode createServer () ExpressJS telah usang, tetapi modul HTTP Node.js masih menggunakan createServer () dan itu tidak usang.
Tamas

Jawaban:

563

Bentuk kedua (membuat server HTTP sendiri, alih-alih memiliki Express buatkan untuk Anda) berguna jika Anda ingin menggunakan kembali server HTTP, misalnya untuk dijalankan socket.iodalam instance server HTTP yang sama:

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

Namun, app.listen()juga mengembalikan instance server HTTP, jadi dengan sedikit penulisan ulang Anda dapat mencapai sesuatu yang serupa tanpa membuat server HTTP sendiri:

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) {
  ...
});
robertklep
sumber
2
jadi butuhkan ('http "). createServer (perlu (" ekspres ")). Dengarkan (80) adalah === Memerlukan (" express ") (). Dengarkan (80)?
user2167582
7
@ user2167582 efeknya sama, ya, tapi tentu saja ===perbandingan literal akan gagal;) Jika Anda tidak percaya, selalu ada sumbernya .
robertklep
1
apakah var socketio = require('socket.io')pada baris ketiga perlu ditulis ulang?
davidx1
1
pro dan kontra masing-masing?
Tanner Summers
2
@ TannerSummers Saya praktis selalu menggunakan app.listen()karena membutuhkan lebih sedikit kode. Karena hanya lapisan yang sangat tipis di atasnya server.listen(), dan ia mengembalikan instance server, umumnya tidak ada alasan untuk membuat instance server HTTP secara manual.
robertklep
64

Ada satu lagi perbedaan menggunakan aplikasi dan mendengarkan server http adalah ketika Anda ingin mengatur untuk server https

Untuk menyiapkan https, Anda memerlukan kode di bawah ini:

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

Aplikasi dari express hanya akan mengembalikan server http, Anda tidak dapat mengaturnya secara express, jadi Anda harus menggunakan perintah server https

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

Hanya untuk tujuan ketepatan waktu dan memperpanjang sedikit jawaban Tim.
Dari dokumentasi resmi :

Aplikasi yang dikembalikan oleh express () sebenarnya adalah Fungsi JavaScript, DIRANCANG UNTUK DILULUS ke server HTTP Node sebagai panggilan balik untuk menangani permintaan.

Ini membuatnya mudah untuk menyediakan versi HTTP dan HTTPS aplikasi Anda dengan basis kode yang sama, karena aplikasi tidak mewarisi dari ini (ini hanyalah panggilan balik):

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

Metode app.listen () mengembalikan objek http.Server dan (untuk HTTP) adalah metode praktis untuk yang berikut:

app.listen = function() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};
Ivan Talalaev
sumber
1
Tolong jelaskan sedikit lebih banyak pada bagian kedua kode. Apa sebenarnya yang Anda maksud dengan metode kenyamanan di sini?
Aakash Verma
@ AashashVerma ini hanya sepotong kode sumber exress yang dapat ditemukan di express/lib/appplication.jsdan tidak lebih dari jalan pintas untuk membuat server http node.
Ivan Talalaev
Jadi Anda bermaksud mengatakan bahwa ketika kami menggunakan aplikasi dengan express () sebagai panggilan balik, ia menerima permintaan dari server HTTP luar (melalui 80 atau 443) dan kemudian membuat server virtual lain di http.erver di dalam dirinya dan menggunakannya untuk mendengarkan untuk permintaan yang diteruskan ke sana?
Aakash Verma
10

Saya datang dengan pertanyaan yang sama tetapi setelah google, saya menemukan tidak ada perbedaan besar :)

Dari Github

Jika Anda ingin membuat server HTTP dan HTTPS, Anda dapat melakukannya dengan modul "http" dan "https" seperti yang ditunjukkan di sini.

/**
 * 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);
};

Juga jika Anda ingin bekerja dengan socket.io lihat contohnya

Lihat ini

Saya lebih suka app.listen():)

Muhammad Shahzad
sumber
9

Express pada dasarnya adalah pembungkus modul http yang dibuat untuk kemudahan pengembang sedemikian rupa sehingga ..

  1. Mereka dapat mengatur middlewares untuk menanggapi Permintaan HTTP (dengan mudah) menggunakan express.
  2. Mereka secara dinamis dapat merender Halaman HTML berdasarkan argumen yang lewat ke template menggunakan express.
  3. Mereka juga dapat mendefinisikan routing dengan mudah menggunakan express.
Sarim Javaid Khan
sumber