2013-07-19 19 views
12

Diese Frage erweitert, dass die What is Node.js' Connect, Express and "middleware"?Middleware-Entwurfsmuster in Node.js: Verbinden

Ich werde den Weg des Lernens Javascript -> Node.js -> Connect -> Express -> ..., um Erfahren Sie mehr über die Verwendung eines modernen Web-Entwicklungs-Stacks. Ich habe einen Hintergrund in Netzwerken mit niedriger Schicht, also war es einfach, mit den Modulen net und http von Node.js aufzustehen. Das allgemeine Muster der Verwendung eines Servers zum Weiterleiten von Anforderungen an unterschiedliche Handler schien natürlich und intuitiv.

Umzug nach Connect, ich fürchte, ich verstehe das Paradigma und den allgemeinen Datenfluss dieser "Middleware" nicht. Zum Beispiel, wenn ich eine Middleware zur Verwendung mit Connect ala erstelle;

// example.js  
module.exports = function (opts) { 
    // ... 
    return function(req, res, next) { 
     // ... 
     next(); 
    }; 
}; 

und "Verwendung" in Verbindung über

var example = require('./example'); 
// ... 
var server = connect.createServer(); 
// ... 
server.use(example(some_paramater)); 

Ich weiß nicht, wann meine Middleware aufgerufen wird. Außerdem, wenn ich andere Middleware bin, kann ich in der Reihenfolge garantiert werden, in der die Middleware aufgerufen wird? Furthermore, ich bin unter der Annahme, dass die Funktion next() verwendet wird, um die nächste (wieder, wie stelle ich eine Bestellung?) Middleware; Es werden jedoch keine Parameter (req, res, next) übergeben. Werden diese Parameter irgendwie implizit übergeben?

Ich vermute , dass die Sammlung von Middleware-Module aneinandergereiht wird, mit dem Rückruf http Start -> daher eine Reihe von Funktionen in der Callback-Mitte der ursprünglichen Anfrage hinzugefügt und der Server eine Antwort endet .

Ich versuche, das Middleware-Paradigma zu verstehen, und den Fluss der Information/Ausführung.

Jede Hilfe wird sehr geschätzt. Vielen Dank für das Lesen

Antwort

11

Die Middleware wird als Funktionskette bezeichnet, wobei die Reihenfolge auf Middleware-Definitionsreihenfolge (Zeit) mit passenden Routen (falls zutreffend) basiert.
Unter Berücksichtigung, dass req und res Objekte durch die Kette reisen, so dass Sie Daten in ihnen entlang der Kette wiederverwerten/verbessern/modifizieren können.

Es gibt zwei allgemeine Anwendungsfälle für Middleware: generic und spezifischen.

Generisch ist, wie Sie im obigen Beispiel definiert haben: app.use, es wird für jede einzelne Anfrage gelten. Jede Middleware muss innerhalb next() anrufen, wenn sie mit der nächsten Middleware fortfahren möchte.

Wenn Sie app.get('/path', function(... verwenden, ist diese eigentliche Funktion auch Middleware, nur inline definiert. So ist es eine Art vollständig auf Middlewares basiert, und es gibt keine endware: D

Die Kettenreihenfolge basiert auf Definition Reihenfolge. Daher ist es wichtig, Middleware auf synchrone Art und Weise oder in einer asynchronen Reihenfolge zu definieren. Andernfalls kann eine andere Reihenfolge der Middleware die Logik unterbrechen, wenn die Kette der Middleware voneinander abhängt.

Einige Middleware kann verwendet werden, um die Kette return next(new Error()); zu brechen.Es ist zum Beispiel für die Validierung oder Authentifizierung Middleware nützlich.
Ein weiteres nützliches Anwendungsmuster für Middleware ist die Verarbeitung und Analyse von Anforderungsdaten, wie Cookies, oder ein gutes Beispiel für eine solche app.use(express.bodyParser());.

+0

Also, wenn ich hatte 'var A = erfordern ('./ A'), B = erfordern ('./ B'); app.use (A()); app.use (B()); 'dann würde' A' vor 'B' stehen, mit' A's 'nächstem' Aufruf' B'? Werden die Parameter dann implizit übergeben? Sonst wie würde 'B' auf' req, res, ect' zugreifen? – gone

+0

Genau. 'req'- und' res'-Objekte wandern durch und sind das gleiche Objekt in der gesamten Kette. Auf diese Weise könnten Sie einige Daten darin speichern und sie später in einer anderen Middleware entlang der Kette wiederverwenden. Genau das passiert mit den meisten Ihrer Daten in 'req'. Zum Beispiel werden POST-Bodydaten standardmäßig nicht geparst und 'express.bodyParser()' Middleware wird es parsen, und Sie haben später Zugriff darauf. – moka

+0

Cool! Danke für die Antwort! – gone

Verwandte Themen