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
เคยสงสัยตัวเองซักพักแล้ว ... เป็นคำถามที่ดี!
Stijn de Witt

2
ฉันรู้ว่าคำถามนี้เก่า แต่ฉันต้องการที่จะทราบ, createServer ได้รับการคิดค่าเสื่อมราคา
Philip Kirkbride

@PhilipKirkbride คุณกรุณาให้หลักฐาน?
yanot

12
@PhilipKirkbride ฉันเชื่อว่านี่เป็นข้อความที่ทำให้เข้าใจผิด เมธอด createServer () ของ ExpressJS เลิกใช้แล้ว แต่โมดูล Node.js HTTP ยังคงใช้ createServer () และไม่ได้คัดค้าน
Tamas

คำตอบ:


562

แบบฟอร์มที่สอง (การสร้างเซิร์ฟเวอร์ 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
ดังนั้นต้องการ ('http ") createServer (ต้องการ (" ด่วน ")) ฟัง (80) คือ === ต้องการ (" ด่วน ") () ฟัง (80)?
user2167582

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

เพียงเพื่อวัตถุประสงค์ตรงต่อเวลาและขยายคำตอบเล็กน้อยทิม
จากเอกสารอย่างเป็นทางการ :

แอปที่ส่งคืนโดย 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);
};

1
โปรดอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับโค้ดชิ้นที่สองคุณหมายถึงอะไรโดยวิธีการอำนวยความสะดวกที่นี่?
Aakash Verma

@AakashVerma นี่เป็นเพียงส่วนหนึ่งของซอร์สโค้ดของ exress ซึ่งสามารถพบได้express/lib/appplication.jsและไม่มีอะไรมากไปกว่าทางลัดในการสร้างเซิร์ฟเวอร์ http ของโหนด
Ivan Talalaev

ดังนั้นคุณต้องบอกว่าเมื่อเราใช้แอพโดย express () เป็น callback มันจะได้รับการร้องขอจากเซิร์ฟเวอร์ HTTP ภายนอก (ผ่าน 80 หรือ 443) จากนั้นสร้างเซิร์ฟเวอร์เสมือนอีก http.Server ภายในตัวเองและใช้เพื่อฟัง ส่งคำขอไปยังมันได้หรือไม่
Aakash Verma

10

ฉันมาพร้อมกับคำถามเดียวกัน แต่หลังจาก google ฉันพบว่าไม่มีความแตกต่างใหญ่ :)

จาก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. พวกเขาสามารถแสดงผลหน้า HTML แบบไดนามิกตามข้อโต้แย้งผ่านไปยังแม่แบบโดยใช้ด่วน
  3. พวกเขายังสามารถกำหนดเส้นทางได้อย่างง่ายดายโดยใช้ด่วน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.