Was ist Connect, Express und Middleware von Node.js?

634

Obwohl ich JavaScript recht gut kenne, bin ich verwirrt, was genau diese drei Projekte in Node.js Ökosystem tun. Ist es so etwas wie Rails 'Rack? Kann mir bitte jemand erklären?

tillda
quelle
1
Ich habe connect nicht verwendet, aber auf dieser Seite klingt es sicher analog zu Rails 'Rack. Verstehst du, was Middleware außerhalb des Node-Kontexts ist?
Matt Ball
Ehrlich gesagt, nicht so sehr, wie ich möchte. Soweit ich weiß, ist es die Ebene, die alle Pre-App-Dinge wie Routing, Gzipping, Header, Cookies erledigt. Habe ich recht? Funktioniert es also so, dass das Routing zum richtigen MVC-Controller / zur richtigen MVC-Aktion nicht innerhalb des MVC-Frameworks (wie Rails), sondern in der Middleware erfolgt?
Bis zum
8
Dies wird alle Ihre Zweifel löschen und viele weitere Fragen beantworten, die Sie haben. Ich verstehe, dass es zu spät ist (hoffentlich scrollt jemand nach unten ...), aber das Lesen des folgenden Blog-Artikels wird alle Fragen klären, die Sie zu Connect, Express und Middleware haben . Es bringt Ihnen auch ein bisschen über Node.js bei. http://evanhahn.com/understanding-express/
DotNetInfo
@DiegoCaxito Dein Link ist kaputt.
Mast

Antworten:

891

[ Update: Ab Version 4.0 verwendet Express Connect nicht mehr. Express ist jedoch weiterhin mit der für Connect geschriebenen Middleware kompatibel. Meine ursprüngliche Antwort ist unten.]

Ich bin froh, dass Sie danach gefragt haben, denn es ist definitiv ein häufiger Punkt der Verwirrung für Leute, die sich Node.js ansehen. Hier ist mein bester Versuch, es zu erklären:

  • Node.js selbst bietet ein http- Modul an, dessen createServerMethode ein Objekt zurückgibt, mit dem Sie auf HTTP-Anforderungen antworten können. Dieses Objekt erbt den http.ServerPrototyp.

  • Connect bietet auch eine createServerMethode, die ein Objekt zurückgibt, das eine erweiterte Version von erbt http.Server. Die Erweiterungen von Connect dienen hauptsächlich dazu, das Einstecken von Middleware zu vereinfachen . Aus diesem Grund bezeichnet sich Connect als "Middleware-Framework" und wird häufig mit Ruby's Rack analogisiert.

  • Express macht, um zu verbinden, was Connect mit dem http-Modul macht: Es bietet eine createServerMethode, die den ServerPrototyp von Connect erweitert . Damit stehen alle Funktionen von Connect sowie das Rendern von Ansichten und ein praktisches DSL zur Beschreibung von Routen zur Verfügung. Rubys Sinatra ist eine gute Analogie.

  • Dann gibt es noch andere Frameworks, die noch weiter gehen und Express erweitern! Zappa zum Beispiel, das die Unterstützung für CoffeeScript, serverseitige jQuery und Tests integriert.

Hier ist ein konkretes Beispiel dafür, was unter "Middleware" zu verstehen ist: Standardmäßig werden keine der oben genannten Dateien für Sie bereitgestellt. Aber werfen Sie einfach ein connect.static(eine Middleware, die mit Connect geliefert wird), die so konfiguriert ist, dass sie auf ein Verzeichnis verweist, und Ihr Server bietet Zugriff auf die Dateien in diesem Verzeichnis. Beachten Sie, dass Express auch die Middleware von Connect bereitstellt. express.staticist das gleiche wie connect.static. (Beide waren staticProviderbis vor kurzem bekannt.)

Mein Eindruck ist, dass die meisten "echten" Node.js-Apps heutzutage mit Express entwickelt werden. Die hinzugefügten Funktionen sind äußerst nützlich, und alle Funktionen der unteren Ebene sind weiterhin verfügbar, wenn Sie dies wünschen.

Trevor Burnham
quelle
130
Eine Sache, die mich an Connect stört, ist, dass die Dokumentation nicht zu bestätigen scheint, dass Node mehr als ein HTTP-Server ist. "Connect ist ein Middleware-Framework für Node.js" - nein, "Connect ist ein Middleware-Framework für den HTTP-Server von Node.js"
schlank
46
@slim Ich denke du liest zu viel hinein. Die Macher von Connect sind herausragende Node-Entwickler. Sie wissen genau, dass Node mehr als ein HTTP-Server ist. Aber es tut haben einen HTTP - Server integriert, und Connect ist eine Middleware Framework , dass Sie in Ihrer Node.js App nutzen können.
Trevor Burnham
22
Oh, ich bin sicher, die Macher von Connect sind sich dessen voll bewusst. Ohne ein gründliches Verständnis von Node hätten sie nicht erreichen können, was sie haben. Aber die Wortwahl ist für Neulinge in Node verwirrend. und an Neulinge zu Connect.
schlank
10
kristallklar, wonach alle Antworten streben sollten. Hervorragende Arbeit Trevor.
Mark Essel
6
Tolle Erklärung. Antworten wie diese helfen dabei, neue Leute in das Node.js-Ökosystem zu bringen. Für Leute, die sich mit der Entwicklung von Web-Apps in Node.js vertraut machen, ist Express der Ausgangspunkt. Um die Ruby-Analogie fortzusetzen, ist Express mit Sinatra vergleichbar. Es eignet sich besonders zum Erstellen von JSON-APIs für clientseitige Ajax-Apps. Eine Sache, die ich gefunden habe, ist, dass, sobald eine Anwendung eine bestimmte Komplexität erreicht, eine andere Ebene benötigt wird, die eher Rails ähnelt. Zu diesem Zweck arbeite ich an Locomotive , die weitere Schichten auf Express aufbauen.
Jared Hanson
159

Die akzeptierte Antwort ist wirklich alt (und jetzt falsch). Hier sind die Informationen (mit Quelle) basierend auf der aktuellen Version von Connect (3.0) / Express (4.0).

Womit Node.js kommt

http / https, createServer das einfach einen Rückruf entgegennimmt (req, res), z

var server = http.createServer(function (request, response) {

    // respond
    response.write('hello client!');
    response.end();

});

server.listen(3000);

Was verbinden fügt hinzu

Middleware ist im Grunde jede Software, die sich zwischen Ihrem Anwendungscode und einer Low-Level-API befindet. Connect erweitert die integrierte HTTP-Serverfunktionalität und fügt ein Plugin-Framework hinzu. Die Plugins fungieren als Middleware und Connect ist daher ein Middleware-Framework

Die Art und Weise, wie das gemacht wird, ist ziemlich einfach ( und tatsächlich ist der Code wirklich kurz! ). Sobald Sie anrufen, erhalten var connect = require('connect'); var app = connect();Sie eine Funktion app, die:

  1. Kann eine Anfrage bearbeiten und eine Antwort zurückgeben. Dies liegt daran, dass Sie diese Funktion grundsätzlich erhalten
  2. Hat eine Mitgliedsfunktion .use( Quelle ) zum Verwalten von Plugins ( die von hier aufgrund dieser einfachen Codezeile stammt ).

Aufgrund von 1.) können Sie Folgendes tun:

var app = connect();

// Register with http
http.createServer(app)
    .listen(3000);

Kombinieren Sie mit 2.) und Sie erhalten:

var connect = require('connect');

// Create a connect dispatcher
var app = connect()
      // register a middleware
      .use(function (req, res, next) { next(); });

// Register with http
http.createServer(app)
    .listen(3000);

Connect bietet eine Dienstprogrammfunktion, mit httpder Sie sich registrieren können, damit Sie nicht anrufen müssen http.createServer(app). Es wird aufgerufen listenund der Code erstellt einfach einen neuen http-Server, registriert die Verbindung als Rückruf und leitet die Argumente an weiter http.listen. Aus der Quelle

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

Sie können also Folgendes tun:

var connect = require('connect');

// Create a connect dispatcher and register with http
var app = connect()
          .listen(3000);
console.log('server running on port 3000');

Es ist immer noch dein gutes Alter http.createServermit einem Plugin-Framework an der Spitze.

Was ExpressJS hinzufügt

ExpressJS und Connect sind parallele Projekte. Connect ist nur ein Middleware-Framework mit einer schönen useFunktion. Express hängt nicht von Connect ab ( siehe package.json ). Es macht jedoch alles, was verbindet, dh:

  1. Kann mit createServerlike connect registriert werden , da es auch nur eine Funktion ist, die ein req/ respair ( Quelle ) annehmen kann .
  2. Eine Use-Funktion zum Registrieren von Middleware .
  3. Eine Dienstprogrammfunktion listen, um sich bei http zu registrieren

Zusätzlich zu den Funktionen von connect (die Duplikate ausdrücken) bietet es eine Reihe weiterer Funktionen. z.B

  1. Hat Ansicht Motorunterstützung .
  2. Hat Verben der obersten Ebene (get / post usw.) für seinen Router .
  3. Hat Anwendungseinstellungen Unterstützung.

Die Middleware wird gemeinsam genutzt

Die useFunktion von ExpressJS und Connect ist kompatibel und daher wird die Middleware gemeinsam genutzt . Beide sind Middleware-Frameworks, Express hat nur mehr als ein einfaches Middleware-Framework .

Welches solltest du verwenden?

Meine Meinung: Sie sind ausreichend informiert, um Ihre eigene Wahl zu treffen.

  • Verwenden http.createServerSie diese Option, wenn Sie etwas wie connect / expressjs von Grund auf neu erstellen.
  • Verwenden Sie connect, wenn Sie Middleware erstellen, Protokolle testen usw., da dies eine nette Abstraktion ist http.createServer
  • Verwenden Sie ExpressJS, wenn Sie Websites erstellen.

Die meisten Leute sollten nur ExpressJS verwenden.

Was ist falsch an der akzeptierten Antwort?

Dies mag zu einem bestimmten Zeitpunkt wahr gewesen sein, aber jetzt falsch:

das erbt eine erweiterte Version von http.Server

Falsch. Es erweitert es nicht und wie Sie gesehen haben ... verwendet es

Express verbindet sich mit Connect mit dem http-Modul

Express 4.0 hängt nicht einmal von der Verbindung ab. Weitere Informationen finden Sie im aktuellen Abschnitt zu den Abhängigkeiten von package.json

Basarat
quelle
Sie sagen, gibt Ihnen die Möglichkeit, eine Anfrage zu bearbeiten und eine Antwort zurückzugeben, aber die Leute sagen, dass Express wirklich der Webserver ist ... Ich bin verwirrt. Würde das Zurücksenden einer Antwort keine Webserverfunktion (wie Express) erfordern?
PositiveGuy
1
gute Sachen, danke! Sehr hilfreich ... vor allem, wenn man nicht weiß, dass Connect wirklich das Routing bereitstellt, und Express erbt nur, dass es nicht der einzige / Quellanbieter für Routing ist. Und die Anwendungsfälle am Ende sind hilfreich, da ich davon ausgegangen bin, dass ich Connect AND Express verwenden muss, aber wirklich alles, was Sie verwenden müssen, ist Express für Web-Apps. Dies hat eine große Sache für mich geklärt. Sie installieren nicht beide, Sie installieren den einen oder anderen!
PositiveGuy
Ihre Antwort sollte oben sein. Als ich die akzeptierte Antwort gelesen habe, habe ich sie positiv bewertet. Aber nachdem Sie Ihre Antwort gelesen haben ... naahhh
Arun Joshla
67

node.js

Node.js ist ein Javascript-Motor für die Serverseite.
Zusätzlich zu allen js-Funktionen umfasst es Netzwerkfunktionen (wie HTTP) und den Zugriff auf das Dateisystem.
Dies unterscheidet sich von clientseitigen js, bei denen die Netzwerkaufgaben vom Browser monopolisiert werden und der Zugriff auf das Dateisystem aus Sicherheitsgründen verboten ist.

node.js als Webserver: express

Etwas, das auf dem Server ausgeführt wird, HTTP versteht und auf Dateien zugreifen kann, klingt wie ein Webserver. Aber es ist keiner.
Damit sich node.js wie ein Webserver verhält, muss es programmiert werden: Behandeln Sie die eingehenden HTTP-Anforderungen und geben Sie die entsprechenden Antworten ein.
Dies ist, was Express tut: Es ist die Implementierung eines Webservers in js.
Das Implementieren einer Website entspricht dem Konfigurieren von Express-Routen und dem Programmieren der spezifischen Funktionen der Website.

Middleware und Connect

Das Bereitstellen von Seiten umfasst eine Reihe von Aufgaben. Viele dieser Aufgaben sind bekannt und sehr häufig, sodass das Connect- Modul des Knotens (eines der vielen Module, die unter dem Knoten ausgeführt werden können) diese Aufgaben implementiert.
Sehen Sie sich das aktuelle beeindruckende Angebot an:

  • Logger Request Logger mit Unterstützung für benutzerdefinierte Formate
  • csrf Standortübergreifender Schutz vor Fälschungen
  • Komprimieren Sie die Gzip-Komprimierungs-Middleware
  • basicAuth grundlegende http-Authentifizierung
  • bodyParser erweiterbarer Anforderungs-Body-Parser
  • JSON- Anwendung / JSON-Parser
  • urlencodierte Anwendung / x-www-form-urlencodierter Parser
  • mehrteiliger mehrteiliger / Formulardaten-Parser
  • Timeout- Anforderungs-Timeouts
  • cookieParser Cookie-Parser
  • Sitzung Session - Management - Unterstützung mit gebündelten Memorys
  • CookieSession Cookie-basierte Sitzungsunterstützung
  • methodOverride- Unterstützung für falsche HTTP-Methoden
  • responseTime berechnet die Antwortzeit und macht sie über die X-Response-Zeit verfügbar
  • statische Cache-Speicher-Cache-Schicht für die statische () Middleware
  • statisches Streaming statischer Dateiserver, der Range und mehr unterstützt
  • Verzeichnis Verzeichnis Listing Middleware
  • vhost Virtual Domain Subdomain -Mapping-Middleware
  • Favicon effizienter Favicon Server (mit Standardsymbol)
  • limit limit die Bytesize von Anforderungskörpern
  • Abfrage des automatischen Querystring-Parsers, der die req.query ausfüllt
  • errorHandler flexibler Fehlerhandler

Connect ist das Framework und über dieses können Sie die (Sub-) Module auswählen, die Sie benötigen.
Auf der Seite Contrib Middleware wird eine lange Liste zusätzlicher Middlewares aufgeführt .
Express selbst wird mit den gängigsten Connect-Middlewares geliefert.

Was ist zu tun?

Installieren Sie node.js.
Der Knoten wird mit npm , dem Knotenpaketmanager, geliefert .
Der Befehl npm install -g expresslädt Express global herunter und installiert es (siehe Express-Anleitung ).
Wenn Sie express fooin einer Befehlszeile (nicht im Knoten) ausgeführt werden, wird eine sofort einsatzbereite Anwendung mit dem Namen foo erstellt. Wechseln Sie in das (neu erstellte) Verzeichnis und führen Sie es mit dem Befehl mit dem Knoten aus. node <appname>Öffnen Sie dann http://localhost:3000und sehen Sie. Jetzt bist du drin.

Juan Lanus
quelle
3
tolle antwort danke. Dies ist die Art von einfachem Mist, den jeder Blog-Beitrag vermisst, das einfache Setup, das sein kann ??? wenn du es noch nie gemacht hast. Ja, es ist einfach, wenn Sie es bereits getan haben, aber Sie haben keine Ahnung, wie Sie zum ERSTEN Mal anfangen sollen! Ich hasse es, wenn Entwickler übersehen, dass es in Blog-Posts wichtig ist. Ich möchte keinen weiteren Blog-Beitrag finden müssen, um das Setup zu finden. Geben Sie einfach einen Link zu einem anderen Blog-Beitrag in Ihren anderen Beiträgen an. Das ist äußerst hilfreich, damit ich nicht nach einem suchen muss. Rette mich die Jagdreise!
PositiveGuy
3
Express 4.0.0 muss sudo npm installieren -g Express-Generator
mohamed-ibrahim
@getsetbro du meinst nur 'npm install', um die Abhängigkeiten zu installieren.
Torsten Barthel
16

Connect bietet eine "übergeordnete" API für allgemeine HTTP-Serverfunktionen wie Sitzungsverwaltung, Authentifizierung, Protokollierung und mehr. Express basiert auf Connect mit erweiterten (Sinatra-ähnlichen) Funktionen.

yojimbo87
quelle
0

Node.jsselbst bietet ein HTTP-Modul an, dessen createServer- Methode ein Objekt zurückgibt, mit dem Sie auf HTTP-Anforderungen antworten können. Dieses Objekt erbt den http.ServerPrototyp.

Suraj Kumar Yadav
quelle
0

Zugehörige Informationen, insbesondere wenn Sie NTVS für die Arbeit mit der Visual Studio-IDE verwenden. Das NTVS fügt Visual Studio 2012, 2013 sowohl NodeJS- als auch Express-Tools, Gerüste und Projektvorlagen hinzu.

Außerdem ist das Wort, das ExpressJS oder Connect als "WebServer" aufruft, falsch. Sie können einen einfachen WebServer mit oder ohne diese erstellen. Ein grundlegendes NodeJS-Programm kann das http-Modul auch zur Verarbeitung von http-Anforderungen verwenden und wird so zu einem rudimentären Webserver.

Vic
quelle
0

Middleware, wie der Name schon sagt, Middleware befindet sich zwischen Mitte .. Mitte von was? Mitte der Anfrage und Antwort. Wie Anfrage, Antwort, Express-Server in der Express-App sitzen. In diesem Bild sehen Sie, dass Anfragen vom Client kommen. Dann bedient der Express-Server-Server diese Anfragen. Dann lassen Sie uns tiefer gehen. Eigentlich können wir dies teilen Die gesamte Aufgabe des gesamten Express-Servers in kleine separate Aufgaben wie diese. Wie Middleware zwischen Anforderung und Antwort sitzt Kleiner Teil der Serverteile, die eine bestimmte Aufgabe ausführen und die Anforderung an die nächste übergeben. Schließlich wurden alle Aufgaben ausgeführt. Die Antwort wurde ausgeführt. Alle Middleware kann auf das Anforderungsobjekt, das Antwortobjekt und die nächste Funktion der Anforderung zugreifen Reaktionszyklus ..

Dies ist ein gutes Beispiel für die Erklärung von Middleware in Express- YouTube-Videos für Middleware

hasanga lakdinu
quelle
-7

Die blöde einfache Antwort

Connect und Express sind Webserver für NodeJS. Im Gegensatz zu Apache und IIS können beide dieselben Module verwenden, die als "Middleware" bezeichnet werden.

kmiles
quelle