1. Installation
Kopieren Sie den Code wie folgt: $ npm Installieren Sie Express
Oder verwenden Sie ausführbare Express (1) überall, um zu installieren:
Kopieren Sie den Code wie folgt:/# Übersetzer Hinweis: Diese Methode ist dringend empfohlen
$ npm install -g express
2. Starten Sie schnell an
Der schnellste Weg, um mit Express zu beginnen, besteht darin, die ausführbare Datei Express (1) zu verwenden, um eine Anwendung zu generieren, wie unten gezeigt:
Erstellen Sie eine App:
Die Codekopie lautet wie folgt:
$ npm install -g express
$ express /tmp /foo && cd /tmp /foo
Abhängigkeitspaket installieren:
Die Codekopie lautet wie folgt:
$ npm install -d
Starten Sie den Server:
Die Codekopie lautet wie folgt:
$ node app.js
3. Erstellen Sie einen Server
Um eine express.httpServer -Instanz zu erstellen, rufen Sie einfach die Methode createServer () auf. Für dieses Anwendungsbeispiel können wir eine Route basierend auf HTTP -Aktionen (HTTP -Verben) definieren, wobei App.get () als Beispiel eingenommen wird:
Die Codekopie lautet wie folgt:
var app = required ('express'). createServer ();
app.get ('/', Funktion (req, res) {
res.send ('Hallo Welt');
});
App.Listen (3000);
4. Erstellen Sie einen HTTPS -Server
Initialisieren Sie eine express.httpSserver -Instanz wie oben. Anschließend übergeben wir ein Konfigurationsobjekt, das Schlüssel, Zertifikat und andere (Eigenschaften/Methoden) akzeptiert, die in der HTTPS -Dokumentation erwähnt werden.
Die Codekopie lautet wie folgt:
var app = required ('express'). createServer ({key: ...});
V. Konfiguration
Express unterstützt jede Umgebung wie die Produktstufe und die Entwicklungsphase. Entwickler können die Methode configure () verwenden, um die aktuelle erforderliche Umgebung festzulegen. Wenn der Anruf bei Configure () keinen Umgebungsnamen enthält, wird er auf dem in allen Umgebungen angegebenen Rückrufe ausgeführt.
Anmerkung des Übersetzers: Aliase wie Produktion/Entwicklung/Bühne können selbst eingenommen werden, wie in App.Configure in application.js gezeigt. Sehen Sie sich das folgende Beispiel für die tatsächliche Verwendung an.
Das folgende Beispiel in der Entwicklungsstufe nur DIPPExceptions (Wurffehler) und gibt eine Stapelausnahme zurück. In beiden Umgebungen verwenden wir jedoch Methodenoverride und Bodyparser. Achten Sie auf die Verwendung von App.router, mit dem (optional) die Route des Programms geladen werden kann. Darüber hinaus wird die Route zum ersten Mal durch Anruf app.get (), app.post () usw. geladen.
Die Codekopie lautet wie folgt:
app.configure (function () {
app.use (Express.Methodoverride ());
app.use (express.bodyparser ());
app.use (App.router);
});
app.configure ('Entwicklung', function () {
app.use (express.static (__ DirName + '/public'));
app.use (express.ErrorHandler ({DumpExceptions: true, showStack: true}));
});
app.configure ('production', function () {
var Oneyear = 31557600000;
app.use (express.static (__ DirName + '/public', {maxage: oneyear}));
app.use (express.ErrorHandler ());
});
Für ähnliche Umgebungen können Sie mehrere Umgebungszeichenfolgen bestehen:
Die Codekopie lautet wie folgt:
app.configure ('Stage', 'prod', function () {
// config
});
Für alle internen Einstellungen (#) bietet Express -Methoden SET (Schlüssel [, Val]), Enable (Schlüssel) und Deaktivieren (Schlüssel):
Übersetzer Hinweis: Details finden Sie unter: application.js app.set.
Die Codekopie lautet wie folgt:
app.configure (function () {
app.set ('Ansichten', __dirname + '/Ansichten');
app.set ('Ansichten');
// => "/Absolute/Pfad/to/Ansichten"
App.Enable ('einige Funktionen');
// äquivalent zu: app.set ('Einige Funktionen', true);
App.Disable ('einige Funktionen');
// äquivalent zu: app.set ('Einige Funktionen', Falsch);
App.Enabled ('einige Funktionen')
// => false
});
Um die Umgebung zu ändern, können wir node_env -Umgebungsvariablen festlegen, wie z. B.:
Die Codekopie lautet wie folgt:
$ Node_env = production node app.js
Dies ist sehr wichtig, da die meisten Caching -Mechanismen nur während der Produktphase eingeschaltet werden.
6. Einstellungen
Express unterstützt die folgenden Abkürzungseinstellungen (außerhalb der Box):
1.Basepath wird für den Anwendungsbasisweg von res.Redirect () verwendet, der explizit montierte Apps behandelt.
2. View View View Das Standard -Root -Verzeichnis ist CWD/Ansichten
3. View Engine Die Standard -Ansichts -Engine -Verarbeitung (Ansichtsdateien) erfordert nicht die Verwendung von Suffixen
4. View -Cache aktiviert den Ansicht Cache (in der Produktphase aktiviert)
5.Charet Änderungen Codierung, Standard ist UTF-8
6.casse sensitive Routen Fall sensible Routen
7. Nach dem Streit -Routing (in der Route) wird das Ende/wird nicht ignoriert (Übersetzungshinweise: Das heißt, App.get ('/Sofish') und App.get ('/Sofish/') sind unterschiedlich)
8.json -Rückruf aktivieren res.send () / res.json () explizite JSONP -Unterstützung (transparente JSONP -Unterstützung)
7. Routing
Express verwendet HTTP -Aktionen, um eine Reihe von schnellen und ausdrucksstarken Routing -APIs bereitzustellen. Wenn Sie beispielsweise mit einem Konto mit einem Pfad von /user /12 umgehen möchten, können wir die Route wie folgt definieren. Der Wert, den benannte Platzhalter zugeordnet sind, ist durch Req.Params zugänglich.
Die Codekopie lautet wie folgt:
app.get ('/user/: id', function (req, res) {
res.send ('user' + req.params.id);
});
Eine Route ist eine Saite, die intern in regulärer Zusammenstellung zusammengestellt wird. Wenn beispielsweise /Benutzer /: ID kompiliert wird, ist eine vereinfachte Version des regulären Ausdrucks grob wie folgt:
Die Codekopie lautet wie folgt:
// die offizielle Zeichenfolge ändern
/// Benutzer // ([^//]+) //?/
Regelmäßige Ausdrücke können in komplexe Szenarien übergeben und angewendet werden. Da Inhaltsgruppen, die von buchstäblichen regulären Ausdrücken erfasst wurden, anonym sind, können wir direkt über Req.Params auf sie zugreifen. Daher wird der erste Satz von Inhalten, den wir erfassen, wieder anparams [0], während der zweite Satz sofort von Req.params [1] folgt.
Die Codekopie lautet wie folgt:
app.get (/^// Benutzer? (?: // (/d+) (?: /./. (/d+))?)?/, function (req, res) {
Res.Send (req.params);
});
Curl -Anfragen für die obige definierte Route:
Die Codekopie lautet wie folgt:
$ curl http: // dev: 3000/user
[NULL, NULL]
$ curl http: // dev: 3000/user
[NULL, NULL]
$ curl http: // dev: 3000/user/1
["1", null]
$ curl http: // dev: 3000/user/1..15
["1", "15"]
Hier sind einige Beispiele für Routen, die mit Pfaden verbunden sind, die sie verwenden können:
Die Codekopie lautet wie folgt:
"/Benutzer-ID"
/Benutzer/12
"/Benutzer/: ID?"
/Benutzer/5
/Benutzer
"/Dateien/*"
/files/jquery.js
/Files/javascripts/jquery.js
"/Datei/*.*"
/files/jquery.js
/Files/javascripts/jquery.js
"/user/: id/: operation?"
/Benutzer/1
/user/1/bearbeiten
"/Products.:format"
/Products.json
/Products.xml
"/Products.:format?"
/Products.json
/Products.xml
/Produkte
"/User/:id.:format?"
/Benutzer/12
/user/12.json
Zum Beispiel können wir Post verwenden, um JSON -Daten zu senden und Bodyparser, eine Middleware, mit der JSON -Anforderungsinhalte (oder andere Inhalte) analysiert werden kann, um die Daten zurückzugeben und das Rückgabeergebnis in Req.body zu speichern:
Die Codekopie lautet wie folgt:
var express = require ('express')
, app = express.createServer ();
app.use (express.bodyparser ());
app.post ('/', function (req, res) {
res.Send (req.body);
});
App.Listen (3000);
Normalerweise können wir einen "Narr" -Stil-Platzhalter wie Benutzer verwenden/: id, ohne (Namen) Einschränkungen. Wenn wir beispielsweise die Benutzer-ID nur als Nummer einschränken möchten, können wir /Benutzer /: ID ([0-9]+) verwenden, was nur dann wirksam wird, wenn der Platzhalter mindestens eine Nummer (Anpassung, Übereinstimmung) enthält.
8. Routenkontrolle
Wir können die nächste angepasste Route steuern, indem wir den dritten Parameter als NEXT () -Funktion aufrufen. Wenn die Anpassung nicht gefunden wird, wird die Steuerung in die Verbindung zurückgegeben, und die Middleware wird in der in Use () hinzugefügten Reihenfolge () nacheinander aufgerufen. Das Prinzip gilt auch für mehrere Routen, die auf demselben Pfad definiert sind, und sie werden wiederum aufgerufen, bis einer von ihnen nicht als Nächstes anruft () und beschließt, eine Anfrage zu reagieren.
Die Codekopie lautet wie folgt:
app.get ('/user/: id?', function (req, res, next) {
var id = req.params.id;
if (id) {
// etwas mach
} anders {
nächste();
}
});
app.get ('/user', function (req, res) {
// etwas anderes mach
});
Die Methode von App.All () kann die gleiche Logik problemlos auf alle HTTP -Aktionen übertragen, indem Sie sie einmal aufrufen. Als nächstes verwenden wir es, um einen Benutzer aus der Pseudo-Daten zu extrahieren und ihn dem Req.User zuzuweisen.
Die Codekopie lautet wie folgt:
var express = require ('express')
, app = express.createServer ();
var user = [{name: 'tj'}];
app.all ('/user/: id/: op?', function (req, res, next) {
req.user = user [req.params.id];
if (req.user) {
nächste();
} anders {
Weiter (neuer Fehler ('Benutzer nicht finden' + req.params.id));
}
});
app.get ('/user/: id', function (req, res) {
res.send ('siehung' + req.user.name);
});
app.get ('/user/: id/edit', function (req, res) {
res.send ('bearbeitet' + req.user.name);
});
app.put ('/user/: id', function (req, res) {
Res.Send ('Aktualisierung' + req.user.name);
});
App.get ('*', Funktion (req, res) {
res.send (404, 'was ???');
});
App.Listen (3000);
9. Middleware
Die verwendete Connect Middleware (Eigenschaften) wird normalerweise von einem regulären Connect -Server begleitet, der an Express.CreateServer () übergeben wird. wie:
Die Codekopie lautet wie folgt:
var express = require ('express');
var app = express.createserver (
Express.logger ()
, express.bodyparser ()
);
Darüber hinaus können wir im Configure () -Block - diesen progressiven Palast (Übersetzer Anmerkung: Lachen ^^, progressiv) auch bequem verwenden, um Middleware hinzuzufügen.
Die Codekopie lautet wie folgt:
app.use (express.logger ({format: ': methode: url'}));
Normalerweise verwenden Sie mit der von Ihnen möglicherweise verwendeten Verbindung von Middleware ('Connect') wie folgt:
Die Codekopie lautet wie folgt:
var connect = require ('connect');
app.use (connect.logger ());
app.use (connect.bodyparser ());
Dies ist bis zu einem gewissen Grad etwas unangenehm. Express exportiert also diese Middleware-Eigenschaften, obwohl sie gleich sind:
Die Codekopie lautet wie folgt:
app.use (express.logger ());
app.use (express.bodyparser ());
Die Reihenfolge der Middleware ist sehr wichtig. Wenn Connect eine Anforderung empfängt, wird die erste Middleware, die wir an createServer () oder use () übergeben haben, von drei Parametern, Anforderung, Antwort und einer Rückruffunktion (normalerweise als nächstes) begleitet. Als nächstes () wird aufgerufen, wird es die zweite Middleware -Wendung sein und so weiter. Dies ist erwähnenswert, weil viele Middlewares voneinander abhängen. Beispielsweise wechselt MethodeOverride () die REQ.Body -Methode zum Erkennen von HTTP -Methodenüberladungen. Andererseits analysiert Bodyparser () den angeforderten Inhalt und speichert ihn in Req.body. Ein weiteres Beispiel ist Cookie Parsing und Sitzungsunterstützung. Wir müssen zuerst () cookieper () und dann Session () verwenden.
Viele ausdrückliche Anwendungen umfassen eine solche App.use (App.router), die etwas seltsam erscheinen mag. Tatsächlich handelt es sich nur um eine Middleware -Funktion, die alle definierten Routing -Regeln enthält und Routing -Suchvorgänge basierend auf vorhandenen URL -Anforderungen und HTTP -Methoden ausführt. Mit Express können Sie seine Position entscheiden, aber standardmäßig wird es unten platziert. Durch Ändern des Standorts der Route können wir die Priorität der Middleware ändern. Zum Beispiel möchten wir den Fehlerbericht als letzte Middleware verwenden, damit jede Ausnahme, die an nächstes () übergeben wird, über ihn abgewickelt werden kann. Oder wir möchten, dass der statische Dateiservice eine geringere Priorität hat, damit unsere Route nach Downloads einer einzelnen statischen Dateianforderung usw. anhören kann. Dies sieht so aus:
Die Codekopie lautet wie folgt:
app.use (express.logger (...));
app.use (express.bodyparser (...));
app.use (express.cookieperarser (...));
app.use (Express.Session (...));
app.use (App.router);
app.use (express.static (...));
app.use (express.ErrorHandler (...));
Zuerst fügen wir Logger () hinzu, die die REQ.end () -Methode des Knotens enthalten können und Daten zu unserer Antwortzeit bereitstellen. Der Inhalt der Anfrage wird analysiert (falls es Daten gibt), gefolgt von Cookie -Lösung und Sitzungsunterstützung. Gleichzeitig wird die Requenz definiert, wenn die Route in App.router ausgelöst wird. Zu diesem Zeitpunkt rufen wir als Next () nicht an, sodass die statische () Middleware nichts über diese Anfrage weiß. Wenn die folgende Route definiert wurde, können wir verschiedene Zustände aufzeichnen, Downloads verweigern und Downloadpunkte usw. konsumieren.
Die Codekopie lautet wie folgt:
var downloads = {};
app.use (App.router);
app.use (express.static (__ DirName + '/public'));
app.get ('/*', Funktion (req, res, next) {
var file = req.params [0];
Downloads [Datei] = Downloads [Datei] || 0;
Downloads [Datei] ++;
nächste();
});
10. Routing Middleware
Routing kann Router Middleware verwenden, um mehr als eine Rückruffunktion (oder ein Array) in seine Methoden zu übergeben. Diese Funktion ist sehr vorteilhaft, um den Zugriff einzuschränken, Daten durch Routing herunterzuladen und so weiter.
Normalerweise können asynchrone Datenabruf wie das folgende Beispiel aussehen. Wir verwenden den Parameter: ID und versuchen, einen Benutzer zu laden:
Die Codekopie lautet wie folgt:
app.get ('/user/: id', function (req, res, next) {
loadUser (req.params.id, function (err, user) {
wenn (err) als nächstes zurückgeben (err);
res.send ('user' + user.name);
});
});
Um trockene Prinzipien zu gewährleisten und die Lesbarkeit zu verbessern, können wir diese Logik auf eine Middleware anwenden. Wie unten gezeigt, können Sie diese Logik in die Middleware wiederverwenden und gleichzeitig die Einfachheit unseres Routings sicherstellen.
Die Codekopie lautet wie folgt:
Funktion loadUser (req, res, next) {
// Sie würden Ihren Benutzer aus der DB holen
var user = user [req.params.id];
if (Benutzer) {
Req.User = Benutzer;
nächste();
} anders {
Weiter (neuer Fehler ('nicht geladener Benutzer' + req.params.id));
}
}
app.get ('/user/: id', loadUser, function (req, res) {
res.send ('Benutzer anzeigen' + req.user.name);
});
Multiple Routing kann in eine tiefere Logikebene in der Reihenfolge angewendet werden, z. B. die Einschränkung des Zugriffs auf ein Benutzerkonto. Das folgende Beispiel ermöglicht es Benutzern, die die Authentifizierung übergeben haben, um ihre (ihr) Konten zu bearbeiten.
Die Codekopie lautet wie folgt:
Funktion andrestrictTOSelf (req, res, next) {
req.authenticatedUser.id == req.user.id
? nächste()
: Weiter (neuer Fehler ('nicht autorisiert');
}
app.get ('/user/: id/edit', loadUser, andrestrictTOSelf, Funktion (req, res) {
Res.Send ('Benutzierende bearbeiten' + req.user.name);
});
Denken Sie immer daran, dass Routing nur eine einfache Funktion ist. Wie unten gezeigt, können wir Funktionen definieren, die Middleware zurückgeben, um eine ausdrucksstarkere und flexiblere Lösung zu erstellen.
Die Codekopie lautet wie folgt:
Funktion andrestrictto (Rolle) {
Rückgabefunktion (req, res, next) {
req.authenticatedUser.role == Rolle
? nächste()
: Weiter (neuer Fehler ('nicht autorisiert');
}
}
app.del ('/user/: id', lastuser, andrestrictto ('admin'), Funktion (req, res) {
Res.Send ('gelöschter Benutzer' + req.user.name);
});
Der häufig verwendete Middleware "Stack" kann durch ein Array geleitet werden (das rekursiv angewendet wird), das in jedem Maße gemischt und abgestimmt werden kann.
Die Codekopie lautet wie folgt:
var a = [Middleware1, Middleware2]
, B = [Middleware3, Middleware4]
, alle = [a, b];
app.get ('/foo', a, function () {});
app.get ('/bar', a, function () {});
App.get ('/', A, Middleware3, Middleware4, Function () {});
app.get ('/', a, b, function () {});
app.get ('/', alle, function () {});
Für den vollständigen Code dieser Instanz finden Sie im Route Middleware -Beispiel -Repository.
Möglicherweise haben wir mehrmals, um die verbleibende Routing Middleware zu "überspringen" und nachfolgenden Routen weiterhin zu entsprechen. Dazu müssen wir nur als nächstes () mit der Route 'String - Next (' Route ') anrufen. Wenn keine verbleibenden Routen mit der angeforderten URL übereinstimmen, wird Express 404 nicht gefunden.
11. HTTP -Methode
Bisher bin ich mehrmals App.get () ausgesetzt. Darüber hinaus stellt Express auch andere gemeinsame HTTP -Aktionen wie app.post (), app.del () usw. bereit, usw.
Ein häufiges Beispiel für die Postnutzung ist die Einreichung eines Formulars. Als nächstes setzen wir einfach das Methodenattribut des Formulars so auf HTML, und die Steuerung wird der unten definierten Route zugeordnet.
Die Codekopie lautet wie folgt:
<form method = "post" action = "/">
<Eingabe type = "text" name = "user [name]" />
<Eingabe type = "text" name = "user [E -Mail]" />
<input type = "suruging" value = "sureichen" />
</form>
Standardmäßig weiß Express nicht, wie der Inhalt dieser Anfrage umgegangen wird. Daher müssen wir die BodyParser Middleware hinzufügen, die den Inhalt der Anwendung/x-www-form-reinigiert und application/jSON-Anforderungen annimmt und die Variablen in Req.body speichert. Wir können diese Middleware wie das folgende Beispiel verwenden:
Die Codekopie lautet wie folgt:
app.use (express.bodyparser ());
Wie folgt, hat unsere Route Zugriff auf das Objekt von Req.Body.User, und wenn Name und E -Mail definiert sind, enthält sie diese beiden Eigenschaften (Übersetzung Hinweis: Wenn der vom Formular gesendete Inhalt nicht leer ist).
Die Codekopie lautet wie folgt:
app.post ('/', function (req, res) {
console.log (req.body.user);
res.Redirect ('zurück');
});
Wenn Sie eine Methode wie ein Formular verwenden möchten, können wir eine versteckte Eingabe namens _method verwenden, mit der HTTP -Methoden geändert werden können. Dazu benötigen wir zunächst die MethodeOverride Middleware, die nach Bodyparser erscheinen muss, um den in seinem Req.body enthaltenen Formular zu verwenden.
Die Codekopie lautet wie folgt:
app.use (express.bodyparser ());
app.use (Express.Methodoverride ());
Warum sind diese Methoden nicht im Besitz von Standard? Einfach ausgedrückt, es liegt nur daran, dass es für die vollständige Funktionalität, die von Express erforderlich ist, nicht notwendig ist. Die Verwendung von Methoden hängt von Ihrer Anwendung ab, Sie benötigen sie möglicherweise nicht, und der Kunde kann weiterhin Methoden wie Put und Löschen verwenden, und Sie können sie direkt verwenden, da MethodeOverride eine sehr gute Lösung für das Formular bietet. Hier ist eine Demonstration, wie man Put verwendet, was aussehen kann:
Die Codekopie lautet wie folgt:
<form method = "post" action = "/">
<Eingabe type = "Hidden" name = "_ method" value = "put" />
<Eingabe type = "text" name = "user [name]" />
<Eingabe type = "text" name = "user [E -Mail]" />
<input type = "suruging" value = "sureichen" />
</form>
app.put ('/', function () {
console.log (req.body.user);
res.Redirect ('zurück');
});
12. Fehlerbehandlung
Express stellt die app.Error () -Methode bereit, so dass die empfangene Ausnahme in eine Route geworfen oder an als nächstes übergeben wird (ERR). Im folgenden Beispiel werden verschiedene Seiten auf der Grundlage einer bestimmten Notausnahme behandelt:
Die Codekopie lautet wie folgt:
Funktion NotFound (msg) {
this.name = 'NotFound';
Error.call (this, msg);
Error.capturestacktrace (this, Argumente.Callee);
}
NotFound.Prototyp .__ proto__ = error.prototyp;
app.get ('/404', Funktion (req, res) {
Neue Notfunde werfen;
});
app.get ('/500', Funktion (req, res) {
Neuen Fehler werfen ('Tastaturkatze!');
});
Wie nachstehend beschrieben, können wir App.Error () mehrmals aufrufen. Hier erkennen wir die Notfund -Instanz und zeigen eine 404 -Seite an oder übergeben an den nächsten Fehlerhandler. Es ist erwähnenswert, dass diese Prozessoren überall definiert werden können, da sie beim Hören unter den Routing -Prozessor platziert werden. Es ermöglicht Definitionen im Block configure (), damit wir auf der Umgebung unterschiedliche Ausnahmebehandlungsmethoden verwenden können.
Die Codekopie lautet wie folgt:
App.Error (Funktion (Err, Req, Res, Weiter) {
if (Errinstance von NotFound) {
res.render ('404.jade');
} anders {
Weiter (arr);
}
});
Für die Einfachheit nehmen wir hier an, dass alle Fehler dieser Demo 500 betragen, und natürlich können Sie auswählen, was Sie mögen. Wenn Sie Systemaufrufe an ein Dateisystem wie Knoten ausführen, erhalten Sie möglicherweise einen Fehler. Code mit Enoent, was bedeutet, dass "es keine solche Datei oder Verzeichnis gibt", die wir im Fehlerhandler verwenden oder bei Bedarf eine angegebene Seite anzeigen können.
Die Codekopie lautet wie folgt:
App.Error (Funktion (Err, Req, res) {
res.render ('500.jade', {
Fehler: ähm
});
});
Unsere App kann auch die Fehlerhandler -Middleware von Connect verwenden, um Ausnahmen zu melden. Wenn wir beispielsweise eine Stderr -Ausnahme in der "Entwicklungs" -Enumgebung ausgeben möchten, können wir verwenden:
Die Codekopie lautet wie folgt:
app.use (express.ErrorHandler ({DumpExceptions: true}));
Gleichzeitig müssen wir während der Entwicklungsstufe die Ausnahmen, die wir übergeben und die schicke HTML -Seite geben, für die wir den Showstack auf True setzen können.
Die Codekopie lautet wie folgt:
app.use (express.ErrorHandler ({showStack: true, DumpExceptions: true}));
Die Fehlerhandler -Middleware kann auch JSON zurückgeben, wenn dies akzeptiert wird: Anwendung/JSON existiert, was sehr nützlich ist, um Anwendungen zu entwickeln, die stark auf Client JavaScript beruhen.
13. Routenparametervorverarbeitung
Die Vorverarbeitung von Routing -Parametern durch implizite Datenbelastung und Anfrage kann die Lesbarkeit Ihres Programms erheblich verbessern. Beispielsweise müssen Sie normalerweise kontinuierlich grundlegende Daten aus mehreren Routen erhalten. Wenn Sie beispielsweise einen Benutzer mit /Benutzer /: ID laden, können wir dies tun:
Die Codekopie lautet wie folgt:
app.get ('/user/: userId', function (req, res, next) {
User.get (req.params.userid, function (err, user) {
wenn (err) als nächstes zurückgeben (err);
res.send ('user' + user.name);
});
});
Durch die Vorverarbeitung können unsere Parameter auf Rückrufe abgebildet werden, die Validierung, Steuerung und sogar Laden von Daten aus der Datenbank durchführen. Wie folgt rufen wir App.Param () mit Parameternamen auf und hoffen, es einer Middleware zuordnen. Wie Sie sehen können, akzeptieren wir den ID -Parameter, der den Platzhalterwert darstellt. Wenn wir dies verwenden, laden wir den Benutzer wie gewohnt und verarbeiten den Fehler und rufen einfach als nächstes () an, um die Kontrolle über den nächsten Präprozessor oder den Routing -Prozessor zu übergeben.
Die Codekopie lautet wie folgt:
app.param ('userId', function (req, res, Weiter, id) {
User.get (id, Funktion (err, user) {
wenn (err) als nächstes zurückgeben (err);
if (! user) zurückgeben
Req.User = Benutzer;
nächste();
});
});
Sobald dies erledigt ist, verbessert das oben genannte die Lesbarkeit der Route erheblich und ermöglicht es uns, die Logik während des gesamten Programms problemlos zu teilen:
Die Codekopie lautet wie folgt:
app.get ('/user/: userId', function (req, res) {
res.send ('user' + req.user.name);
});
14. Verarbeitung anzeigen
Die Ansichtsdatei verwendet das Format <Name>. <COMER>, wobei <Motor> der Name des erforderlichen Moduls ist. Beispielsweise fordert Layout.ejs das Ansichtssystem an, ('EJS') zu erfordern, und das geladene Modul muss die Methode von Exporte.Compile (STR, Optionen) exportieren und eine Funktion zurückgeben, um sich an Express anzupassen. App.register () kann verwendet werden, um dieses Standardverhalten so zu ändern, dass Dateierweiterungen auf bestimmte Motoren abgebildet werden. Zum Beispiel kann "foo.html" von EJs verarbeitet werden.
Das folgende Beispiel verwendet JADE, um index.html zu verarbeiten. Da wir Layout nicht verwenden: Falsch, wird der von index.jade verarbeitete Inhalt in eine lokale Variable übergeben, die als Körper in Layout.jade bezeichnet wird.
Die Codekopie lautet wie folgt:
app.get ('/', Funktion (req, res) {
res.render ('index.jade', {title: 'my site'});
});
Mit der Einstellung der neuen Ansichtsmotor können wir die Standard -Vorlage -Engine angeben. Wenn wir beispielsweise JADE verwenden, können Sie sie so festlegen:
Die Codekopie lautet wie folgt:
app.set ('Ansicht Engine', 'Jade');
Erlauben Sie uns, dies umzugehen:
Die Codekopie lautet wie folgt:
Res.Render ('Index');
Entsprechend:
Die Codekopie lautet wie folgt:
res.render ('index.jade');
Wenn die Ansichtsmotor eingestellt ist, ist die Verlängerung optional, aber wir können trotzdem die passende Vorlagemotor mischen:
Die Codekopie lautet wie folgt:
res.render ('Another Page.ejs');
Express bietet auch Ansichtsoptioneneinstellungen an, die jedes Mal, wenn sie wiedergegeben wird, auf eine Ansicht angewendet werden, wenn Sie keine Layouts verwenden möchten:
Die Codekopie lautet wie folgt:
app.set ('Optionen anzeigen', {
Layout: Falsch
});
Dies kann bei Bedarf innerhalb des res.render () -Verrufs überladen werden:
Die Codekopie lautet wie folgt:
res.render ('myview.ejs', {layout: true});
Wenn ein Layout geändert werden muss, müssen wir normalerweise einen anderen Pfad angeben. Wenn wir beispielsweise die Ansichtsmotor auf JADE gesetzt haben und die Datei namens/views/mylayout.jade heißt, können wir einfach die Parameter übergeben:
Die Codekopie lautet wie folgt:
res.render ('page', {layout: 'mylayout'});
Andernfalls (Anmerkung des Übersetzers: Wenn Ansichtsmotor nicht auf Jade oder einen anderen Motor gesetzt ist) müssen wir eine Erweiterung angeben:
Die Codekopie lautet wie folgt:
res.render ('page', {layout: 'mylayout.jade'});
Sie können auch absolute Pfade sein:
Die Codekopie lautet wie folgt:
res.render ('page', {layout: __dirname + '/../../mylayout.jade'});
Es gibt ein gutes Beispiel dafür - passen Sie die Start- und Schließen von EJs an:
Die Codekopie lautet wie folgt:
app.set ('Optionen anzeigen', {
offen: '{{',
schließen: '}}'
})
15. Teile anzeigen
Das Sichtsystem von Express bietet eine integrierte Unterstützung für Teile und Sammlungen, was dem Ersetzen eines Dokumentfragments durch eine "Mini" -Ansicht entspricht. Beispiel: In einer Ansicht, um Kommentare anzuzeigen, können wir den Teilsatz verwenden:
Die Codekopie lautet wie folgt:
partial ('Kommentar', {Sammlung: Kommentare});
Wenn keine anderen Optionen oder lokalen Variablen benötigt werden, können wir das gesamte Objekt weglassen und es einfach in ein Array übergeben, was dem oben genannten entspricht:
Die Codekopie lautet wie folgt:
partiell ('Kommentar', Kommentare);
In der Verwendung bietet der Komponentensatz kostenlos lokale Variablen "magische" Unterstützung für lokale Variablen:
1.Firstincollection wahr, wenn es das erste Objekt ist
2. Indexincollektion im Sammelobjekt
3. Lastincollection wahr, wenn es das letzte Objekt ist
4. CollectionLegth Länge des Sammelobjekts
Die Übertragung (Erzeugung) lokaler Variablen hat eine höhere Priorität. Gleichzeitig sind lokale Variablen, die an die Elternansicht übergeben werden, auch für Kinder geeignet. Wenn wir beispielsweise partielle ("Blog/Post", Post) verwenden, um einen Blog -Beitrag zu rendern, wird eine lokale Post -Variable generiert. In der Ansicht, die diese Funktion aufruft, gibt es einen lokalen variablen Benutzer, der auch für Blog/Post gültig ist. (Anmerkung des Übersetzers: Hier ähnelt teilweise eher der Include -Methode in PHP).
HINWEIS: Verwenden Sie die Teilesammlung sorgfältig und rendern Sie eine Reihe von Teilensammlungen mit Länge 100 entsprechen 100 Ansichten, die wir verarbeiten müssen. Bei einfachen Sammlungen ist es am besten, den integrierten integrierten, anstatt einen Komponentensammler zu verwenden, um übermäßigen Overhead zu vermeiden.
16. Suche anzeigen
Die Ansichtssuche wird relativ zur übergeordneten Ansicht (Pfad) ausgeführt. Wenn wir eine Ansichtsseite namens Views/user/list.jade und partiell ('bearbeiten') haben, wird versucht, Ansichten zu laden/user/edit.jade, und partiell ('../ Message') laden Ansichten/Nachrichten.jade.
Das Ansichtssystem unterstützt auch die Vorlagenindizierung und ermöglicht es Ihnen, ein Verzeichnis mit demselben Namen wie der Ansicht zu verwenden. In einer Route erhält res.render ('user') beispielsweise Nicht-Views/Users.jade, dh Ansichten/Benutzer/Index.jade. (Anmerkung des Übersetzers: Behandeln Sie zunächst die Situation von <Path>.
Bei Verwendung des obigen Ansichtsindex verwenden wir Partial ('Benutzer'), um sich auf Ansichten/Benutzer/Index.jade im selben Verzeichnis wie die Ansicht zu verweisen. Gleichzeitig versucht das Ansichtssystem zu indexieren ../ Benutzer/Index, ohne dass wir Partial ('Benutzer') anrufen.
17. Vorlagenmotoren
Im Folgenden sind die am häufigsten verwendeten Vorlagenmotoren für Express:
1.Haml: HAML -Implementierung
2.JADE: Haml.js Nachfolger
3.EJS: Embedded JavaScript
4.Coffeekup: CoffeeScript-basierte Vorlage
5.JQuery Vorlagen
18. Sitzung
Der Sitzungsunterstützung kann mithilfe von Session Middleware von Connect erhalten werden. Aus diesem Grund müssen wir es normalerweise mit der Cookieper Middleware vorbereiten, die Cookie -Daten in Req.cookies analysiert und speichert.
Die Codekopie lautet wie folgt:
app.use (express.cookieperarser ());
app.use (Express.Session ({Secret: "Keyboard Cat"}));
Standardmäßig verwendet die Sitzung Middleware von Connect in den integrierten Speicherspeicher, aber es gibt viele andere Implementierungen. Zum Beispiel bietet Connect-Redis einen Redis-Sitzungsspeicher, der wie folgt verwendet werden kann:
Die Codekopie lautet wie folgt:
var RedisStore = Request ('Connect-redis') (Express);
app.use (express.cookieperarser ());
app.use (Express.Session ({Secret: "Keyboard Cat", Store: New RedisStore}));
Zu diesem Zeitpunkt werden die Eigenschaften von Reque und ResionSessionStore von allen Routen und nachfolgenden Middleware verwendet. Alle Eigenschaften zur Requenz werden automatisch in einer Antwort gespeichert, beispielsweise wenn wir den Einkaufswagen Daten hinzufügen möchten:
Die Codekopie lautet wie folgt:
var RedisStore = Request ('Connect-redis') (Express);
app.use (express.bodyparser ());
app.use (express.cookieperarser ());
app.use (Express.Session ({Secret: "Keyboard Cat", Store: New RedisStore}));
app.post ('/add-to cart', function (req, res) {
// Wir können mehrere Elemente über ein Formular veröffentlichen
// (in einigen Fällen wird Bodyparser () Middleware verwendet)
var items = req.body.items;
req.Session.items = items;
res.Redirect ('zurück');
});
app.get ('/add-to-cart', Funktion (req, res) {
// Bei der Rückkehr die Seite Get /Add-to-Cart
// Wir können req.session.items && req.session.items.length überprüfen
// die Eingabeaufforderung drucken
if (req.session.items && req.session.items.length) {
Req.notify ('Info', 'Sie haben %s Artikel in Ihrem Warenkorb', req.Session.items.length);
}
res.render ('Einkaufsbetrieb');
});
Für die Requenz von Requenz enthält es auch Methoden wie Sitzung#touch (), Sitzung#zerstören (), Sitzung#regenerate () usw., um Sitzungen aufrechtzuerhalten und zu betreiben. Weitere Informationen finden Sie in der Dokumentation von Connect -Sitzungen.
19. Upgrade Guide
Für Studenten, die Express 1.x verwenden, haben Sie, wenn Sie wichtige Programme haben, die auf 2.x aktualisiert werden müssen, um eine bessere Unterstützung zu erhalten