Express.js - app.listen बनाम 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
मुझे एहसास है कि यह सवाल पुराना है लेकिन मैं ध्यान देना चाहता हूं, क्रिएचर को ह्रास किया गया है।
फिलिप किर्कब्राइड

@PhilipKirkbride क्या आप कृपया, प्रमाण प्रदान कर सकते हैं?
यानोट

12
@PhilipKirkbride मेरा मानना ​​है कि यह कुछ भ्रामक कथन है। ExpressJS के createServer () विधि को हटा दिया गया है, लेकिन Node.js HTTP मॉड्यूल अभी भी createServer () का उपयोग करता है और यह पदावनत नहीं किया जाता है।
तमस

जवाबों:


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 प्रभाव एक ही है, हाँ, लेकिन निश्चित रूप से एक शाब्दिक ===तुलना विफल होगी;) यदि आप मुझ पर विश्वास नहीं करते हैं, तो हमेशा स्रोत होता है
रॉबर्टबेल्प

1
क्या var socketio = require('socket.io')आपके पुनर्लेखन में तीसरी पंक्ति आवश्यक है?
davidx1

1
प्रत्येक के समर्थक और विपक्ष?
टान्नर समर्स

2
@TannerSummers मैं व्यावहारिक रूप से हमेशा उपयोग करता हूं app.listen()क्योंकि इसके लिए कम कोड की आवश्यकता होती है। चूँकि इसके ऊपर केवल एक बहुत पतली परत है server.listen(), और यह सर्वर आवृत्ति को लौटाता है, इसलिए आमतौर पर मैन्युअल रूप से अलग HTTP सर्वर उदाहरण बनाने का कोई कारण नहीं है।
रॉबर्टबेलप

64

एप्लिकेशन का उपयोग करने और http सर्वर को सुनने का एक और अंतर है जब आप https सर्वर के लिए सेटअप करना चाहते हैं

Https के लिए सेटअप करने के लिए, आपको नीचे दिए गए कोड की आवश्यकता होगी:

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

एक्सप्रेस से ऐप केवल http सर्वर लौटाएगा, आप इसे एक्सप्रेस में सेट नहीं कर सकते, इसलिए आपको https सर्वर कमांड का उपयोग करना होगा

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

30

बस समय की पाबंदी के उद्देश्य से और थोड़ा टिम जवाब का विस्तार करें।
से आधिकारिक दस्तावेज :

एप्लिकेशन एक्सप्रेस द्वारा दिया () वास्तव में एक जावास्क्रिप्ट समारोह, है पारित होने के लिए डिजाइन संभाल अनुरोध करने के लिए एक कॉलबैक के रूप में नोड के 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 यह एक्ज़्रेस के सोर्स कोड का एक टुकड़ा है जो express/lib/appplication.jsनोड के http सर्वर को बनाने के लिए शॉर्टकट के अलावा और कुछ भी नहीं पाया जा सकता है।
इवान तालालाव

तो आपके कहने का मतलब है कि जब हम कॉलबैक के रूप में एक्सप्रेस द्वारा एप्लिकेशन का उपयोग करते हैं, तो यह बाहरी HTTP सर्वर (80 या 443 के माध्यम से) से अनुरोध प्राप्त करता है और फिर अपने भीतर एक और वर्चुअल सर्वर http.Server बनाता है और इसे सुनने के लिए उपयोग करता है अनुरोधों के लिए इसे भेज दिया?
आकाश वर्मा

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

इसके अलावा अगर आप सॉकेट के साथ काम करना चाहते हैं। तो उनका उदाहरण देखें

देखें इस

मुझे पसंद है app.listen():)


9

एक्सप्रेस मूल रूप से http मॉड्यूल का एक आवरण है जो डेवलपर्स की आसानी के लिए इस तरह बनाया जाता है कि ..

  1. वे एक्सप्रेस का उपयोग करके HTTP अनुरोधों (आसानी से) का जवाब देने के लिए मध्यवर्गी स्थापित कर सकते हैं।
  2. वे गतिशील रूप से एक्सप्रेस का उपयोग करते हुए तर्कों को पारित करने के आधार पर HTML पृष्ठों को प्रस्तुत कर सकते हैं।
  3. वे एक्सप्रेस का उपयोग करके आसानी से रूटिंग को भी परिभाषित कर सकते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.