Lernen Sie das Connect Framework kennen

Neulinge bei NodeJS finden ihre API in der Regel schwer zu verstehen. Glücklicherweise haben viele Entwickler Frameworks erstellt, die die Arbeit mit Node erleichtern. Connect ist ein solcher Rahmen. Es sitzt auf der API von Node und zieht die Grenze zwischen Komfort und Kontrolle.

Stellen Sie sich Connect als einen Stapel Middleware vor. Bei jeder Anforderung filtert Connect die Schichten der Middleware, von denen jede die Möglichkeit hat, die HTTP-Anforderung zu verarbeiten. Wenn T.J. Holowaychuk kündigte Connect an, er sagte, es gebe zwei Arten von Middleware. Der erste ist ein Filter.

Filter verarbeiten die Anforderung, reagieren jedoch nicht darauf (denken Sie an die Serverprotokollierung)..

Der andere Typ ist a Anbieter, die auf die Anfrage reagiert. Sie können beliebig viele Middleware-Schichten integrieren. Die Anforderung durchläuft jede Schicht, bis eine der Middleware auf die Anforderung reagiert.


Grundlegende Syntax

Zunächst müssen Sie das Connect-Paket über npm installieren:

npm install connect

Erstellen Sie jetzt eine server.js Datei und fügen Sie den folgenden Code hinzu:

var connect = erfordern ("verbinden");

Das verbinden Variable ist eine Funktion, die eine neue Connect-Anwendung zurückgibt. Unser nächster Schritt ist also das Erstellen dieser App:

var app = connect ();

Sie müssen keine erstellen App Variable für die meisten Ihrer Anwendungen. Die Funktionen zum Erstellen einer Anwendung (verbinden() und benutzen()sind kettenfähig:

connect () .use (/ * Middleware * /) .use (/ * Middleware * /) .listen (3000);

Das benutzen() Funktion fügt der Anwendung eine Middleware-Schicht hinzu und die Hör mal zu() Funktion teilt unserer Anwendung mit, dass sie an dem angegebenen Port (3000 in diesem Beispiel) Verbindungen annehmen darf.

Beginnen wir mit etwas Einfachem: Protokollierung. Der Code für eine Connect-Anwendung, die nur die Protokollierungs-Middleware verwendet, ist ziemlich einfach:

connect () .use (connect.logger ()) .listen (3000);

Standardmäßig analysiert Node die eingehende Anforderung nur sehr wenig.

Fügen Sie der Datei diesen Code hinzu und starten Sie den Server, indem Sie ihn ausführen Knoten server.js. Navigieren Sie zu einem beliebigen Pfad in Ihrem Browser und ignorieren Sie die Ergebnisse "Can GET…". Wir sind nicht daran interessiert, was der Server an den Browser zurücksendet. Wir interessieren uns für das Serverprotokoll. Schauen Sie sich das Terminal an und Sie sehen das Protokoll Ihrer Anfragen. Lesen Sie in der Logger-Dokumentation nach Informationen zu anderen Funktionen und Anpassungen.

Das war ein Filter. Jetzt schauen wir uns einen Anbieter an. Der einfachste Anbieter ist der statische Anbieter. Es dient statischen Dateien aus einem angegebenen Ordner. Hier ist seine Syntax:

.use (connect.static (__ dirname + "/ public")

Sie können wahrscheinlich den Zweck von Nodes erraten __dirname Variable: Dies ist der Pfad zum aktuellen Verzeichnis. Diese Middleware dient statisch alles aus einem Öffentlichkeit Ordner im aktuellen Verzeichnis. Also erstellen public / page.html und füge eine hinzu

Element. Starten Sie den Server neu (Knoten server.js) und navigiere zu localhost: 3000 / page.html in Ihrem Browser Du solltest page.html im Browser dargestellt.

Lassen Sie uns nun einen kurzen Blick auf einige der anderen Middleware-Optionen von Connect werfen.


Analysieren von Anforderungskörpern

Standardmäßig analysiert Node nur sehr wenig der eingehenden Anforderung. Sie können jedoch mehrere verschiedene Filter zum Analysieren der Anforderung verwenden, wenn Sie mit mehr Komplexität umgehen möchten. Es gibt vier Filter:

  • connect.json () analysiert JSON-Anfragekörper (wobei die Inhaltstyp ist Anwendung / Json).
  • connect.urlencoded () Parses x-ww-form-urlencoded Antragsstellen.
  • connect.multipart () Parses Multipart / Formulardaten Antragsstellen.
  • connect.bodyParser () ist eine Abkürzung für die Aktivierung aller drei oben genannten.

Mit einem dieser Filter haben Sie die Möglichkeit, über Ihren geparsten Körper auf zuzugreifen request.body (Wir werden darüber reden, wie man das bekommt anfordern Objekt bald).

Ich denke, diese Filter sind ein gutes Beispiel dafür, wie Sie Ihre Steuerung mit Connect verfeinern können. Sie können sehr wenig Verarbeitungsaufwand verwenden, um Ihre Anwendung zu rationalisieren.


Parsing Cookies und Sitzungen

Cookies und Sitzungen sind ein wichtiger Bestandteil jeder Webanwendung, und es gibt mehrere Middleware-Elemente, die sie verwalten. Das connect.cookieParser () analysiert Cookies für Sie, und Sie können die Cookies und ihre Werte über den Browser abrufen request.cookies Objekt. Dies ist sinnvoller, wenn Sie das hinzufügen connect.session () filtern Sie zu Ihrer App. Für diesen Filter muss der Cookie-Parser bereits installiert sein. Hier ist ein kleines Beispiel:

connect () .use (connect.cookieParser ()) .use (connect.session (geheim: 'irgendein geheimer Text', Cookie: maxAge: 30000))) .use (function (req, res) var sess = req.session, url = req.url.split ("/"); if (url [1] == "name" && url [2]) sess.name = url [2]; res.end (" Name gespeichert: "+ url [2]); else if (sess.name) res.write (" sitzungsgespeicherter Name: "+ sess.name); res.end (" für ein anderes gespeichert: "+ (sess.) .cookie.maxAge / 1000) + "sekunden"); else res.end ("Kein gespeicherter Name; gehe zu / name / name, um einen Namen zu speichern");). listen (3000);

Jede Middleware-Funktion, die Sie schreiben, muss entweder die Anforderung an die Nächster Schicht oder antworten Sie auf die Anfrage.

Nach dem cookieParser, wir schließen das ein Session filtern und übergeben Sie eine zwei Optionen:

  • Das Geheimnis erstellt ein signiertes Cookie, das die Sitzung aufzeichnet.
  • Das cookie.maxAge definiert seine Lebensdauer in Millisekunden; Die 30000 in diesem Code beträgt 30 Sekunden.

Im Finale benutzen() Aufruf übergeben wir eine Funktion, die auf die Anfrage reagiert. Wir verwenden zwei Eigenschaften aus der anfordern Objekt: req.session für Sitzungsdaten und req.url für die Anforderungs-URL.

Wenn die Anwendung eine Anfrage erhält / name / irgendein_name, dann speichert es den Wert some_name im req.session.name. Alles, was in einer Sitzung gespeichert ist, kann in nachfolgenden Anfragen für die Dauer unserer Sitzung abgerufen werden. Alle Anfragen gemacht für / name / sonstiges Ersetzt die Sitzungsvariable und alle Anforderungen an andere URLs geben den Wert der Sitzungsvariablen und die verbleibende Zeit für die Sitzung aus.

Sie können also zu navigieren localhost: 3000 / name / ihr_name, und dann zu localhost: 3000 sehen dein Name. Aktualisieren Sie die Seite einige Male und beobachten Sie, wie die Sekunden heruntergezählt werden. Wenn die Sitzung abläuft, wird die Standardnachricht "Kein gespeicherter Name" angezeigt.

Ich habe das erwähnt cookieParser Filter muss vorher kommen Session.

Die Reihenfolge des Einschlusses ist bei Middleware wichtig, da die Anforderung in der Reihenfolge von Schicht zu Schicht weitergeleitet wird.

weil Session Benötigt die geparsten Cookie-Daten, muss die Anforderung durchlaufen werden cookieParser Vor Session.

Ich könnte jede andere integrierte Middleware erklären, aber ich werde nur ein paar mehr erwähnen, bevor wir unseren eigenen Code schreiben, um mit Connect zu kommunizieren.

  • Komprimieren: Gzip-Komprimierungs-Middleware
  • basicAuth: grundlegende HTTP-Authentifizierung
  • Verzeichnis: Verzeichnis mit Middleware
  • errorHandler: flexibler Fehlerbehandler

Eigene Middleware schreiben

Sie haben gerade gelernt, wie Sie mit Connect Ihren eigenen Code schreiben. Hier noch einmal die grundlegende Syntax:

.use (Funktion (req, res, next) )

Die drei Parameter der Funktion sind wichtig. Sie bieten Zugang zur Außenwelt. Das req Parameter ist natürlich das Anforderungsobjekt und res ist die Antwort. Der dritte Parameter, Nächster, ist der Schlüssel zum Erstellen von Funktionen, die im Middleware-Stack gut funktionieren. Diese Funktion leitet die Anforderung an die nächste Middleware im Stack weiter. Siehe dieses Beispiel:

connect () .use (function (req, res, next) if (req.method === 'POST') res.end ("Dies ist eine POST-Anforderung"); else next (); ) .use (Funktion (req, res) res.end ("Dies ist keine POST-Anforderung (wahrscheinlich eine GET-Anforderung)");). listen (3000);

Dieser Code verwendet zwei Middleware-Funktionen. Die erste Funktion überprüft die Anforderungsmethode, um festzustellen, ob es sich um eine POST-Anforderung handelt. Wenn dies der Fall ist, antwortet es, indem er es sagt. Ansonsten rufen wir an Nächster() und leiten Sie die Anfrage an die nächste Funktion weiter, die auf jeden Fall antwortet. Benutzen locken um beide Schichten im Terminal zu testen:

$ curl http: // localhost: 3000 Dies ist keine POST-Anforderung (wahrscheinlich eine GET-Anforderung). $ curl -X POST http: // localhost: 3000 Dies ist eine POST-Anforderung

Wenn Sie das Terminal nicht mögen, probieren Sie dieses nützliche Chrome-Plugin aus.

Es ist wichtig zu wissen, dass jede Middleware-Funktion, die Sie schreiben, entweder die Anforderung an den Server übergeben muss Nächster Schicht oder antworten Sie auf die Anfrage. Wenn Ihre Funktion verzweigt (über if-Anweisungen oder andere Bedingungen), müssen Sie sicherstellen, dass jeder Zweig die Anforderung weiterleitet oder darauf reagiert. Wenn Ihre App im Browser hängt, liegt dies wahrscheinlich daran, dass Sie vergessen haben, anzurufen Nächster() irgendwann.

Nun, was ist mit diesen anfordern und Antwort Parameter? Dies sind genau die gleichen Anforderungs- und Antwortobjekte, die Sie erhalten, wenn Sie einen "rohen" Knotenserver verwenden:

required ("http"). createServer (function (req, res) //…). listen (3000);

Wenn Sie die Server-API von Node noch nicht verwendet haben, lassen Sie mich Ihnen zeigen, was Sie damit tun können.


Das Anforderungsobjekt

Das anfordern Objekt ist eigentlich ein http.IncomingMessage Das Objekt und seine wichtigen Eigenschaften sind unten aufgeführt:

  • erforderliche Methode gibt an, welche HTTP-Methode verwendet wurde.
  • req.url gibt an, welche URL angefordert wurde.
  • req.headers ist ein Objekt mit den Namen und Werten der Header.
  • req.query ist ein Objekt mit beliebigen Daten in einer Abfragezeichenfolge (um dies zu analysieren, benötigen Sie das connect.query () Middleware an Ort und Stelle).
  • req.body ist ein Objekt der Formulardaten (Sie benötigen eine Middleware für die Körperanalyse).
  • rec.cookies ist ein Objekt der Cookie-Daten (erfordert das Parsing von Cookies).
  • req.session ist ein Objekt der Sitzungsdaten (wiederum benötigen Sie Cookie-Analyse und Sitzungs-Middleware)

Sie können all das bei der Arbeit mit dem folgenden Code sehen:

connect () .use (connect.query ()) // gibt uns req.query .use (connect.bodyParser ()) // gibt uns req.body .use (connect.cookieParser ()) // für die Session .use (connect.session (secret: "asdf")) // gibt uns req.session .use (Funktion (req, res) res.write ("req.url:" + req.url + "\ n \ n "); res.write (" req.method: "+ req.method +" \ n \ n "); res.write (" req.headers: "+ JSON.stringify (req.headers) +" \ n \ n "); res.write (" req.query: "+ JSON.stringify (req.query) +" \ n \ n "); res.write (" req.body: "+ JSON.stringify (req. body) + "\ n \ n"); res.write ("req.cookies:" + JSON.stringify (req.cookies) + "\ n \ n"); res.write ("req.session:" + JSON.stringify (req.session)); res.end ();). Listen (3000);

Um etwas für jeden dieser Werte zu sehen, müssen Sie einige Daten mit einer Abfragezeichenfolge an eine URL senden. Folgendes sollte ausreichen:

curl -X POST -d "name = IhrName" "http: // localhost: 3000 / some / url? some = data"

Mit diesen sieben Eigenschaften können Sie nahezu jede Anfrage verwalten, die Sie erhalten. Ich glaube nicht, dass Anhänger häufig verwendet werden (ich habe sie meiner Erfahrung nach nie gesehen), aber Sie können sie verwenden benötigte Anhänger wenn Sie sie in Ihren Anfragen erwarten (Anhänger sind wie Kopfzeilen, aber nach dem Körper).

Wie sieht es mit Ihrer Antwort aus??


Das Antwortobjekt

Das rohe Antwortobjekt bietet nicht den Luxus, den Bibliotheken (wie Express) bieten. Sie können beispielsweise nicht mit einem einfachen Renderaufruf auf eine vorgefertigte Vorlage antworten - zumindest nicht standardmäßig. In der Antwort wird sehr wenig angenommen. Sie müssen also alle kleinen Details angeben.

Wir beginnen mit dem Statuscode und den Antwortheatern. Sie können diese mit der Taste auf einmal einstellen writeHead () Methode. Hier ist ein Beispiel aus den Node-Dokumenten:

var body = "Hallo Welt"; response.writeHead (200, 'Content-Length': body.length, 'Content-Type': 'text / plain');

Wenn Sie Kopfzeilen individuell festlegen müssen, können Sie die verwenden setHeader () Methode:

connect () .use (function (req, res) var accept = req.headers.accept.split (","), body, type; console.log (accept); if (accept.indexOf ("application / json.) ")> -1) type =" application / json "; body = JSON.stringify (message:" hello "); else if (accept.indexOf (" text / html ")> -1) type = "text / html"; body = "

Hallo!

"; else type =" text / plain "; body =" hallo! "; res.statusCode = 200; res.setHeader (" Content-Type ", type); res.end (body);). hör zu (3000);

Fügen Sie diesen Code zu einer Datei hinzu, starten Sie den Server und fordern Sie ihn vom Browser an. Sie haben HTML! Jetzt ausführen:

curl http: // localhost: 3000

Und Sie erhalten Klartext. Versuchen Sie Folgendes für JSON:

curl -H "akzeptieren: application / json" http: // localhost: 3000

Alle von derselben URL!

Benutzen res.getHeader (Name) Wenn Sie wissen möchten, welche Header bereits gesetzt wurden. Sie können auch verwenden res.removeHeader (Name) einen Header entfernen.

Natürlich ist eine Antwort ohne Körper unbrauchbar. Wie Sie in diesem Lernprogramm gesehen haben, können Sie Daten mit dem Text in den Körper schreiben res.write () Methode. Dies akzeptiert einen String oder ein Pufferobjekt als Argument. Wenn es sich um eine Zeichenfolge handelt, ist der zweite Parameter der Codierungstyp (Standardeinstellung ist) utf8).

Das erneut senden() Die Methode schließt den Hauptteil, aber Sie können Daten an ihn übergeben, um in den Antwortstream zu schreiben. Dies ist in Situationen hilfreich, in denen Sie nur eine einzige Zeile ausgeben müssen.


Middleware von Drittanbietern

Es ist etwas schwierig, mit größeren HTML-Körpern in einfachem alten Knoten und Connect zu antworten. Dies ist ein guter Ort, um Middleware von Drittanbietern zu verwenden. Eine Liste der Middleware von Drittanbietern finden Sie im Connect Github-Wiki. Als Beispiel verwenden wir das Paket connect-jade, mit dem wir Jade-Ansichten darstellen können.

Installieren Sie zuerst Connect-Jade:

npm installiere Connect-Jade

Als nächstes fordern Sie es an und fügen Sie es als Middleware hinzu. Sie möchten einige Standardwerte festlegen:

var connect = requir ("connect"), connectJade = required ("connect-jade"); connect () .use (connectJade (root: __dirname + "/ views", Standardeinstellungen: title: "MyApp"))) .use (function (req, res) res.render ("index", head : "Willkommen bei meiner App");). Listen (3000);

Legen Sie das Stammverzeichnis als das Verzeichnis fest, das die Ansichtsdateien enthält. Sie können auch einstellen Standardeinstellungen; Dies sind Variablen, die in jeder Ansicht verfügbar sind, es sei denn, wir werden sie beim Aufruf später überschreiben machen().

Die letzte Funktion in diesem Code ruft an res.render (). Diese Methode wird vom bereitgestellt Connect-Jade Paket.

Das erste Argument, das akzeptiert wird, ist der Name der Ansicht, die gerendert werden soll.

Es ist der Weg zur Aussicht, Sans der Pfad, den wir beim Hinzufügen der Middleware definiert haben, Sans die Jade-Dateierweiterung. Für diesen Code benötigen wir eine Ansichten / Index.jade Vorlage zum Rendern. Wir werden es einfach halten:

html head title = title body h1 = Überschrift

Wenn Sie mit Jade nicht vertraut sind, rücken wir Tag-Namen ein, um eine HTML-Struktur zu erstellen. Das Gleichheitszeichen ruft den Wert einer JavaScript-Variablen ab. Diese Variablen stammen aus dem Standardeinstellungen Wir richten ein und das (optionale) zweite Parameterobjekt, an das übergeben wird res.render ().

Es gibt viele andere Drittanbieter-Middlewares, die jedoch ähnlich arbeiten. Sie installieren sie über npm, benötigen sie und setzen sie um.


Module als Middleware

Wenn Sie wissen, wie Connect funktioniert, werden Sie feststellen, dass jede Ebene tatsächlich ein Knotenmodul ist - ein sehr intelligentes Design. Wenn Sie Connect für umfangreiche Anwendungen verwenden, ist es ideal, den Code im Knotenmodulformat zu schreiben. Sie könnten eine haben app.js Datei wie folgt:

// app.js module.exports = function (req, res, next) res.end ("das kommt von einem Modul"); ;

Und in deiner server.js:

var connect = requir ("connect"), app = requir ("./ app"); connect () .use (app) .listen (3000);

Fazit

Wenn Sie eine anfängerfreundliche Bibliothek suchen, die das Erstellen großer Web-Apps vereinfacht, ist Connect nicht Ihre Lösung. Connect ist eine dünne Schicht auf der rohen Node-API, mit der Sie die vollständige Kontrolle über Ihre Serveranwendung erhalten. Wenn Sie etwas mehr wollen, empfehle ich Express (von den gleichen Leuten übrigens). Ansonsten ist Connect eine fantastische, erweiterbare Bibliothek für Node-Webanwendungen.