Modulaire Routing
Stel je dit scenario voor: Je hebt een winkel die huisdieren verkoopt, en een klant wil konijnen en katten bij je kopen.
Als u de basisroutingmethoden gebruikt die hierboven zijn gedefinieerd, ziet de code er als volgt uit:
Merk op dat we dezelfde routes meerdere keren hebben geschreven.
Hoewel het steeds opnieuw schrijven van de routes de redundantie en typefouten vergroot. Verder is het handig om onze code meer modulair te maken, want dat is een goede gewoonte.
Als programmeur wil je altijd dat je code er schoner uitziet. Om de bovenstaande code leesbaarder te maken, kunnen we twee methoden gebruiken.
Gebruik app.route
Dit is waar app.route
in het spel komt. U schrijft het pad één keer, en u kunt meerdere route handlers aan elkaar rijgen.
U kunt app.route
als volgt implementeren:
app.route(PATH)
.get(callback)
.post(callback)
//can add more HTTP requests (.put, .delete, etc)
We kunnen nu de code herschrijven :
De code ziet er schoner uit, en u hoefde de route voor elk HTTP-verzoek maar één keer in te voeren.
Er is echter nog een caveat: de parameter username
bestaat in alle routes. Het steeds opnieuw typen van username
moedigt nog steeds typefouten en redundanties aan. Wat als we het nog modulairder konden maken?
express.Router()
We kunnen express.Router()
gebruiken om modulaire, monteerbare route handlers te maken. Een Router
instance is een compleet middleware- en routingsysteem, daarom wordt het vaak een “mini-app” genoemd.”
We hoeven alleen het startpunt op te geven, en de Router
instance doet de rest voor ons.
Om app.Router()
te gebruiken, moeten we een aparte module maken, een instantie van app.Router
instantiëren, en dan module.exports
gebruiken om de instantie te exporteren.
Voor meer details over het gebruik van module.exports
, zie mijn vorige artikel.
In dit voorbeeld behandelen we alleen een eenvoudig pad dat de username
en id
parameters zou bevatten.
In routerExample.js
:
We gebruiken router.route()
, die vergelijkbaar is met app.route
. De gedefinieerde module zegt: “Zolang het pad zal eindigen met /:username/:id
, voert u de volgende code uit zoals gedefinieerd.”
Om het te gebruiken, gebruik een andere module, main.js
:
Zoals in het commentaar staat, gebruiken we app.use
om routeExample.js
te vertellen de functies uit te voeren die routes hebben die beginnen met de eerste parameter. De eerste parameter kan worden gezien als een startpunt. Daarom zal het pad starting point + PATH defined by router
zijn.
Voorbeeld, volgens regel 6, zullen we nu GET en POST verzoeken afhandelen die beginnen met ‘/cats’
. Ze zullen het pad cats/:username/:id
krijgen.
Zoals altijd kunt u verschillende routes gebruiken in de routeExample
module, maar het enige dat u hoeft op te geven is het startpunt in app.use
.
Om de code uit te voeren, typt u node main
in een terminal venster en gebruikt u cURL
in een ander venster dienovereenkomstig.
Verschillende routes in express.Router met middleware
In dit voorbeeld navigeren we naar de homepage van onze dierenwinkel en definiëren we een middleware-functie, timeLog
, die de tijd weergeeft waarop het betreffende pad is opgevraagd.
birds.js
:
In main.js
:
var birds = require('./birds')
app.use('/birds', birds) //handle /birds and /birds/about
Gebruik het node
commando om de code uit te voeren, gebruik dan cURL
zoals dit:
Dus, is het in express.Router
mogelijk om middleware-functies alleen in specifieke paden uit te voeren.