Express.js - app.listen vs server.listen


439

Đây có thể là một câu hỏi rất cơ bản nhưng tôi đơn giản là không hiểu nó. Sự khác biệt giữa việc tạo một ứng dụng bằng Express.js và bắt đầu nghe ứng dụng trên cổng 1234 là gì, ví dụ:

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

//app.configure, app.use etc

app.listen(1234);

và thêm một máy chủ 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);

Có gì khác biệt?
Nếu tôi điều hướng đến http://localhost:1234, do đó tôi nhận được cùng một đầu ra.


25
Đã tự hỏi điều này một thời gian ... Câu hỏi hay!
Stijn de Witt

2
Tôi nhận ra câu hỏi này đã cũ nhưng tôi muốn lưu ý, createdServer đã bị khấu hao.
Philip Kirkbride

@PhilipKirkbride Bạn có thể, xin vui lòng, cung cấp bằng chứng?
yanot

12
@PhilipKirkbride Tôi tin rằng đó là một tuyên bố hơi sai lệch. Phương thức createServer () của ExpressJS không được dùng nữa, nhưng mô đun HTTP Node.js vẫn sử dụng createServer () và điều đó không bị phản đối.
Tamas

Câu trả lời:


562

Hình thức thứ hai (tự tạo máy chủ HTTP, thay vì có Express tạo một máy chủ cho bạn) rất hữu ích nếu bạn muốn sử dụng lại máy chủ HTTP, ví dụ để chạy socket.iotrong cùng phiên bản máy chủ HTTP:

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

Tuy nhiên, app.listen()cũng trả về phiên bản máy chủ HTTP, do đó, với một chút viết lại, bạn có thể đạt được điều gì đó tương tự mà không cần tự tạo máy chủ 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
vì vậy yêu cầu ('http "). createdServer (yêu cầu (" express ")). lắng nghe (80) là === yêu cầu (" express ") (). lắng nghe (80)?
user2167582

7
@ user2167582 hiệu ứng là như nhau, vâng, nhưng tất nhiên một ===so sánh theo nghĩa đen sẽ thất bại;) Nếu bạn không tin tôi, luôn có nguồn .
robertklep

1
var socketio = require('socket.io')trên dòng thứ ba cần thiết trong viết lại của bạn?
davidx1

1
pro và nhược điểm của mỗi?
Tanner Summers

2
@TannerSummers Tôi thực tế luôn sử dụng app.listen()vì nó yêu cầu ít mã hơn. Vì nó chỉ là một lớp rất mỏng ở trên cùng server.listen()và nó trả về thể hiện của máy chủ, nên thường không có lý do gì để tạo một cá thể máy chủ HTTP riêng biệt theo cách thủ công.
robertklep

64

Có một sự khác biệt nữa khi sử dụng ứng dụng và nghe máy chủ http là khi bạn muốn thiết lập cho máy chủ https

Để thiết lập cho https, bạn cần mã bên dưới:

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

Ứng dụng từ express sẽ chỉ trả về máy chủ http, bạn không thể đặt nó ở dạng express, vì vậy bạn sẽ cần sử dụng lệnh máy chủ https

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

30

Chỉ nhằm mục đích đúng giờ và mở rộng một chút câu trả lời Tim.
Từ tài liệu chính thức :

Ứng dụng được trả về bởi express () trên thực tế là một Hàm JavaScript, được THIẾT KẾ ĐỂ ĐƯỢC PASSED cho các máy chủ HTTP của Node dưới dạng gọi lại để xử lý các yêu cầu.

Điều này giúp dễ dàng cung cấp cả hai phiên bản HTTP và HTTPS cho ứng dụng của bạn với cùng một cơ sở mã, vì ứng dụng không kế thừa từ những phiên bản này (nó chỉ đơn giản là một cuộc gọi lại):

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

Phương thức app.listen () trả về một đối tượng http.Server và (đối với HTTP) là một phương thức tiện lợi cho các mục sau:

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

1
Vui lòng giải thích thêm một chút về đoạn mã thứ hai. Chính xác thì bạn muốn nói gì về phương pháp tiện lợi ở đây?
Aakash Verma

@AakashVerma đây chỉ là một đoạn mã nguồn của exress có thể được tìm thấy express/lib/appplication.jsvà không có gì khác hơn là phím tắt để tạo máy chủ http của nút.
Ivan Talalaev

Vì vậy, bạn muốn nói rằng khi chúng tôi sử dụng ứng dụng bằng express () làm cuộc gọi lại, nó sẽ nhận được yêu cầu từ máy chủ HTTP bên ngoài (thông qua 80 hoặc 443) và sau đó tạo một máy chủ ảo http.Server khác trong chính nó và sử dụng nó để lắng nghe để yêu cầu chuyển tiếp đến nó?
Aakash Verma

10

Tôi đến với cùng một câu hỏi nhưng sau google, tôi thấy không có sự khác biệt lớn :)

Từ Github

Nếu bạn muốn tạo cả máy chủ HTTP và HTTPS, bạn có thể làm như vậy với các mô-đun "http" và "https" như được hiển thị ở đây.

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

Ngoài ra nếu bạn muốn làm việc với socket.io hãy xem ví dụ của họ

Xem cái này

Tôi thích app.listen():)


9

Express về cơ bản là một trình bao bọc của mô-đun http được tạo ra để dễ dàng cho các nhà phát triển theo cách mà ..

  1. Họ có thể thiết lập phần mềm trung gian để đáp ứng Yêu cầu HTTP (dễ dàng) bằng cách sử dụng express.
  2. Họ có thể tự động kết xuất các trang HTML dựa trên việc chuyển các đối số cho các mẫu bằng cách sử dụng express.
  3. Họ cũng có thể xác định định tuyến dễ dàng bằng cách sử dụng express.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.