Modular Routing
Stellen Sie sich folgendes Szenario vor: Sie besitzen einen Laden, der Haustiere verkauft, und ein Kunde möchte bei Ihnen Kaninchen und Katzen kaufen.
Wenn Sie die oben definierten grundlegenden Routing-Methoden verwenden, sieht der Code wie folgt aus:
Beachten Sie, dass wir dieselben Routen mehrfach geschrieben haben.
Das ständige Schreiben der Routen erhöht jedoch die Redundanz und die Tippfehler. Außerdem ist es hilfreich, unseren Code modularer zu gestalten, wie es sich gehört.
Als Programmierer möchte man seinen Code immer sauberer aussehen lassen. Um den obigen Code leichter lesbar zu machen, können wir zwei Methoden verwenden.
Verwendung von app.route
Hier kommt app.route
ins Spiel. Sie schreiben den Pfad einmal, und Sie können mehrere Route-Handler verketten.
Sie können app.route
wie folgt implementieren:
app.route(PATH)
.get(callback)
.post(callback)
//can add more HTTP requests (.put, .delete, etc)
Wir können nun den Code umschreiben:
Der Code sieht sauberer aus, und Sie mussten die Route für jede HTTP-Anfrage nur einmal eingeben.
Einen weiteren Haken gibt es allerdings: Der Parameter username
existiert in allen Routen. Immer wieder username
zu tippen, begünstigt immer noch Tippfehler und Redundanzen. Wie wäre es, wenn wir es noch modularer machen könnten?
express.Router()
Wir können express.Router()
verwenden, um modulare, einbaufähige Routen-Handler zu erstellen. Eine Router
-Instanz ist ein komplettes Middleware- und Routing-System, weshalb sie oft als „Mini-App“ bezeichnet wird.
Wir müssen nur den Startpunkt angeben, und die Router
-Instanz erledigt den Rest für uns.
Um app.Router()
zu verwenden, müssen wir ein separates Modul erstellen, eine Instanz von app.Router
instanziieren und dann module.exports
zum Exportieren der Instanz verwenden.
Weitere Details zur Verwendung von module.exports
finden Sie in meinem vorherigen Artikel.
In diesem Beispiel werden wir nur einen einfachen Pfad behandeln, der die Parameter username
und id
enthalten würde.
In routerExample.js
:
Wir verwenden router.route()
, das ähnlich ist wie app.route
. Das definierte Modul sagt: „Solange der Pfad mit /:username/:id
endet, führen Sie den folgenden Code wie definiert aus.“
Um ihn zu verwenden, verwenden Sie ein anderes Modul, main.js
:
Wie in den Kommentaren zu lesen ist, verwenden wir app.use
, um routeExample.js
anzuweisen, die Funktionen auszuführen, deren Routen mit dem ersten Parameter beginnen. Der erste Parameter kann als Startpunkt bezeichnet werden. Daher wird der Pfad starting point + PATH defined by router
lauten.
Zum Beispiel werden wir nun gemäß Zeile 6 GET- und POST-Anfragen behandeln, die mit ‘/cats’
beginnen. Sie werden den Pfad cats/:username/:id
haben.
Wie immer können Sie im Modul routeExample
verschiedene Routen verwenden, aber das einzige, was Sie angeben müssen, ist der Startpunkt in app.use
.
Um den Code auszuführen, geben Sie node main
in einem Terminalfenster ein und verwenden cURL
entsprechend in einem anderen Fenster.
Unterschiedliche Routen im express.Router mit Middleware
In diesem Beispiel navigieren wir auf die Birds-Homepage unseres Zoofachgeschäfts und definieren eine Middleware-Funktion, timeLog
, die den Zeitpunkt der jeweiligen Pfadanforderung ausgibt.
birds.js
:
In main.js
:
var birds = require('./birds')
app.use('/birds', birds) //handle /birds and /birds/about
Mit dem node
-Befehl wird der Code ausgeführt, dann mit cURL
wie folgt:
Damit, ist es in express.Router
möglich, Middleware-Funktionen nur in bestimmten Pfaden auszuführen.