Express.js - app.listen vs server.listen


439

Bu çok basit bir soru olabilir ama ben anlamıyorum. Express.js kullanarak uygulama oluşturma ile uygulamayı 1234 numaralı bağlantı noktasında dinlemeye başlama arasındaki fark nedir, örneğin:

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

//app.configure, app.use etc

app.listen(1234);

ve bir http sunucusu ekleme:

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

var app = express();
var server = http.createServer(app);

//app.configure, app.use etc

server.listen(1234);

Fark ne?
Eğer gidersem http://localhost:1234, aynı çıktıyı alıyorum.


25
Bunu bir süredir merak ediyorum ... Güzel soru!
Stijn de Witt

2
Bu sorunun eski olduğunu fark ettim ama şunu belirtmek isterim ki, createServer amortismana tabi tutuldu.
Philip Kirkbride

@PhilipKirkbride, lütfen kanıt sağlayabilir misiniz?
yanot

12
@PhilipKirkbride Bunun biraz yanıltıcı bir ifade olduğuna inanıyorum. ExpressJS en createServer () yöntemi kullanımdan kaldırıldı ancak node.js HTTP modülü hala createServer kullanır () ve yani değil kaldırılan.
Tamas

Yanıtlar:


563

HTTP sunucusunu yeniden kullanmak istiyorsanız, örneğin socket.ioaynı HTTP sunucusu örneği içinde çalıştırmak için ikinci form (kendiniz bir HTTP sunucusu oluşturmak, Express'in sizin için bir tane oluşturmak yerine) kullanışlıdır :

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

Bununla birlikte, app.listen()HTTP sunucusu örneğini de döndürür, böylece biraz yeniden yazma ile kendiniz bir HTTP sunucusu oluşturmadan benzer bir şey elde edebilirsiniz:

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
. bu yüzden (80)) ( "(" ifade). gerektiren === (80) dinlemek "() olduğunu ifade etmektedir. createServer (gerektiren)" ( 'http)" gerektiren dinlemek?
user2167582

7
@ user2167582 etkisi aynı, evet, ama tabii ki gerçek bir ===karşılaştırma başarısız olurdu;) Bana inanmıyorsanız , her zaman kaynak vardır .
robertklep

1
olduğu var socketio = require('socket.io')için Yeniden yazma gerekli üçüncü satırda?
davidx1

1
pro ve eksilerini her biri?
Tanner Summers

2
@TannerSummers Hemen her zaman kullanıyorum app.listen()çünkü daha az kod gerektiriyor. Üstünde çok ince bir katman server.listen()olduğundan ve sunucu örneğini döndürdüğünden, genellikle el ile ayrı bir HTTP sunucusu örneği oluşturmak için bir neden yoktur.
robertklep

64

Uygulamayı kullanmanın ve http sunucusunu dinlemenin bir farkı daha var: https sunucusu için kurulum yapmak istediğinizde

Https'yi ayarlamak için aşağıdaki koda ihtiyacınız vardır:

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

Express'ten uygulama yalnızca http sunucusunu döndürür, ekspres olarak ayarlayamazsınız, bu yüzden https sunucusu komutunu kullanmanız gerekir

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

30

Dakiklik amacıyla ve biraz Tim cevap uzatmak için.
Gönderen Resmi belgelerin :

Express () tarafından döndürülen uygulama aslında, istekleri işlemek için Geri Arama olarak Düğümün HTTP sunucularına GEÇİLMESİ İÇİN TASARLANMIŞ bir JavaScript İşlevidir .

Bu, uygulama bunlardan devralmadığı için uygulamanızın hem HTTP hem de HTTPS sürümlerini aynı kod tabanıyla sağlamayı kolaylaştırır (sadece bir geri aramadır):

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

App.listen () metodu döner bir http.Server nesne ve (HTTP) a, uygun bir yol , aşağıda için:

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

1
Lütfen ikinci kodda biraz daha açıklayın.Burada bir kolaylık yöntemiyle tam olarak ne demek istiyorsun?
Aakash Verma

@AakashVerma bu sadece bulunabilir exress kaynak kodu bir parçasıdır express/lib/appplication.jsve düğümün http sunucusu oluşturmak için kısayol başka bir şey değildir.
Ivan Talalaev

Yani bir geri arama olarak express () ile uygulamayı kullandığımızda, dış HTTP sunucusundan (80 veya 443 aracılığıyla) isteği aldığını ve kendi içinde başka bir sanal sunucu oluşturduğunu ve dinlemek için kullandığını söylemek istersiniz. iletilen isteklere?
Aakash Verma

10

Aynı soru ile geldim ama google sonra, büyük bir fark olmadığını buldum :)

Gönderen Github

Hem HTTP hem de HTTPS sunucusu oluşturmak istiyorsanız, burada gösterildiği gibi "http" ve "https" modülleriyle bunu yapabilirsiniz.

/**
 * 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 onların bkz ile işten istediğiniz Ayrıca eğer örnek

Bkz bu

Tercih ederim app.listen():)


9

Express temelde geliştiricilerin kolaylığı için oluşturulan bir şekilde http modülünün bir sarmalayıcıdır ..

  1. Ekspres kullanarak HTTP İsteklerine (kolayca) yanıt vermek için orta araçları ayarlayabilirler.
  2. Express kullanarak şablonlara argüman aktarmaya dayalı olarak HTML Sayfalarını dinamik olarak oluşturabilirler.
  3. Ekspres kullanarak kolayca yönlendirmeyi tanımlayabilirler.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.