2013-07-17 8 views
212

Dies kann eine sehr grundlegende Frage sein, aber ich verstehe es einfach nicht. Was ist der Unterschied zwischen einer App zu schaffen Express.js und Starten der Anwendung auf Port 1234, zum Beispiel hört mit:Express.js - app.listen vs server.listen

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

//app.configure, app.use etc 

app.listen(1234); 

und das Hinzufügen von einem HTTP-Server:

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

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

//app.configure, app.use etc 

server.listen(1234); 

Was ist der Unterschied?
Wenn ich zu http://localhost:1234 navigieren, so bekomme ich die gleiche Ausgabe.

+6

mich gefragt, diese selbst für einige Zeit ... Gute Frage! –

+2

Ich weiß, dass diese Frage alt ist, aber ich möchte feststellen, createServer wurde abgeschrieben. –

+0

@PhilipKirkbride können Sie, bitte, einen Nachweis erbringen? – yanot

Antwort

321

Die zweite Form (Erstellen eines HTTP-Server selbst, anstelle von Express für Sie erstellen) ist nützlich, wenn Sie den HTTP-Server, zum Beispiel zu laufen socket.io innerhalb derselben HTTP-Server-Instanz wiederverwenden möchten:

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

, kehrt app.listen() auch die HTTP-Server-Instanz, also mit einem bisschen Umschreiben Sie etwas ähnliches, ohne einen HTTP-Server selbst erreichen können:

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

Awesome Robert - danke! – Tamas

+1

so erfordern ("http"). CreateServer (require ("express")). Listen (80) ist === erfordern ("express")(). Listen (80)? – user2167582

+4

@ user2167582 der Effekt ist der gleiche, Ja, aber natürlich würde ein wörtlicher "===" Vergleich scheitern;) Wenn Sie mir nicht glauben, [es gibt immer die Quelle] (https://github.com/strongloop/express/blob/3e4158bcbda7017dbe7226fb76d974bd95c29ce9/lib /application.js#L540). – robertklep

33

es eine weiterer Unterschied ist die App und l mit istening zu HTTP-Server ist, wenn Sie für https-Server

Um Setup für https einrichten möchten, müssen Sie den Code unten:

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

Die App von Express zurückkehren wird nur HTTP-Server, können Sie es nicht gesetzt in Ausdruck bringen, so dass Sie den hTTPS-Server-Befehl

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

Express ist im Grunde ein Wrapper von http-Modul verwenden müssen, die für die Leichtigkeit der Entwickler in einer solchen Art und Weise, die erstellt wird ..

  1. Sie können Middlewares einrichten, um auf HTTP-Anfragen (einfach) mit Express zu reagieren.
  2. Sie können HTML-Seiten basierend auf übergebenen Argumenten dynamisch an Vorlagen mithilfe von express rendern.
  3. Sie können auch Routing einfach mit Express definieren.
2

Ich kam mit der gleichen Frage, aber nach Google, fand ich es keinen großen Unterschied :)

Von Github

Wenn Sie beide einen HTTP erstellen möchten und HTTPS-Server, den Sie dies tun, können mit die "http" und "https" Module wie hier gezeigt.

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

auch wollen, wenn Sie die Arbeit mit socket.io sehen ihre example

Siehe this

Ich ziehe app.listen() :)

7

Gerade für Pünktlichkeit Zweck und ein wenig Tim Antwort zu verlängern.
Von official documentation:

Die App per Express() zurück ist in der Tat eine JavaScript-Funktion, SOLLEN zu Knoten HTTP-Server als Callback Anfragen bearbeiten weitergegeben.

Dies macht es einfach HTTP- und HTTPS-Versionen Ihrer App mit der gleichen Code-Basis zur Verfügung zu stellen, da die App erbt nicht von diesen (es ist einfach eine Rückruf):

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

die app.listen() Methode einhttp.Server kehrt Objekt und (für HTTP) ist eine bequeme Methode für die followi ng:

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

Bitte erklären Sie ein wenig mehr auf dem zweiten Stück Code.Was genau meinen Sie mit einer Bequemlichkeitsmethode hier? –

+0

@AakashVerma Dies ist nur ein Teil des Quellcodes von exress, der in 'express/lib/appplication.js' gefunden werden kann und nichts anderes als eine Verknüpfung zum Erstellen des HTTP-Servers eines Knotens. –

+0

Sie meinen also, dass, wenn wir App per Express() als Callback verwenden, es die Anfrage vom äußeren HTTP-Server (entweder über 80 oder 443) empfängt und dann einen anderen virtuellen Server http.Server in sich erstellt und verwendet die an ihn weitergeleiteten Anfragen anhören? –